{"id":19110247,"url":"https://github.com/locomotivemtl/charcoal-admin","last_synced_at":"2026-03-08T05:34:02.021Z","repository":{"id":29034441,"uuid":"32561868","full_name":"locomotivemtl/charcoal-admin","owner":"locomotivemtl","description":"The admin (Backend Dashboard) for Charcoal","archived":false,"fork":false,"pushed_at":"2025-11-25T21:00:45.000Z","size":220670,"stargazers_count":11,"open_issues_count":10,"forks_count":6,"subscribers_count":12,"default_branch":"master","last_synced_at":"2026-02-19T06:35:19.953Z","etag":null,"topics":["admin","backend","charcoal","cms","php"],"latest_commit_sha":null,"homepage":"https://locomotive.ca/en/charcoal","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/locomotivemtl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-03-20T04:10:51.000Z","updated_at":"2025-02-11T16:54:19.000Z","dependencies_parsed_at":"2024-06-18T22:43:38.046Z","dependency_job_id":"6632262a-6ab9-49d2-85af-64158ad49709","html_url":"https://github.com/locomotivemtl/charcoal-admin","commit_stats":{"total_commits":2441,"total_committers":21,"mean_commits":"116.23809523809524","dds":0.6751331421548545,"last_synced_commit":"e6ac7b6f3b447cf08b7d9578b3d888d178a3639f"},"previous_names":[],"tags_count":332,"template":false,"template_full_name":null,"purl":"pkg:github/locomotivemtl/charcoal-admin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/locomotivemtl%2Fcharcoal-admin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/locomotivemtl%2Fcharcoal-admin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/locomotivemtl%2Fcharcoal-admin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/locomotivemtl%2Fcharcoal-admin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/locomotivemtl","download_url":"https://codeload.github.com/locomotivemtl/charcoal-admin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/locomotivemtl%2Fcharcoal-admin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30246741,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T00:58:18.660Z","status":"online","status_checked_at":"2026-03-08T02:00:06.215Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["admin","backend","charcoal","cms","php"],"created_at":"2024-11-09T04:24:17.034Z","updated_at":"2026-03-08T05:33:57.010Z","avatar_url":"https://github.com/locomotivemtl.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Charcoal Admin Module\n=====================\n\nThe standard Charcoal Admin Control Panel (Backend Dashboard).\n\n# How to install\n\nThe preferred (and only supported) way of installing charcoal-admin is with **composer**:\n\n```shell\n$ composer require locomotivemtl/charcoal-admin\n```\n\n\u003e Note that charcoal-admin is intended to be run along a `charcoal-app` based project. To start from a boilerplate:\n\u003e\n\u003e ```shell\n\u003e $ composer create-project locomotivemtl/charcoal-project-boilerplate\n\n## Dependencies\n\n-\t[locomotivemtl/charcoal-core](https://github.com/locomotivemtl/charcoal-core)\n\t-\tThe framework classes. (Cache, Model, Metadata, View, Property, source, etc.)\n\t-\tIt brings the following dependencies:\n\t\t-\t[locomotivemtl/charcoal-config](https://github.com/locomotivemtl/charcoal-config)\n\t\t\t-\tThe configuration container for all things Charcoal.\n\t\t-\t[locomotivemtl/charcoal-property](https://github.com/locomotivemtl/charcoal-property)\n\t\t\t-\tThe building blocks of the Model's definition.\n            -   [locomotivemtl/charcoal-image](https://github.com/locomotivemtl/charcoal-image)\n                -   Image manipulation.\n        -   [locomotivemtl/charcoal-view](https://github.com/locomotivemtl/charcoal-view)\n            -   The view / templating engines. Mustache is the default engine.\n-   [locomotivemtl/charcoal-object](https://github.com/locomotivemtl/charcoal-object)\n    -   Object definition (Content and UserData), behaviors and tools.\n-\t[locomotivemtl/charcoal-user](https://github.com/locomotivemtl/charcoal-user)\n\t-\tUser defintion (as Charcoal Model), authentication and authorization (with Laminas ACL).\n\n\u003e 👉 Development dependencies are described in the _Development_ section of this README file.\n\nWhich, in turn, require:\n\n-\t`PHP 7.3+`\n\t+\t`ext-fileinfo` File / MIME identification.\n\t+\t`ext-mbstring` Multi-bytes string support.\n    +\t`ext-pdo` PDO Database driver.\n-\tMySQL\n\t-\tOther databases (_postgresql_, _sqlite_) should work but are not supported.\n-\tApache with `mod_rewrite`\n\t-\tOther HTTP servers (_IIS_, _nginx) should work but are not supported.\n-\t`pimple/pimple` for dependency injection container.\n-\t`slim/slim` for the routing engine and HTTP handling.\n-\t`mustache/mustache` for the template engine.\n-\t`phpmailer` to send emails.\n-\t`league/climate` for CLI utilities.\n-\t`monolog/monolog` for (_PSR-3_) logging.\n\n# Core concepts\n\nThe _charcoal admin control panel_ is:\n\n- Additional `admin` metadata on charcoal objects and models, which controls automatically how they can be customized in the backend.\n- A user / authentication system, which uses ACL for permissions.\n- A customizable 2-level menu, which builds custom backend for every install.\n- Dashboards and widgets. With some prebuilt functionalities for:\n    - Listing collection of objects (`admin/object/collection`), customizable from the object's _admin metadata_.\n    - Creating and editing objects (`admin/object/edit`), customizable from the objects's _admin metadata_.\n- Set of _scripts_ to manage objects and the backend from the CLI.\n\n# What's inside this module?\n\nLike all Charcoal projects / modules, the main components are:\n\n-\t**Autoloader**\n\t-\t_PSR-4_, Provided by Composer.\n-\t**Config**\n\t-\tAs JSON or PHP files in the [config/](config/) directory.\n-\t**Front Controller**\n\t-\tThe admin front controller is handled in the `\\Charcoal\\Admin\\Module` class.\n-\t**Objects**\n\t-\tTypically  into `\\Charcoal\\Object\\Content` and `\\Charcoal\\Object\\UserData`\n\t-\tExtends `\\Charcoal\\Model\\AbstractModel`, which implements the following interface:\n\t\t-\t`\\Charcoal\\Model\\ModelInterface`\n\t\t-\t`\\Charcoal\\Core\\IndexableInterface`\n\t\t-\t`\\Charcoal\\Metadata\\DescribableInterface`\n\t\t-\t`\\Charcoal\\Source\\StorableInterface`\n\t\t-\t`\\Charcoal\\Validator\\ValidatableInterface`\n\t\t-\t`\\Charcaol\\View\\ViewableInterface`\n\t-\tPHP Models in `src/Charcoal/Boilerplate/`\n\t-\tJSON metadata in `metadata/charcoal/boilerplate/`\n-\t**Templates**\n\t-\tTemplates are specialized Model which acts as View / Controller\n\t-\tSplit in `Templates`, `Widgets`, `PropertyDisplay`, and `PropertyInput`\n\t-\tPHP Models in `src/Charcoal/Boilerplate/Template/`\n\t-\tMustache views (templates) in `templates/boilerplate/`\n\t-\tOptionnally, templates metadata in `metdata/boilerplate/template/`\n-\t**Actions**\n\t-\tActions handle input and provide a response to a request\n\t-   They create the charcoal-admin REST API.\n\t-\tThe PHP classes in `src/Charcoal/Boilerplate/Action`\n-\t**Assets**\n\t-\tAssets are files required to be on the webserver root\n\t-\tScripts, in `src/scripts/` and compiled in `www/assets/scripts/`\n\t-\tStyles , with SASS in `src/styles/` and compiled CSS in `www/assets/styles/`\n\t-\tImages, in `www/assets/images/`\n\n## Objects\n\n## Users\n\nAuthentication 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.\n\n# UI Elements\n\nUser-Interface Elements, in charcoal-admin (or any other Charcoal modules, in fact), are composed of:\n\n-\tA PHP Controller, in _src/Charcoal/Admin/{{type}}/{{ident}}_\n-\tA mustache templates, in _templates/charcoal/admin/{{type}}/{{ident}}_\n-\tOptional additional metadata, in _metadata/charcoal/admin/{{type}}/{{ident}}_\n\nThere are 3 main types of UI Elements: _Templates_, _Widgets_ and _Property Inputs_.\n\n## Templates\n\nSee the [src/Charcoal/Admin/Templates](src/Charcoal/Admin/Template) 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/](templates/charcoal/admin/template/) directory.\n\nIn addition to being standard Template Models (controllers), all _Template_ of the admin module also implements the `\\Charcoal\\Admin\\Template` class.\n\nThis class provides additional controls to all templates:\n\n-\t`has_feedbacks` and `feedbacks`\n-\t`title`, `subtitle`, `show_title` and `show_subtitle`\n-\t`auth_required`\n\t-\tProtected, true by default. Set to false for templates that do not require an authenticated admin user.\n\n## Widgets\n\nThe following base widgets are available to build the various _admin_ templates:\n\n-\t`Dashboard`\n-\t`Feedbacks`\n-\t`Form`\n-\t`FormGroup`\n-\t`FormProperty`\n-\t`Graph/Bar`\n-\t`Graph/Line`\n-\t`Graph/Pie`\n-\tLayout\n-\tMapWidget\n-\tTable\n-\tTableProperty\n\n## Property Inputs\n\nSimilar 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](https://github.com/locomotivemtl/charcoal-property) package.\n\nThe following property inputs are available  to build forms in the _admin_ module:\n\n-\t`Audio`\n\t-\tA special HTML5 widget to record an audio file from the microphone.\n-\t`Checkbox`\n-\t`DateTimePicker`\n\t-\tA date-time picker widget.\n\t-\tRequires the ``\n-\t`File`\n\t-\tA default `\u003cinput type=\"file\"\u003e` that can be used as a base for all _File_ properties.\n-\t`Image`\n\t-\tA specialized file input meant for uploading / previewing images.\n-\t`MapWidget`\n\t-\tA specialized widget to edit a point on a map.\n\t-\tRequires google-map.\n-\t`Number`\n-\t`Radio`\n-\t`Readonly`\n-\t`Select`\n-\t`Switch`\n\t-\tA specialized _Checkbox_ meant to be displayed as an on/off switch.\n-\t`Text`\n\t-\tA default `\u003cinput type=\"text\"\u003e` that can be used with most property types.\n-\t`Textarea`\n\t-\tA default `\u003ctextarea\u003e` editor that can be used with most textual property types.\n-\t`Tinymce`\n\t-\tA specialized _Textarea_ wysiwyg editor.\n\t-\tRequires the `tinymce` javascript library.\n-\t`Selectize`\n\t-\tA specialized hybrid between a _Textbox_ and _Select_ jQuery based.\n\t- Highly customizable.\n\t-\tRequires the `selectize` javascript library.\n\n### Selectize inputs options\n\n\u003ctable width=\"100%\"\u003e\n\u003ctr\u003e\n  \u003cth width=\"120px\" align=\"left\"\u003eName\u003c/th\u003e\n  \u003cth width=\"30px\" align=\"left\"\u003eType\u003c/th\u003e\n  \u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n  \u003cth width=\"60px\" align=\"left\"\u003eDefault\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd valign=\"top\"\u003e\u003cstrong\u003echoice_obj_map\u003c/strong\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cem\u003earray\u003c/em\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003eCustom 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.\n  \u003ctable class=\"table table-bordered table-hover table-condensed\"\u003e\n          \u003c/br\u003e\n          \u003c/br\u003e\n          \u003ctbody\u003e\u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003evalue\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eObject property or object callable. Defines the actual value to be registered in the database\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003elabel\u003cstring\u003e\u003c/td\u003e\n          \u003ctd\u003eObject property or object callable. Defines the visible label of the input.\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003c/tbody\u003e\n      \u003c/table\u003e\n  \u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cpre\u003e{\n  \u0026quot;value\u0026quot; : \u0026quot;id\u0026quot;,\n  \u0026quot;label\u0026quot;: \u0026quot;name:title:label:id\u0026quot;\n}\u003c/pre\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd valign=\"top\"\u003e\u003cstrong\u003eform_ident\u003c/strong\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cem\u003estring|array\u003c/em\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003eAllow 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 \u0026quot;create\u0026quot; and \u0026quot;update\u0026quot; array keys\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003ccode\u003e\u0026quot;quick\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd valign=\"top\"\u003e\u003cstrong\u003eselectize_templates\u003c/strong\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cem\u003estring|array\u003c/em\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003eAllow custom rendering for selectize [item] and [option]. Overrule choice_obj_map[label]. Priotize using this for rendering custom labels instead of choice_obj_map.\u003cbr\u003e\u003cbr\u003eThe 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.\n  \u003ctable class=\"table table-bordered table-hover table-condensed\"\u003e\n          \u003c/br\u003e\n          \u003c/br\u003e\n          \u003ctbody\u003e\u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003eitem\u003c/strong\u003e\u003cbr\u003e(Can be a renderable string or template path)\u003c/td\u003e\n          \u003ctd\u003eCustom renderable html or mustache template for the selectize item. [Item] is the term used to refer to a selected choice.\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003eoption\u003c/strong\u003e\u003cbr\u003e(Can be a renderable string or template path)\u003c/td\u003e\n          \u003ctd\u003eCustom renderable html or mustache template for the selectize option. [Option] is the term used to refer to an available choice.\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003econtroller\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eDefines a rendering context (path to php controller). (optional) Default context is the object itself.\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003edata\u003c/strong\u003e(array)\u003c/td\u003e\n          \u003ctd\u003eProvides additional data to the controller\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003c/tbody\u003e\n      \u003c/table\u003e\n  \u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd valign=\"top\"\u003e\u003cstrong\u003eallow_create\u003c/strong\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cem\u003ebool\u003c/em\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003eDisplay a \u0026#39;create\u0026#39; button which triggers the selectize create functionality.\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd valign=\"top\"\u003e\u003cstrong\u003eallow_update\u003c/strong\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cem\u003ebool\u003c/em\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003eDisplay an \u0026#39;update\u0026#39; button which triggers the selectize update functionality. Applies to currently selected element.\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd valign=\"top\"\u003e\u003cstrong\u003eallow_clipboard_copy\u003c/strong\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cem\u003ebool\u003c/em\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003eDisplay a \u0026#39;copy\u0026#39; button which allows the user to easilly copy all selected elements at once.\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd valign=\"top\"\u003e\u003cstrong\u003edeferred\u003c/strong\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cem\u003ebool\u003c/em\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003eAllow the select to load the dropdown \u0026quot;options\u0026quot; with an ajax request instead of on load. This can speed up the page load when there is a lot of \u0026quot;options\u0026quot;. \u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd valign=\"top\"\u003e\u003cstrong\u003eselectize_options\u003c/strong\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cem\u003earray\u003c/em\u003e\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003eDefines the selectize js options. See the \u003ca href=\"https://github.com/selectize/selectize.js/blob/master/docs/usage.md\"\u003eSelectize.js doc\u003c/a\u003e. Some usefull ones are :\n  \u003cul\u003e\n  \u003cli\u003e\u0026quot;maxItems\u0026quot;\u003c/li\u003e\n  \u003cli\u003e\u0026quot;maxOptions\u0026quot;\u003c/li\u003e\n  \u003cli\u003e\u0026quot;create\u0026quot;\u003c/li\u003e\n  \u003cli\u003e\u0026quot;placeholder\u0026quot;\u003c/li\u003e\n  \u003cli\u003e\u0026quot;searchField\u0026quot;\u003c/li\u003e\n  \u003cli\u003e\u0026quot;plugins\u0026quot;\u003c/li\u003e\n  \u003c/ul\u003e\n  Also, two home made plugins are available : \u0026quot;btn_remove\u0026quot; and \u0026quot;btn_update\u0026quot; that are custom buttons for selected items that work well with charcoal objects and doesn\u0026#39;t break styling.\u003c/td\u003e\n  \u003ctd valign=\"top\"\u003e\u003cpre\u003e{\n   persist: true,\n   preload: \"focus\",\n   openOnFocus: true, \n   labelField: \"label\",\n   searchField: [\n     \"value\",\n     \"label\"\n   ]\n}\u003c/pre\u003e\n  \u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nUsage example : \n\n\u003cpre\u003e\n\"categories\": {\n    \"type\": \"object\",\n    \"input_type\": \"charcoal/admin/property/input/selectize\",\n    \"multiple\": true,\n    \"deferred\": true,\n    \"obj_type\": \"cms/object/news-category\",\n    \"pattern\": \"title\",\n    \"choice_obj_map\": {\n        \"value\": \"ident\",\n        \"label\": \"{{customLabelFunction}} - {{someAdditionalInfo }}\"\n    },\n    \"selectize_templates\": {\n        \"item\": \"project/selectize/custom-item-template\",\n        \"option\": \"project/selectize/custom-option-template\",\n        \"controller\": \"project/selectize/custom-template\"\n    },\n    \"selectize_options\": {\n        \"plugins\": {\n            \"drag_drop\": {},\n            \"btn_remove\": {},\n            \"btn_update\": {}\n        }\n    },\n    \"form_ident\": {\n        \"create\": \"quick.create\",\n        \"update\": \"quick.update\"\n    }\n}\n\u003c/pre\u003e\n\nSelectize templates examples : \n\n\u003cpre\u003e\n\"selectize_templates\": {\n    \"item\": \"{{customLabelFunction}} - {{someAdditionalInfo }}\",\n    \"option\": \"{{customLabelFunction}} - {{someAdditionalInfo }}\"\n},\n\n---\n\n\"selectize_templates\": \"{{customLabelFunction}} - {{someAdditionalInfo }}\",\n\n---\n\n\"selectize_templates\": \"project/selectize/custom-template\",\n\n---\n\n\"selectize_templates\": {\n   \"item\": \"project/selectize/custom-item-template\",\n   \"option\": \"project/selectize/custom-option-template\",\n   \"controller\": \"project/selectize/custom-template\",\n   \"data\": {\n        \"category\": \"{{selectedCategory}}\"\n   }\n},\n\u003c/pre\u003e\n\n# Actions\n\nSee the [src/Charcoal/Admin/Action/](src/Charcoal/Admin/Action/) directory for the list of availables Actions in this module.\n\nIn addition to being standard Action Models (controllers), all _Action_ of the admin module also implements the `\\Charcoal\\Admin\\Action` class.\n\n## Post Actions\n\n-\t`admin/login`\n-\t`admin/object/delete`\n-\t`admin/object/save`\n-\t`admin/object/update`\n-\t`admin/widget/load`\n-\t`admin/widget/table/inline`\n-\t`admin/widget/table/inlinue-multi`\n\n## Cli Actions\n\nSee the [src/Charcoal/Admin/Action/Cli/](src/Charcoal/Admin/Action/Cli/) directory for the list of all available Cli Actions in this module.\n\n_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.\n\n\u003e 👉 The [charcoal-cli](https://github.com/locomotivemtl/charcoal-project-boilerplate/blob/master/charcoal-cli.php) tool, available from `charcoal-project-boilerplate`, is the perfect tool to call the CLI Actions. Make sure it stays outside the document root!\n\n-\t`admin/objects`\n\t-\tList the object of a certain `obj-type`.\n-\t`admin/object/create`\n\t-\tCreate a new object (and save it to storage) of a certain `obj-type` according to its metadata's properties.\n-\t`admin/object/table/alter`\n\t-\tAlter the existing database table of `obj-type` according to its metadata's properties.\n-\t`admin/object/table/create`\n\t-\tCreate the database table for `obj-type` according to its metadata's properties.\n-\t`admin/user/create`\n\n\n# Development\n\nTo install the development environment:\n\n```shell\n$ composer install --prefer-source\n```\n\nTo run the tests:\n\n```shell\n$ composer test\n```\n\n## API documentation\n\n-\tThe auto-generated `phpDocumentor` API documentation is available at [https://locomotivemtl.github.io/charcoal-admin/docs/master/](https://locomotivemtl.github.io/charcoal-admin/docs/master/)\n-\tThe auto-generated `apigen` API documentation is available at [https://codedoc.pub/locomotivemtl/charcoal-admin/master/](https://codedoc.pub/locomotivemtl/charcoal-admin/master/index.html)\n\n\n## Coding style\n\nThe Charcoal-Admin module follows the Charcoal coding-style:\n\n-\t[_PSR-1_](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md), except for\n\t-\tMethod names MUST be declared in `snake_case`.\n-\t[_PSR-2_](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md), except for the PSR-1 requirement.q\n-\t[_PSR-4_](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md), autoloading is therefore provided by _Composer_\n-\t[_phpDocumentor_](http://phpdoc.org/)\n\t-\tAdd DocBlocks for all classes, methods, and functions;\n\t-\tFor type-hinting, use `boolean` (instead of `bool`), `integer` (instead of `int`), `float` (instead of `double` or `real`);\n\t-\tOmit the `@return` tag if the method does not return anything.\n-\tNaming conventions\n\t-\tRead the [phpcs.xml](phpcs.xml) file for all the details.\n\n\u003e Coding style validation / enforcement can be performed with `composer phpcs`. An auto-fixer is also available with `composer phpcbf`.\n\nFor Javascript, the following coding style is enforced:\n\n-\t**todo**\n\nEvery classes, methods and functions should be covered by unit tests. PHP code can be tested with _PHPUnit_ and Javascript code with _QUnit_.\n\n# Authors\n\n-\tMathieu Ducharme \u003cmat@locomotive.ca\u003e\n-\tBenjamin Roch \u003cbenjamin@locomotive.ca\u003e\n-\tDominic Lord \u003cdom@locomotive.ca\u003e\n-\tChauncey McAskill \u003cchauncey@locomotive.ca\u003e\n-\tAntoine Boulanger \u003cantoine@locomotive.ca\u003e\n-\tJoel Alphonso \u003cjoel@locomotive.ca\u003e\n\n# License\n\nCharcoal is licensed under the MIT license. See [LICENSE](LICENSE) for details.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flocomotivemtl%2Fcharcoal-admin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flocomotivemtl%2Fcharcoal-admin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flocomotivemtl%2Fcharcoal-admin/lists"}