locomotivemtl / charcoal-admin
The Charcoal Administration Dashboard
Installs: 10 806
Dependents: 15
Suggesters: 2
Security: 0
Stars: 11
Watchers: 12
Forks: 6
Open Issues: 10
pkg:composer/locomotivemtl/charcoal-admin
Requires
- php: ^7.3 || ^8.0
- barryvdh/elfinder-flysystem-driver: ^0.3
- guzzlehttp/guzzle: ^6.0 || ^7.0
- kriswallsmith/assetic: ^1.4
- laminas/laminas-permissions-acl: ^2.8
- locomotivemtl/charcoal-app: ~0.9
- locomotivemtl/charcoal-cache: ~0.1
- locomotivemtl/charcoal-cms: ~0.9
- locomotivemtl/charcoal-core: ~0.6
- locomotivemtl/charcoal-email: ~0.4
- locomotivemtl/charcoal-object: ~0.8
- locomotivemtl/charcoal-translator: ~0.3
- locomotivemtl/charcoal-ui: ~0.3
- locomotivemtl/charcoal-user: ~0.7
- mcaskill/php-html-build-attributes: ^1.0
- paragonie/random_compat: >=2
- psr/cache: ^1.0
- psr/http-message: ^1.0
- psr/log: ^1.0
- studio-42/elfinder: 2.1.61
Requires (Dev)
- league/csv: ^9.5
- mockery/mockery: ^1.0
- mustache/mustache: ^2.11
- php-coveralls/php-coveralls: ^2.2
- phpunit/phpunit: ^9.0
- seld/jsonlint: ^1.8
- squizlabs/php_codesniffer: ^3.5
- tedivm/stash: ~0.16
Suggests
- fabpot/goutte: To use the various crawler-based tools.
- league/csv: To use the exporter (to CSV).
- dev-master / 0.30.x-dev
- 0.30.5
- 0.30.4.1
- 0.30.4
- 0.30.3
- 0.30.2
- 0.30.1
- 0.30.0
- 0.29.3
- 0.29.2
- 0.29.1
- 0.29.0.1
- 0.29.0
- 0.28.2
- 0.28.1
- 0.28.0.1
- 0.28.0
- 0.27.2
- 0.27.1
- 0.27.0
- 0.26.2
- 0.26.1
- 0.26.0
- 0.25.1
- 0.25.0
- 0.24.6
- 0.24.5
- 0.24.4
- 0.24.3.1
- 0.24.3
- 0.24.2.1
- 0.24.2
- 0.24.1.1
- 0.24.1
- 0.24.0
- 0.23.10.1
- 0.23.10
- 0.23.9.1
- 0.23.9
- 0.23.8
- 0.23.7
- 0.23.6
- 0.23.5.3
- 0.23.5.2
- 0.23.5.1
- 0.23.5
- 0.23.4
- 0.23.3
- 0.23.2
- 0.23.1
- 0.23.0
- 0.22.3.1
- 0.22.3
- 0.22.2
- 0.22.1
- 0.22.0.13
- 0.22.0.12
- 0.22.0.11
- 0.22.0.10
- 0.22.0.9
- 0.22.0.8
- 0.22.0.7
- 0.22.0.6
- 0.22.0.5
- 0.22.0.4
- 0.22.0.3
- 0.22.0.2
- 0.22.0.1
- 0.22.0
- 0.21.7.1
- 0.21.7
- 0.21.6
- 0.21.5
- 0.21.4.1
- 0.21.4
- 0.21.3
- 0.21.2
- 0.21.1
- 0.21.0
- 0.20.0
- 0.19.0.1
- 0.19.0
- 0.18.0
- 0.17.3.1
- 0.17.3
- 0.17.2.6
- 0.17.2.5
- 0.17.2.4
- 0.17.2.3
- 0.17.2.2
- 0.17.2.1
- 0.17.2
- 0.17.1
- 0.17.0
- 0.16.7
- 0.16.6
- 0.16.5
- 0.16.4
- 0.16.3
- 0.16.2
- 0.16.1
- 0.16.0.1
- 0.16.0
- 0.15.13
- 0.15.12
- 0.15.11
- 0.15.10
- 0.15.9
- 0.15.8
- 0.15.7
- 0.15.6
- 0.15.5
- 0.15.4.1
- 0.15.4
- 0.15.3
- 0.15.2
- 0.15.1.1
- 0.15.1
- 0.15.0
- 0.14.2
- 0.14.1.1
- 0.14.1
- 0.14.0.1
- 0.14.0
- 0.13.21
- 0.13.20
- 0.13.19
- 0.13.18
- 0.13.17
- 0.13.16
- 0.13.15
- 0.13.14
- 0.13.13
- 0.13.12.1
- 0.13.12
- 0.13.11.2
- 0.13.11.1
- 0.13.11
- 0.13.10
- 0.13.9
- 0.13.8.2
- 0.13.8.1
- 0.13.8
- 0.13.7.8
- 0.13.7.7
- 0.13.7.6
- 0.13.7.5
- 0.13.7.4
- 0.13.7.3
- 0.13.7.2
- 0.13.7.1
- 0.13.7
- 0.13.6
- 0.13.5.1
- 0.13.5
- 0.13.4.3
- 0.13.4.2
- 0.13.4.1
- 0.13.4
- 0.13.3
- 0.13.2.1
- 0.13.2
- 0.13.1.2
- 0.13.1.1
- 0.13.1
- 0.13.0
- 0.12.1
- 0.12.0
- 0.11.3.3
- 0.11.3.2
- 0.11.3.1
- 0.11.3
- 0.11.2.3
- 0.11.2.2
- 0.11.2.1
- 0.11.2
- 0.11.1.2
- 0.11.1.1
- 0.11.1
- 0.11.0.1
- 0.11.0
- 0.10.5
- 0.10.4
- 0.10.3.2
- 0.10.3.1
- 0.10.3
- 0.10.2
- 0.10.1.1
- 0.10.1
- 0.10.0
- 0.9.9
- 0.9.8.3
- 0.9.8.2
- 0.9.8.1
- 0.9.8
- 0.9.7
- 0.9.6
- 0.9.5
- 0.9.4
- 0.9.3.1
- 0.9.3
- 0.9.2.1
- 0.9.2
- 0.9.1
- 0.9
- 0.8.14.1
- 0.8.14
- 0.8.13
- 0.8.12
- 0.8.11
- 0.8.10
- 0.8.9.1
- 0.8.9
- 0.8.8
- 0.8.7
- 0.8.6
- 0.8.5
- 0.8.4
- 0.8.3.1
- 0.8.3
- 0.8.2
- 0.8.1
- 0.8
- 0.7.5
- 0.7.4.5
- 0.7.4.4
- 0.7.4.3
- 0.7.4.2
- 0.7.4.1
- 0.7.4
- 0.7.3.1
- 0.7.3
- 0.7.2
- 0.7.1.5
- 0.7.1.4
- 0.7.1.3
- 0.7.1.2
- 0.7.1.1
- 0.7.1
- 0.7.0
- 0.6.5
- 0.6.4.1
- 0.6.4
- 0.6.3
- 0.6.2.9
- 0.6.2.8
- 0.6.2.7
- 0.6.2.6
- 0.6.2.5
- 0.6.2.4
- 0.6.2.3
- 0.6.2.2
- 0.6.2.1
- 0.6.2
- 0.6.1.2
- 0.6.1.1
- 0.6.1
- 0.6.0.1
- 0.6.0
- 0.5.10
- 0.5.9
- 0.5.8
- 0.5.7
- 0.5.6
- 0.5.5
- 0.5.4.8
- 0.5.4.7
- 0.5.4.6
- 0.5.4.5
- 0.5.4.4
- 0.5.4.3
- 0.5.4.2
- 0.5.4.1
- 0.5.4
- 0.5.3
- 0.5.2.2
- 0.5.2.1
- 0.5.2
- 0.5.1.1
- 0.5.1
- 0.5.0
- 0.4.3
- 0.4.2.3
- 0.4.2.2
- 0.4.2.1
- 0.4.2
- 0.4.1
- 0.4
- 0.3.10
- 0.3.9
- 0.3.8
- 0.3.7.1
- 0.3.7
- 0.3.6.1
- 0.3.6
- 0.3.5.7
- 0.3.5.6
- 0.3.5.5
- 0.3.5.4
- 0.3.5.3
- 0.3.5.2
- 0.3.5.1
- 0.3.5
- 0.3.4
- 0.3.3.1
- 0.3.3
- 0.3.2.1
- 0.3.2
- 0.3.1
- 0.3.0.1
- 0.3
- 0.2.9
- 0.2.8.1
- 0.2.8
- 0.2.7.1
- 0.2.7
- 0.2.6.1
- 0.2.6
- 0.2.5
- 0.2.4
- 0.2.3
- 0.2.2
- 0.2.1.1
- 0.2.1
- 0.2
- 0.1.3.1
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1
- dev-release/0.29
- dev-feature/advanced-search
- dev-feature/reset-password-email-v0.29
- dev-feature/reset-password-email
- dev-feature/delayed-notifications
- dev-mcaskill/improve-map-controllers
- dev-dependabot/npm_and_yarn/http-cache-semantics-4.1.1
- dev-dependabot/npm_and_yarn/tinymce-5.10.7
- dev-dependabot/npm_and_yarn/engine.io-6.2.1
- dev-dependabot/npm_and_yarn/socket.io-parser-4.0.5
- dev-dependabot/npm_and_yarn/xmldom/xmldom-0.7.8
- dev-dependabot/npm_and_yarn/moment-timezone-0.5.37
- dev-develop
- dev-feature/refactor-system-cache
- dev-mcaskill/asset-versioning
- dev-joel/test-grid-stack
- dev-joel/allow-object-form-actions
- dev-feature/camelizePropertiesAndUseArrayAccess
- dev-mcaskill/patch-form-properties
- dev-mcaskill/patch-form-sidebars
- dev-acl-manager-refactor
- dev-release/0.16
- dev-joel/property-condional-logic-parser
- dev-cdn-cache-purge
This package is auto-updated.
Last update: 2025-10-28 20:45:33 UTC
README
The standard Charcoal Admin Control Panel (Backend Dashboard).
How to install
The preferred (and only supported) way of installing charcoal-admin is with composer:
$ composer require locomotivemtl/charcoal-admin
Note that charcoal-admin is intended to be run along a
charcoal-appbased project. To start from a boilerplate:$ composer create-project locomotivemtl/charcoal-project-boilerplate
Dependencies
- locomotivemtl/charcoal-core
- The framework classes. (Cache, Model, Metadata, View, Property, source, etc.)
- It brings the following dependencies:
- locomotivemtl/charcoal-config
- The configuration container for all things Charcoal.
 
- locomotivemtl/charcoal-property
- The building blocks of the Model's definition.
- locomotivemtl/charcoal-image
- Image manipulation.
 
 
- locomotivemtl/charcoal-view
- The view / templating engines. Mustache is the default engine.
 
 
- locomotivemtl/charcoal-config
 
- locomotivemtl/charcoal-object
- Object definition (Content and UserData), behaviors and tools.
 
- locomotivemtl/charcoal-user
- User defintion (as Charcoal Model), authentication and authorization (with Laminas ACL).
 
👉 Development dependencies are described in the Development section of this README file.
Which, in turn, require:
- PHP 7.3+- ext-fileinfoFile / MIME identification.
- ext-mbstringMulti-bytes string support.
- ext-pdoPDO Database driver.
 
- MySQL
- Other databases (postgresql, sqlite) should work but are not supported.
 
- Apache with mod_rewrite- Other HTTP servers (IIS, _nginx) should work but are not supported.
 
- pimple/pimplefor dependency injection container.
- slim/slimfor the routing engine and HTTP handling.
- mustache/mustachefor the template engine.
- phpmailerto send emails.
- league/climatefor CLI utilities.
- monolog/monologfor (PSR-3) logging.
Core concepts
The charcoal admin control panel is:
- Additional adminmetadata on charcoal objects and models, which controls automatically how they can be customized in the backend.
- A user / authentication system, which uses ACL for permissions.
- A customizable 2-level menu, which builds custom backend for every install.
- Dashboards and widgets. With some prebuilt functionalities for:
- Listing collection of objects (admin/object/collection), customizable from the object's admin metadata.
- Creating and editing objects (admin/object/edit), customizable from the objects's admin metadata.
 
- Listing collection of objects (
- Set of scripts to manage objects and the backend from the CLI.
What's inside this module?
Like all Charcoal projects / modules, the main components are:
- Autoloader
- PSR-4, Provided by Composer.
 
- Config
- As JSON or PHP files in the config/ directory.
 
- Front Controller
- The admin front controller is handled in the \Charcoal\Admin\Moduleclass.
 
- The admin front controller is handled in the 
- Objects
- Typically  into \Charcoal\Object\Contentand\Charcoal\Object\UserData
- Extends \Charcoal\Model\AbstractModel, which implements the following interface:- \Charcoal\Model\ModelInterface
- \Charcoal\Core\IndexableInterface
- \Charcoal\Metadata\DescribableInterface
- \Charcoal\Source\StorableInterface
- \Charcoal\Validator\ValidatableInterface
- \Charcaol\View\ViewableInterface
 
- PHP Models in src/Charcoal/Boilerplate/
- JSON metadata in metadata/charcoal/boilerplate/
 
- Typically  into 
- Templates
- Templates are specialized Model which acts as View / Controller
- Split in Templates,Widgets,PropertyDisplay, andPropertyInput
- PHP Models in src/Charcoal/Boilerplate/Template/
- Mustache views (templates) in templates/boilerplate/
- Optionnally, templates metadata in metdata/boilerplate/template/
 
- Actions
- Actions handle input and provide a response to a request
- They create the charcoal-admin REST API.
- The PHP classes in src/Charcoal/Boilerplate/Action
 
- Assets
- Assets are files required to be on the webserver root
- Scripts, in src/scripts/and compiled inwww/assets/scripts/
- Styles , with SASS in src/styles/and compiled CSS inwww/assets/styles/
- Images, in www/assets/images/
 
Objects
Users
Authentication is done through the Charcoal\Admin\User class. It reuses the authentication, authorization and user model provided by [charcoal-user](https://github.com/locomotivemtl/charcoal-user.
UI Elements
User-Interface Elements, in charcoal-admin (or any other Charcoal modules, in fact), are composed of:
- A PHP Controller, in src/Charcoal/Admin/{{type}}/{{ident}}
- A mustache templates, in templates/charcoal/admin/{{type}}/{{ident}}
- Optional additional metadata, in metadata/charcoal/admin/{{type}}/{{ident}}
There are 3 main types of UI Elements: Templates, Widgets and Property Inputs.
Templates
See the src/Charcoal/Admin/Templates directory for the list of available Templates in this module. Note that the template views themselves (the mustache templates) are located in templates/charcoal/admin/template/ directory.
In addition to being standard Template Models (controllers), all Template of the admin module also implements the \Charcoal\Admin\Template class.
This class provides additional controls to all templates:
- has_feedbacksand- feedbacks
- title,- subtitle,- show_titleand- show_subtitle
- auth_required- Protected, true by default. Set to false for templates that do not require an authenticated admin user.
 
Widgets
The following base widgets are available to build the various admin templates:
- Dashboard
- Feedbacks
- Form
- FormGroup
- FormProperty
- Graph/Bar
- Graph/Line
- Graph/Pie
- Layout
- MapWidget
- Table
- TableProperty
Property Inputs
Similar to other UI elements, Inputs are specialized widgets that are meant to display a "form element" for a Property. Properties models are defined in the charcoal-property package.
The following property inputs are available to build forms in the admin module:
- Audio- A special HTML5 widget to record an audio file from the microphone.
 
- Checkbox
- DateTimePicker- A date-time picker widget.
- Requires the ``
 
- File- A default <input type="file">that can be used as a base for all File properties.
 
- A default 
- Image- A specialized file input meant for uploading / previewing images.
 
- MapWidget- A specialized widget to edit a point on a map.
- Requires google-map.
 
- Number
- Radio
- Readonly
- Select
- Switch- A specialized Checkbox meant to be displayed as an on/off switch.
 
- Text- A default <input type="text">that can be used with most property types.
 
- A default 
- Textarea- A default <textarea>editor that can be used with most textual property types.
 
- A default 
- Tinymce- A specialized Textarea wysiwyg editor.
- Requires the tinymcejavascript library.
 
- Selectize- A specialized hybrid between a Textbox and Select jQuery based.
- Highly customizable.
- Requires the selectizejavascript library.
 
Selectize inputs options
| Name | Type | Description | Default | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| choice_obj_map | array | Custom mapping between an object properties or callable and the selectize. It is discouraged to use renderable data. choice_obj_map must be a mapping with existing object properties. 
 | {
  "value" : "id",
  "label": "name:title:label:id"
} | ||||||||
| form_ident | string|array | Allow to define a specific object form ident when creating or updating an object. You can specify different form idents for create and update by using the "create" and "update" array keys | "quick" | ||||||||
| selectize_templates | string|array | Allow custom rendering for selectize [item] and [option]. Overrule choice_obj_map[label]. Priotize using this for rendering custom labels instead of choice_obj_map. The value can either be a string with render tags, a path to a custom template or even an array mapping to handle "item", "option", "controller" and "data" individually. 
 | {} | ||||||||
| allow_create | bool | Display a 'create' button which triggers the selectize create functionality. | false | ||||||||
| allow_update | bool | Display an 'update' button which triggers the selectize update functionality. Applies to currently selected element. | false | ||||||||
| allow_clipboard_copy | bool | Display a 'copy' button which allows the user to easilly copy all selected elements at once. | false | ||||||||
| deferred | bool | Allow the select to load the dropdown "options" with an ajax request instead of on load. This can speed up the page load when there is a lot of "options". | false | ||||||||
| selectize_options | array | Defines the selectize js options. See the Selectize.js doc. Some usefull ones are : 
 | {
   persist: true,
   preload: "focus",
   openOnFocus: true, 
   labelField: "label",
   searchField: [
     "value",
     "label"
   ]
} | 
Usage example :
"categories": {
    "type": "object",
    "input_type": "charcoal/admin/property/input/selectize",
    "multiple": true,
    "deferred": true,
    "obj_type": "cms/object/news-category",
    "pattern": "title",
    "choice_obj_map": {
        "value": "ident",
        "label": "{{customLabelFunction}} - {{someAdditionalInfo }}"
    },
    "selectize_templates": {
        "item": "project/selectize/custom-item-template",
        "option": "project/selectize/custom-option-template",
        "controller": "project/selectize/custom-template"
    },
    "selectize_options": {
        "plugins": {
            "drag_drop": {},
            "btn_remove": {},
            "btn_update": {}
        }
    },
    "form_ident": {
        "create": "quick.create",
        "update": "quick.update"
    }
}
Selectize templates examples :
"selectize_templates": {
    "item": "{{customLabelFunction}} - {{someAdditionalInfo }}",
    "option": "{{customLabelFunction}} - {{someAdditionalInfo }}"
},
---
"selectize_templates": "{{customLabelFunction}} - {{someAdditionalInfo }}",
---
"selectize_templates": "project/selectize/custom-template",
---
"selectize_templates": {
   "item": "project/selectize/custom-item-template",
   "option": "project/selectize/custom-option-template",
   "controller": "project/selectize/custom-template",
   "data": {
        "category": "{{selectedCategory}}"
   }
},
Actions
See the src/Charcoal/Admin/Action/ directory for the list of availables Actions in this module.
In addition to being standard Action Models (controllers), all Action of the admin module also implements the \Charcoal\Admin\Action class.
Post Actions
- admin/login
- admin/object/delete
- admin/object/save
- admin/object/update
- admin/widget/load
- admin/widget/table/inline
- admin/widget/table/inlinue-multi
Cli Actions
See the src/Charcoal/Admin/Action/Cli/ directory for the list of all available Cli Actions in this module.
Cli Actions are specialized action meant to be run, interactively, from the Command Line Interface. With the Cli Actions in this module, it becomes quick and easy to manage a Charcoal project directly from a Terminal.
👉 The charcoal-cli tool, available from
charcoal-project-boilerplate, is the perfect tool to call the CLI Actions. Make sure it stays outside the document root!
- admin/objects- List the object of a certain obj-type.
 
- List the object of a certain 
- admin/object/create- Create a new object (and save it to storage) of a certain obj-typeaccording to its metadata's properties.
 
- Create a new object (and save it to storage) of a certain 
- admin/object/table/alter- Alter the existing database table of obj-typeaccording to its metadata's properties.
 
- Alter the existing database table of 
- admin/object/table/create- Create the database table for obj-typeaccording to its metadata's properties.
 
- Create the database table for 
- admin/user/create
Development
To install the development environment:
$ composer install --prefer-source
To run the tests:
$ composer test
API documentation
- The auto-generated phpDocumentorAPI documentation is available at https://locomotivemtl.github.io/charcoal-admin/docs/master/
- The auto-generated apigenAPI documentation is available at https://codedoc.pub/locomotivemtl/charcoal-admin/master/
Coding style
The Charcoal-Admin module follows the Charcoal coding-style:
- PSR-1, except for
- Method names MUST be declared in snake_case.
 
- Method names MUST be declared in 
- PSR-2, except for the PSR-1 requirement.q
- PSR-4, autoloading is therefore provided by Composer
- phpDocumentor
- Add DocBlocks for all classes, methods, and functions;
- For type-hinting, use boolean(instead ofbool),integer(instead ofint),float(instead ofdoubleorreal);
- Omit the @returntag if the method does not return anything.
 
- Naming conventions
- Read the phpcs.xml file for all the details.
 
Coding style validation / enforcement can be performed with
composer phpcs. An auto-fixer is also available withcomposer phpcbf.
For Javascript, the following coding style is enforced:
- todo
Every classes, methods and functions should be covered by unit tests. PHP code can be tested with PHPUnit and Javascript code with QUnit.
Authors
- Mathieu Ducharme mat@locomotive.ca
- Benjamin Roch benjamin@locomotive.ca
- Dominic Lord dom@locomotive.ca
- Chauncey McAskill chauncey@locomotive.ca
- Antoine Boulanger antoine@locomotive.ca
- Joel Alphonso joel@locomotive.ca
License
Charcoal is licensed under the MIT license. See LICENSE for details.