The admin (Backend Dashboard) for Charcoal

Overview

Charcoal Admin Module

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-app based project. To start from a boilerplate:

$ composer create-project locomotivemtl/charcoal-project-boilerplate

Dependencies

๐Ÿ‘‰ Development dependencies are described in the Development section of this README file.

Which, in turn, require:

  • PHP 7.3+
    • ext-fileinfo File / MIME identification.
    • ext-mbstring Multi-bytes string support.
    • ext-pdo PDO 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/pimple for dependency injection container.
  • slim/slim for the routing engine and HTTP handling.
  • mustache/mustache for the template engine.
  • phpmailer to send emails.
  • league/climate for CLI utilities.
  • monolog/monolog for (PSR-3) logging.

Core concepts

The charcoal admin control panel is:

  • Additional admin metadata 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.
  • 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\Module class.
  • Objects
    • Typically into \Charcoal\Object\Content and \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/
  • Templates
    • Templates are specialized Model which acts as View / Controller
    • Split in Templates, Widgets, PropertyDisplay, and PropertyInput
    • 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 in www/assets/scripts/
    • Styles , with SASS in src/styles/ and compiled CSS in www/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_feedbacks and feedbacks
  • title, subtitle, show_title and 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.
  • 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.
  • Textarea
    • A default <textarea> editor that can be used with most textual property types.
  • Tinymce
    • A specialized Textarea wysiwyg editor.
    • Requires the tinymce javascript library.
  • Selectize
    • A specialized hybrid between a Textbox and Select jQuery based.
    • Highly customizable.
    • Requires the selectize javascript 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 Object property or object callable. Defines the actual value to be registered in the database
label Object property or object callable. Defines the visible label of the input.
{
  "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.

item
(Can be a renderable string or template path)
Custom renderable html or mustache template for the selectize item. [Item] is the term used to refer to a selected choice.
option
(Can be a renderable string or template path)
Custom renderable html or mustache template for the selectize option. [Option] is the term used to refer to an available choice.
controller Defines a rendering context (path to php controller). (optional) Default context is the object itself.
data(array) Provides additional data to the controller
{}
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 :
  • "maxItems"
  • "maxOptions"
  • "create"
  • "placeholder"
  • "searchField"
  • "plugins"
Also, two home made plugins are available : "btn_remove" and "btn_update" that are custom buttons for selected items that work well with charcoal objects and doesn't break styling.
{
   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.
  • admin/object/create
    • Create a new object (and save it to storage) of a certain obj-type according to its metadata's properties.
  • admin/object/table/alter
    • Alter the existing database table of obj-type according to its metadata's properties.
  • admin/object/table/create
    • Create the database table for obj-type according to its metadata's properties.
  • admin/user/create

Development

To install the development environment:

$ composer install --prefer-source

To run the tests:

$ composer test

API documentation

Coding style

The Charcoal-Admin module follows the Charcoal coding-style:

  • PSR-1, except for
    • Method names MUST be declared in snake_case.
  • 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 of bool), integer (instead of int), float (instead of double or real);
    • Omit the @return tag 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 with composer 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

License

Charcoal is licensed under the MIT license. See LICENSE for details.

Comments
  • Selectize input

    Selectize input

    Fully customizable SelectizeInput :

    • Comes with a newly designed plugin 'buttons' that can be required in user created plugins to easily manage item buttons
    • 2 buttons are already included (remove_button and update_button)
    • Support 2 step object creation (2 pop-up windows for form properties that requires the object to have an id to work properly)
    • Also support an input button to update selected item
    opened by JoelAlphonso 9
  • Implement Support Traits

    Implement Support Traits

    tl;dr

    • Grouped duplicate code into a collection of support traits (configs, URLs, auth)
    • Added support to more easily highlight a header / sidemenu menu item from the template data.

    ts;wm

    Changes:

    • Added Support namespace
    • Added AdminTrait to handle dev mode, admin config, and app config
    • Added BaseUrlTrait to handle site URLs and admin URLs
    • Added SecurityTrait to handle conditional auth checks
    • Added "current_item" implementation to SidemenuWidget and SidemenuGroupTrait
    • Added "header_menu_item", "side_menu_item", and "system_menu_item" to AdminTemplate
    opened by mcaskill 6
  • Added the possibility of defining data attributes on actions

    Added the possibility of defining data attributes on actions

    Example

    ...
    "actions": [
        {
            "ident": "view_en",
            "label": {
                "en": "View",
                "fr": "Voir"
            },
            "target": "_blank",
            "dataAttributes": [
                {
                    "key": "lang",
                    "value": "en"
                }
            ],
            "condition": "{{ isEn }}",
            "url": "{{# withBaseUrl }}{{ url.en }}{{/ withBaseUrl }}"
        },
        {
            "ident": "view_fr",
            "label": {
                "en": "View",
                "fr": "Voir"
            },
            "cssClasses": "hidden",
            "target": "_blank",
            "dataAttributes": [
                {
                    "key": "lang",
                    "value": "fr"
                }
            ],
            "condition": "{{ isFr }}",
            "url": "{{# withBaseUrl }}{{ url.fr }}{{/ withBaseUrl }}"
        },
    ...
    
    opened by dominiclord 5
  • Refactored FormPropertyWidget + FormSidebarWidget

    Refactored FormPropertyWidget + FormSidebarWidget

    tl;dr

    • FormPropertyWidget
      • supports display types via "output_type": "display" (defaults to "input")
    • FormSidebarWidget
      • renders values with display properties instead of AbstractProperty::displayVal()
      • supports input types via "output_type": "input" (defaults to "display")
      • supports "properties_options"
    opened by mcaskill 5
  • Add JS cache manager

    Add JS cache manager

    I built this yesterday, not knowing about @mducharme's forthcoming work on the new Systemย Menu. The features in this branch are still practical nonetheless.

    Added Cache Manager object to Charcoal's JavaScript to provide a centralized system to handle requests and responses to empty the various server-side caches.

    Changes:

    • Renamed Admin.cache method to Admin.store (its a better name overall)
    • Moved Admin.cachePool to private variable
    • Added Admin.cache method to access Cache Manager object
    • Improved feedback handling for XHR requests to "system/clear-cache"
    • Updated "system/clear-cache" template to use JS Cache Manager
    • Updated clear cache event handler in "menu.header" to use JS Cache Manager
    • Using <button> elements instead of href-less <a> elements in "system/clear-cache"
    opened by mcaskill 3
  • Selectize Renderable ChoiceObjMap and custom templating.

    Selectize Renderable ChoiceObjMap and custom templating.

    This adds 2 main options to selectize input :

    • the choiceObjMap is now mustache renderable
    • and you can supply custom mustache templates for selectize to render.

    Those 2 new features are possible through custom object actions specifically made for selectize that instantiate a SelectizeInput and returns a pre-formatted array to the selectize.js plugin that can be used as-is. The selectize.js will in fact receive an array selectize containing a value, label, item_render and option_render that can be directly set as a selectize item.

    selectize_templates usage :

    "category": {
        "input_type": "charcoal/admin/property/input/selectize",
        "obj_type": "city/object/news-category",
        "form_ident": "city.quick",
        "selectize_templates": {
            "item": "project/selectize/custom-item-template",
            "option": "project/selectize/custom-option-template",
            "controller": "project/selectize/custom-template"
        }
    }
    

    Here the word option refers to a drop-down option in select. The Controller is optional and the object controller will be used in the case that's it's not defined.

    choice_obj_map usage :

    "category": {
        "input_type": "charcoal/admin/property/input/selectize",
        "obj_type": "city/object/news-category",
        "form_ident": "city.quick",
        "choice_obj_map": {
            "value": "{{ident}}",
            "label": "{{customLabelFunction}} - {{someAdditionalInfo }}"
        }
    }
    
    opened by JoelAlphonso 3
  • Add force_page_reload option to ObjectFormWidget

    Add force_page_reload option to ObjectFormWidget

    This option will force the form widget to reload the page after update (when set to: true). Example:

    "admin.edit": {
        "widgets": {
            "form": {
                "type": "charcoal/admin/widget/object-form",
                "form_ident": "default",
                "obj_type": "charcoal/admin/object/object-name",
                "group_display_mode": "tab",
                "force_page_reload": true
            }
        }
    }
    
    enhancement 
    opened by MouseEatsCat 2
  • Implement Widget/Input Data as JSON

    Implement Widget/Input Data as JSON

    tl;dr This is a request to implement methods to transform data into JSON for use by JavaScript components when rendering an objects view.

    ts;wm Many viewable PHP classes have JavaScript components attached to them. Usually, these viewable objects pass any data to the client-side using the view renderer. Unfortunately, some of these viewable objects render their client-side data in hand-tailored JavaScript objects as opposed to making a method that transforms such data into a JSON object (which is much easier to extend and customize).

    Requirements

    opened by mcaskill 2
  • Bump @xmldom/xmldom from 0.7.5 to 0.7.6

    Bump @xmldom/xmldom from 0.7.5 to 0.7.6

    Bumps @xmldom/xmldom from 0.7.5 to 0.7.6.

    Release notes

    Sourced from @โ€‹xmldom/xmldom's releases.

    0.7.6

    Commits

    Fixed

    Thank you, @โ€‹jftanner, @โ€‹Supraja9726 for your contributions

    Changelog

    Sourced from @โ€‹xmldom/xmldom's changelog.

    0.7.6

    Fixed

    Thank you, @โ€‹jftanner, @โ€‹Supraja9726 for your contributions

    0.8.3

    Fixed

    Thank you, @โ€‹Supraja9726 for your contributions

    0.9.0-beta.2

    Fixed

    Thank you, @โ€‹Supraja9726 for your contributions

    0.8.3

    Fixed

    Thank you, @โ€‹Supraja9726 for your contributions

    0.9.0-beta.1

    Fixed

    Only use HTML rules if mimeType matches [#338](https://github.com/xmldom/xmldom/issues/338), fixes [#203](https://github.com/xmldom/xmldom/issues/203)

    In the living specs for parsing XML and HTML, that this library is trying to implement, there is a distinction between the different types of documents being parsed: There are quite some rules that are different for parsing, constructing and serializing XML vs HTML documents.

    So far xmldom was always "detecting" whether "the HTML rules should be applied" by looking at the current namespace. So from the first time an the HTML default namespace (http://www.w3.org/1999/xhtml) was found, every node was treated as being part of an HTML document. This misconception is the root cause for quite some reported bugs.

    BREAKING CHANGE: HTML rules are no longer applied just because of the namespace, but require the mimeType argument passed to DOMParser.parseFromString(source, mimeType) to match 'text/html'. Doing so implies all rules for handling casing for tag and attribute names when parsing, creation of nodes and searching nodes.

    BREAKING CHANGE: Correct the return type of DOMParser.parseFromString to Document | undefined. In case of parsing errors it was always possible that "the returned Document" has not been created. In case you are using Typescript you now need to handle those cases.

    BREAKING CHANGE: The instance property DOMParser.options is no longer available, instead use the individual readonly property per option (assign, domHandler, errorHandler, normalizeLineEndings, locator, xmlns). Those also provides the default value if the option was not passed. The 'locator' option is now just a boolean (default remains true).

    BREAKING CHANGE: The following methods no longer allow a (non spec compliant) boolean argument to toggle "HTML rules":

    • XMLSerializer.serializeToString
    • Node.toString

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 1
  • Add new group display mode for quick form widget

    Add new group display mode for quick form widget

    • Add support for grouping properties by the language, for multilingual form properties.
    • Centralize sort by priority comparator functions to minimize duplicate code.
    opened by veve40 1
  • Bump grunt from 1.5.2 to 1.5.3

    Bump grunt from 1.5.2 to 1.5.3

    Bumps grunt from 1.5.2 to 1.5.3.

    Release notes

    Sourced from grunt's releases.

    v1.5.3

    • Merge pull request #1745 from gruntjs/fix-copy-op 572d79b
    • Patch up race condition in symlink copying. 58016ff
    • Merge pull request #1746 from JamieSlome/patch-1 0749e1d
    • Create SECURITY.md 69b7c50

    https://github.com/gruntjs/grunt/compare/v1.5.2...v1.5.3

    Changelog

    Sourced from grunt's changelog.

    v1.5.3 date: 2022-04-23 changes: - Patch up race condition in symlink copying.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 1
  • Bump tinymce from 5.10.5 to 5.10.7

    Bump tinymce from 5.10.5 to 5.10.7

    Bumps tinymce from 5.10.5 to 5.10.7.

    Changelog

    Sourced from tinymce's changelog.

    5.10.7 - 2022-12-06

    Fixed

    • HTML in messages for the WindowManager.alert and WindowManager.confirm APIs were not properly sanitized. #TINY-3548

    5.10.6 - 2022-10-19

    Fixed

    • The name and id attributes of some elements were incorrectly removed during serialization #TINY-8773
    • Notifications would not properly reposition when toggling fullscreen mode #TINY-8701
    • Toggling fullscreen mode with the fullscreen plugin now also fires the ResizeEditor event #TINY-8701
    • The URL detection used for autolink and smart paste didn't work if a path segment contained valid characters such as ! and : #TINY-8069
    Commits
    • a4c4e46 TINY-9402: Prepare for TinyMCE 5.10.7 release (take 3) (#8331)
    • 0fea476 TINY-9402: Prepare for TinyMCE 5.10.7 release (#8328)
    • 8bb2d26 Merge pull request from GHSA-gg8r-xjwq-4w92
    • 78fa310 TINY-8885: Update changelog for 5.10.6 release (#8198)
    • 5421ec9 TINY-9219: Fix broken tests on Firefox (#8158)
    • 70f8c28 TINY-8979: Backport URL link detection fix (#8127)
    • 4e102c0 TINY-8978: Backport fix for notifications in fullscreen (#8121)
    • a0ae700 TINY-8773: Prevent stripping of "name" and "id" attributes on iframe and img ...
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Bump engine.io from 6.2.0 to 6.2.1

    Bump engine.io from 6.2.0 to 6.2.1

    Bumps engine.io from 6.2.0 to 6.2.1.

    Release notes

    Sourced from engine.io's releases.

    6.2.1

    :warning: This release contains an important security fix :warning:

    A malicious client could send a specially crafted HTTP request, triggering an uncaught exception and killing the Node.js process:

    Error: read ECONNRESET
        at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
    Emitted 'error' event on Socket instance at:
        at emitErrorNT (internal/streams/destroy.js:106:8)
        at emitErrorCloseNT (internal/streams/destroy.js:74:3)
        at processTicksAndRejections (internal/process/task_queues.js:80:21) {
      errno: -104,
      code: 'ECONNRESET',
      syscall: 'read'
    }
    

    Please upgrade as soon as possible.

    Bug Fixes

    • catch errors when destroying invalid upgrades (#658) (425e833)
    Changelog

    Sourced from engine.io's changelog.

    6.2.1 (2022-11-20)

    :warning: This release contains an important security fix :warning:

    A malicious client could send a specially crafted HTTP request, triggering an uncaught exception and killing the Node.js process:

    Error: read ECONNRESET
        at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
    Emitted 'error' event on Socket instance at:
        at emitErrorNT (internal/streams/destroy.js:106:8)
        at emitErrorCloseNT (internal/streams/destroy.js:74:3)
        at processTicksAndRejections (internal/process/task_queues.js:80:21) {
      errno: -104,
      code: 'ECONNRESET',
      syscall: 'read'
    }
    

    Please upgrade as soon as possible.

    Bug Fixes

    • catch errors when destroying invalid upgrades (#658) (425e833)

    3.6.0 (2022-06-06)

    Bug Fixes

    Features

    • decrease the default value of maxHttpBufferSize (58e274c)

    This change reduces the default value from 100 mb to a more sane 1 mb.

    This helps protect the server against denial of service attacks by malicious clients sending huge amounts of data.

    See also: https://github.com/advisories/GHSA-j4f2-536g-r55m

    • increase the default value of pingTimeout (f55a79a)
    Commits
    • 24b847b chore(release): 6.2.1
    • 425e833 fix: catch errors when destroying invalid upgrades (#658)
    • 99adb00 chore(deps): bump xmlhttprequest-ssl and engine.io-client in /examples/latenc...
    • d196f6a chore(deps): bump minimatch from 3.0.4 to 3.1.2 (#660)
    • 7c1270f chore(deps): bump nanoid from 3.1.25 to 3.3.1 (#659)
    • 535a01d ci: add Node.js 18 in the test matrix
    • 1b71a6f docs: remove "Vanilla JS" highlight from README (#656)
    • 917d1d2 refactor: replace deprecated String.prototype.substr() (#646)
    • 020801a chore: add changelog for version 3.6.0
    • ed1d6f9 test: make test script work on Windows (#643)
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Bump socket.io-parser from 4.0.4 to 4.0.5

    Bump socket.io-parser from 4.0.4 to 4.0.5

    Bumps socket.io-parser from 4.0.4 to 4.0.5.

    Release notes

    Sourced from socket.io-parser's releases.

    4.0.5

    Bug Fixes

    • check the format of the index of each attachment (b559f05)

    Links

    Changelog

    Sourced from socket.io-parser's changelog.

    4.0.5 (2022-06-27)

    Bug Fixes

    • check the format of the index of each attachment (b559f05)

    4.2.0 (2022-04-17)

    Features

    • allow the usage of custom replacer and reviver (#112) (b08bc1a)

    4.1.2 (2022-02-17)

    Bug Fixes

    • allow objects with a null prototype in binary packets (#114) (7f6b262)

    4.1.1 (2021-10-14)

    4.1.0 (2021-10-11)

    Features

    • provide an ESM build with and without debug (388c616)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Bump @xmldom/xmldom from 0.7.5 to 0.7.8

    Bump @xmldom/xmldom from 0.7.5 to 0.7.8

    Bumps @xmldom/xmldom from 0.7.5 to 0.7.8.

    Release notes

    Sourced from @โ€‹xmldom/xmldom's releases.

    0.7.8

    Commits

    Fixed

    Thank you, @โ€‹fengxinming, for your contributions

    0.7.7

    Commits

    Fixed

    • Security: Prevent inserting DOM nodes when they are not well-formed CVE-2022-39353 In case such a DOM would be created, the part that is not well-formed will be transformed into text nodes, in which xml specific characters like < and > are encoded accordingly. In the upcoming version 0.9.0 those text nodes will no longer be added and an error will be thrown instead. This change can break your code, if you relied on this behavior, e.g. multiple root elements in the past. We consider it more important to align with the specs that we want to be aligned with, considering the potential security issues that might derive from people not being aware of the difference in behavior. Related Spec: https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity

    Thank you, @โ€‹frumioj, @โ€‹cjbarth, @โ€‹markgollnick for your contributions

    0.7.6

    Commits

    Fixed

    Thank you, @โ€‹jftanner, @โ€‹Supraja9726 for your contributions

    Changelog

    Sourced from @โ€‹xmldom/xmldom's changelog.

    0.7.8

    Fixed

    Thank you, @โ€‹fengxinming, for your contributions

    0.9.0-beta.4

    Fixed

    • Security: Prevent inserting DOM nodes when they are not well-formed CVE-2022-39353 In case such a DOM would be created, the part that is not well-formed will be transformed into text nodes, in which xml specific characters like < and > are encoded accordingly. In the upcoming version 0.9.0 those text nodes will no longer be added and an error will be thrown instead. This change can break your code, if you relied on this behavior, e.g. multiple root elements in the past. We consider it more important to align with the specs that we want to be aligned with, considering the potential security issues that might derive from people not being aware of the difference in behavior. Related Spec: https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity

    Chore

    Thank you, @โ€‹XhmikosR, @โ€‹awwright, @โ€‹frumioj, @โ€‹cjbarth, @โ€‹markgollnick for your contributions

    0.8.4

    Fixed

    • Security: Prevent inserting DOM nodes when they are not well-formed CVE-2022-39353 In case such a DOM would be created, the part that is not well-formed will be transformed into text nodes, in which xml specific characters like < and > are encoded accordingly. In the upcoming version 0.9.0 those text nodes will no longer be added and an error will be thrown instead. This change can break your code, if you relied on this behavior, e.g. multiple root elements in the past. We consider it more important to align with the specs that we want to be aligned with, considering the potential security issues that might derive from people not being aware of the difference in behavior. Related Spec: https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity

    Thank you, @โ€‹frumioj, @โ€‹cjbarth, @โ€‹markgollnick for your contributions

    0.7.7

    Fixed

    • Security: Prevent inserting DOM nodes when they are not well-formed CVE-2022-39353 In case such a DOM would be created, the part that is not well-formed will be transformed into text nodes, in which xml specific characters like < and > are encoded accordingly. In the upcoming version 0.9.0 those text nodes will no longer be added and an error will be thrown instead. This change can break your code, if you relied on this behavior, e.g. multiple root elements in the past. We consider it more important to align with the specs that we want to be aligned with, considering the potential security issues that might derive from people not being aware of the difference in behavior. Related Spec: https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Bump moment-timezone from 0.5.34 to 0.5.37

    Bump moment-timezone from 0.5.34 to 0.5.37

    Bumps moment-timezone from 0.5.34 to 0.5.37.

    Changelog

    Sourced from moment-timezone's changelog.

    0.5.37 2022.08-25

    0.5.36 2022.08-25

    • IANA TZDB 2022c
    • improvements/fixes to data pipeline

    0.5.35 2022-08-23

    Thanks to the OpenSSF Alpha-Omega project for reporting these!

    Commits
    • ffe6f34 Add changelog for 0.5.37
    • 450ca63 Bump version to 0.5.37
    • 95f1a9b Build moment-timezone 0.5.36
    • abba28c Add changelog for 0.5.36
    • ac6de03 Bump version to 0.5.36
    • 7a5cadf tests: Fix country tests for 2022c
    • 6754c75 data: generate 2022c data+tests
    • f74a364 bugfix: Wipe tests/zones before generation
    • e850f9f grunt: do not bundle zone and contry tests
    • f13e22b data: automatically create data/*/VERSION.json for latest
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • [WIP] Refactor registration of Sidebars in FormWidget

    [WIP] Refactor registration of Sidebars in FormWidget

    Changed internals of how sidebars are added to replicate the process of adding form properties.

    Added:

    • View 'form-sidebar-widget.ms' to replace `form.sidebar.ms'
    • ~~Method FormSidebarWidget::type() to serve as fallback template path~~
    • Method FormWidget::getSidebars() to retrieve sidebars without side-effects
    • Class property FormWidget::$sortedSidebars to sort only if sidebars changed
    • Support for changing the default FormSidebarWidget class used by FormWidget

    Changed:

    • Renamed dynamic partial 'widget_template' to 'sidebar_widget'
    • Decoupled sidebar creation/registration from method FormWidget::addSidebar()
    • Method DocWidget::sidebars() to reflect FormWidget::sidebars()
    opened by mcaskill 0
Releases(0.30.4)
  • 0.30.4(Jul 14, 2022)

    Key Features

    New group display mode for Quick Form widget (#63)

    Added support for grouping properties by language, for multilingual form properties.

    {
        "type": "charcoal/admin/widget/quick-form",
        "form_ident": "quick-edit",
        "group_display_mode": "lang"
    }
    

    Improve language switcher

    With the aforementioned new feature, new interfaces have been introduced to assist with controlling the form's language switcher:

    • HasLanguageSwitcherInterface โ€” Classes that implement this interface are in charge of displaying or hiding the switcher as well as deciding of that state.
    • LanguageSwitcherAwareInterface โ€” Classes that implement this interface can be used to determine if the language switcher should be displayed or hidden.

    Improved reloading in widget.js

    Added methods:

    • Widget#is_reloading() with internal property to track when a widget is reloading itself.
    • Widget#try_reload() to call Widget#reload() if the widget is not already busy reloading itself.

    Improved error handling in form.js

    Added properties attempts and max_attempts (defaults to 5) to track if the form is busy or blocked/broken and try to warn user with feedback.

    Improved language switching in form.js

    Deprecated custom event switch_language.charcoal in favour of new custom events:

    • beforelanguageswitch.charcoal.form triggered before language switch and allow for cancelling of action via event.preventDefault().
    • languageswitch.charcoal.form triggered after language switch (supersedes switch_language.charcoal).

    Refactored internals of attachment.js

    โš ๏ธ [BC] This MAY break any JS component that extends or customizes Widget_Attachment.

    ๐Ÿฉน Fixed saving issues introduced in 0.30.0

    Repurposed dirty property to track any changes to the blocks:

    • When the sortable positions of blocks have changed.
    • When a block is added.

    Added busy property and methods to track when the widget is processing changes:

    • When blocks are being attached (joined) to a content model or parent block.
    • When a block is being dettached.

    Replaced switch_language.charcoal event listener with listeners on new events for switching language:

    • beforelanguageswitch to check if widget is busy (and cancel the switch) and to check if widget is dirty (and save changes).
    • languageswitch (reload the widget).

    What's new in 0.30.4?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.30.3...0.30.4

    Updated

    • NPM
      • bootstrap-table v1.12.1 โ†’ v1.19.1
      • echarts v5.3.2 โ†’ v5.3.3
      • eslint v6.8.0 โ†’ v8.6.0
      • jsoneditor v9.7.4 โ†’ v9.9.0
      • tinymce v5.10.4 โ†’ v5.10.5

    Added

    • [PHP] Added interface Charcoal\Admin\Ui\FormGroupInterface, which extends Charcoal\Ui\FormGroupInterface, to declare groupProperties() method.
    • [PHP] Added methods hasL10nGroupProperties() and isL10nModelProperty() to decouple property check from iteration of form properties (hasL10nFormProperties()) on ObjectFormWidget.
    • [PHP] Added Sorter utility class to centralize sorting by priority comparator functions to minimize duplicate code.
    • [SCSS] Merged styles from abandoned selectize-bootstrap-4 (papakay/selectize-bootstrap-4-style).

    Changed

    • [PHP] Improved ObjectFormWidget#hasL10nFormProperties() to iterate group properties (instead of the form's properties) on the record model or blank model (instead of just the blank model).
    • [JS] Improved event namespacing in JS components by ensuring EVENT_NAMESPACE property is available as an instance member and a static member.
    • [JS] Improved handling of XHR requests in attachment.js to track failures.
    • [JS] Improved internals of feedback.js, assertion and validation of levels, display modes, and messages.
    • [JS] Improved widget.js with access to the XHR object that handles "widget/load" request to the dialog object to allow others to extend Promise.
    • [JS] Improved validate/save in component_manager.js, by passing scope to help with validating and saving data.
    • [JS] Improved error messages in component_manager.js.
    • Updated ESLint rules to allow coercive equality for null.

    Removed

    • Abandoned NPM dependency papakay/selectize-bootstrap-4-style, merged styles into Admin.

    Fixed

    • [JS] Disabled will_save constraint in attachment.js to revert to initial behaviour of always saving no matter the context.
      • The reason for this is that the attachment widget is often integrated as adjacent to the form widget instead of being nested.
    • [JS] Fixed Charcoal.Admin.resolveSimpleJsonXhr() in charcoal.js.
      • Since Promises are chainable (in this scenario, jQuery's Deferred object), we now ensure we chain the success, failure, and complete callbacks.
    • By merging styles from and removing dependency the abandoned selectize-bootstrap-4:
      • [SCSS] Skip duplicate inclusion of all of Bootstrap v4.
      • [NPM] Misuse of NPM dependencies which installed Gulp (which we don't use) and constrained ESLint to v6 (where grunt-eslint requires v8).
    Source code(tar.gz)
    Source code(zip)
  • 0.30.3(Jul 14, 2022)

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.30.2...0.30.3

    Summary

    • Improved performance of exporter y using LazyCollectionLoader to prevent memory errors when fetching a large collection.
    • Deactivated time limit for exporter controller since large collections will probably take more than the default 30 seconds to export.
    Source code(tar.gz)
    Source code(zip)
  • 0.30.2(May 11, 2022)

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.30.1...0.30.2

    Summary

    Added module assets collection to support JavaScript ES6โ€“ES11.

    Source code(tar.gz)
    Source code(zip)
  • 0.30.1(May 11, 2022)

    Key Features

    Use name in ACL Role for admin users

    โš ๏ธ [BC] This MAY break Adminland or ACL Roles dashboards if Roles do not have a name value.

    Use the ACL Role's name property, instead of its ident, for Admin users.


    What's new in 0.30.1?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.30.0...0.30.1

    Changed

    • Cleaned-up ACF Role class and metadata.

    Removed

    • Removed AclRole#key() method since unchanged from base class in locomotivemtl/charcoal-user.

    Fixed

    • Fixed JSON syntax in config/admin.config.default.json.
    Source code(tar.gz)
    Source code(zip)
  • 0.30.0(May 5, 2022)

    Key Features

    Improved component management

    Previously, when reloading a widget often the new HTML contained a new widget registration call which would duplicate its occurrence in the Component Manager.

    Now, the Component Manager will check if a component was already registered with a given ID and type before adding it to its internal lists.

    These changes should reduce the number of duplicate and obsolete components in the Manager.

    Also, when a widget is reloading, it will now call its destroy() method before injecting the new HTML.

    Improved form/property/widget validation and submission

    โš ๏ธ [BC] This MAY break any JS component that extends Widget_Form or Widget_Quick_Form.

    Previously, Widget_Form#submit_form() and Widget_Quick_Form#submit_form() would call Manager#prepare_submit() which called the Component#validate() and Component#save() methods (if defined) on every registered property input or widget. Unfortunately, any return type from those component methods were ignored preventing a component from stopping form submission and by extension dispatching feedback.

    Now, the form submission can be aborted by a component.

    The Manager#prepare_submit() (via the new method Manager#prepare_components()) will bail early on the first Component#validate() or Component#save() that returns false, otherwise form submission will proceed.

    The Manager#prepare_components() method will also call methods Component#will_validate() and Component#will_save() (if defined), providing the parent component that called it (if provided), to determine if the component should validate or save. This is useful to avoid validating and saving components outside of the form (or other container-type components).

    Any feedback added during these steps will be displayed during the form's request_complete() method.

    Custom events for form validation and submission

    โš ๏ธ [BC] This MAY break any JS event listeners on elements of Widget_Form or Widget_Quick_Form.

    โš ๏ธ [BC] This WILL break saving of Widget_Attachment if declared adjacent to Widget_Form as opposed to nested.

    ๐Ÿฉน Fixed saving issues in 0.30.4

    Added custom events triggered when form validation fails, form submission fails, succeeds, or completes.

    Example of events for Widget_Form:

    $($0).on('failed.charcoal.form', (event) => console.log(event));
    // โ†’ Event {
    //     subtype: 'validation'
    //     component: Widget_Form
    //   }
    // 
    //   Event {
    //     subtype: 'submission'
    //     component: Widget_Form
    //     response: {โ€ฆ}
    //   }
    $($0).on('success.charcoal.form', (event) => console.log(event));
    // โ†’ Event {
    //     subtype: 'submission'
    //     component: Widget_Form
    //     response: {โ€ฆ}
    //   }
    $($0).on('complete.charcoal.form', (event) => console.log(event));
    // โ†’ Event {
    //     subtype: 'submission'
    //     component: Widget_Form
    //     response: {โ€ฆ}
    //   }
    

    Example of equivalent events for Widget_Quick_Form:

    // Widget_Quick_Form
    $($0).on('failed.charcoal.quickform', (event) => console.log(event));
    $($0).on('success.charcoal.quickform', (event) => console.log(event));
    $($0).on('complete.charcoal.quickform', (event) => console.log(event));
    

    Predefined form validation messages

    Added generic form validation messages (localized in English and French) based on browser's default messages for Constraint validation API.

    Useful for providing informative predefined messages when creating validation constraints in PHP or JS.

    Example in JS using formWidgetL10n object:

    formWidgetL10n.validation.badInput;
    
    formWidgetL10n.validation.patternMismatchWithFormat.replace('{{ format }}', 'H0H 0H0');
    

    Example in PHP using the Translator service:

    $translator->trans('form.validation.bad_input');
    
    $translator->trans('form.validation.pattern_mismatch_with_format', [
        '{{ format }}' => 'H0H 0H0'
    ]);
    

    Improved form sidebar appearance

    Added support for position sticky (enabled by default) to improve scrolling of sidebar. Useful if the sidebar is taller than the screen.

    BC Breaks

    If you were previously calling or overriding the submit_form() method on Widget_Form or Widget_Quick_Form:

    1. Replace submit_form() with request_submit().
    2. The two methods no longer receive the form element, use the Widget_Form#$form and Widget_Quick_Form#$form properties respectively.
    3. The new method should trigger a custom failed event if Manager#prepare_submit() returns false.

    The Widget_Form#submit_form() method has been repurposed to only handle the making of XHR request. In its place, the submit event listener will (and developers should) call Widget_Form#request_submit() which will handle validation and then call submit_form().

    If you were previously calling or overriding the enable_form() and disable_form() methods on Widget_Form or Widget_Quick_Form:

    1. The methods no longer receive the form element, use the Widget_Form#$form and Widget_Quick_Form#$form properties respectively.

    If you were previously calling or overriding the request_done(), request_success(), request_failed(), and request_complete() methods on Widget_Form or Widget_Quick_Form:

    1. These methods no longer receive $form or $trigger parameters, use the Widget_Form#$form and Widget_Quick_Form#$form properties respectively and $form.find('[type="submit"]').
    2. The latter three methods should trigger their respective custom events.

    If you were previously using the .charcoal.bs.dialog and .charcoal.form.quick events from Widget_Quick_Form:

    1. Rename those events to .charcoal.quickform.

    What's new in 0.30.0?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.29.1...0.30.0

    Added

    • [JS] Added method Manager#has_component() to check if a raw component or component instance is registered.
    • [JS] Added method Manager#destroy_component() to destroy component and remove a component from manager.
    • [JS] Added method Manager#create_component() to decouple component instantiation.
    • [JS] Added dialog as second parameter to Widget#dialog() callback parameter to be able to interact with dialog.
    • [JS] Added return of dialog in Widget#confirm() instead of void.
    • [JS] Added option with_data to Widget_Attachment's XHR call to load the QuickFormWidget to ensure its widget data is included and used in the dialog.
    • [JS] Added EVENT_NAMESPACE to Widget_Form and Widget_Quick_Form, similar to Property_Input_File and its derivatives.
    • [JS] Added method Widget_Form#add_actions_for_confirmation to decouple adding feedback actions for needs_confirmation response setting.
    • [JS] Added support for customizing the needs confirmation label "Continue" with confirmation_label.
    • [JS] Added method Widget_Form#add_action_for_next_url to decouple adding feedback action to continue to next_url response setting.
    • [JS] Added support for customizing the next URL label "Continue" with next_url_label.
    • [JS] Added support for absolute URIs for next_url.
    • [JS] Added support for custom save_action and update_action URIs on Widget_Form.

    Changed

    • [JS] Reduced duplicate code (such as "conditional groups") and shared missing parity (such as "needs confirmation") between Widget_Form and Widget_Quick_Form.
    • [JS] Improved error messages to include component ID, if available, in Manager.

    Removed

    • [JS] Replaced variable arr in favour of Array.prototype in Component Manager.

    Fixed

    • [JS] Destruction of Widget_Quick_Form when dialog is closed in Widget_Attachment and Widget_Relation to avoid polluting Component Manager with obsolete components.
    • [JS] Close only the current dialog instead of all dialogs in Widget_Form and Property_Input_Selectize_Tags.
    • [CSS] Fixed page scrolling when Bootstrap modal is open.
    Source code(tar.gz)
    Source code(zip)
  • 0.29.1(May 4, 2022)

    Key Features

    Split Selectize property input views

    Moved form control markup and JS component registration from property input view (selectize.ms and selectize/tags.ms) to a separate partial views (selectize/control.ms, selectize/tags/control.ms, and selectize/js.ms), like for TinyMCE property input.

    This will allow for easier customization of a Selectize input view (such as altering the JS registration but not the form control).


    What's new in 0.29.1?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.29.0...0.29.1

    Updated

    • Composer
      • studio-42/elfinder v2.1.60 โ†’ v2.1.61
    • NPM
      • echarts v5.3.0 โ†’ v5.3.2
      • jsoneditor v9.7.2 โ†’ v9.7.4
      • tempusdominus-bootstrap-4 v5.39.0 โ†’ v5.39.2
      • tempusdominus-core v5.19.0 โ†’ v5.19.3
      • tinymce v5.10.3 โ†’ v5.10.4

    Fixed

    • [JS] Escape of single-quote characters in Widget_Search.
    Source code(tar.gz)
    Source code(zip)
  • 0.29.0(Mar 14, 2022)

    Key Features

    Improved model property validation feedback

    The model property's label will be prepended, if missing, to the validator result message to provide context as to which data is invalid when saving changes.


    What's new in 0.29.0?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.28.2...0.29.0

    Added

    • Method FeedbackContainerTrait::addFeedbackFromValidatable()
    • Method FeedbackContainerTrait::addFeedbackFromValidator()
    • Method FeedbackContainerTrait::addFeedbackFromValidatorResult()
    • Method AbstractSaveAction::isValidatable()
    • Method AbstractSaveAction::addFeedbackFromModel() (replaces addFeedbackFromValidation())
    • Method AbstractSaveAction::addFeedbackFromModelValidatorResult()

    Removed

    • Method AbstractSaveAction::addFeedbackFromValidation()
    Source code(tar.gz)
    Source code(zip)
  • 0.28.2(Mar 1, 2022)

    Key Features

    Improved volume localizations for elFinder

    Added support for custom localization of directory and volume names.

    Currently, directories will not be localized but volumes (roots) will be localized based your project's filesystem connection labels (filesystem.connections.<ident>.label) or filesystem connection identifiers (translation key: filesystem.volume.<ident>).

    On its own, elFinder can localize a directory or volume using its basename (translation keys: folder_<basename> and volume_<basename>). This can be problematic with volumes that share the same basename (for example an "uploads" directory in your project's base path and one in your project's public path).

    To enable custom localizations, you need to add an event listener for all elFinder commands to intercept the results:

    {
        "elfinder": {
            "connector": {
                "roots": {/* โ€ฆ */},
                "bind": {
                    "*": [
                        ":translateDirectoriesOnAnyCommand"
                    ]
                }
            }
        }
    }
    

    Afterwards, you can either add translations to your localization files:

    // messages.en.csv
    "filesystem.volume.remote";"External"
    
    // messages.fr.csv
    "filesystem.volume.remote";"Externe"
    

    Or add a label to your filesystem connection.

    {
        "filesystem": {
            "connections": {
                "remote": {
                    "label":  {
                        "en": "External",
                        "fr": "Externe"
                    },
                    "public": false,
                    "type": "sftp",
                    "port": 22,
                    "privateKey": "โ€ฆ",
                    "root": "โ€ฆ",
                    "timeout": 3600
                }
            }
        }
    }
    

    The default filesystem connections, public and private, are already localized in English and French.


    What's new in 0.28.2?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.28.1...0.28.2

    Updated

    • NPM:
      • clipboard v2.0.8 โ†’ v2.0.10
      • echarts v5.2.2 โ†’ v5.3.0
      • jsoneditor v9.6.0 โ†’ v9.7.2
      • postcss v8.4.5 โ†’ v8.4.7
      • tinymce v5.10.2 โ†’ v5.10.3
      • tinymce-i18n v20.12.25 โ†’ v22.2.11

    Added

    • Support for disabling an elFinder localization (using null via application config admin.elfinder.translations.<id>).
    • View partial 'inc.page-header-inner.ms, split from inc.page-header.ms to allow for customizing the page header wrapper.
    • CSS class modifier .-small@to-large to collapsing the fixed height of the page header wrapper.

    Removed

    • Obsolete elFinder option disable_theme.
    • Obsolete property factory from ElfinderConnectorAction controller.

    Changed

    • Replaced Charcoal English localization messages with keys for elFinder, media library, and file manager strings.
    • Renamed English and French localizations of volume_uploads from "Public" to "Storage" to avoid confusion with default file system volumes ("Public" and "Private").
    • Decoupled sanitization from sanitizeOnUploadPreSave() method into dedicated sanitizeFileName() method to improve customizability.
    Source code(tar.gz)
    Source code(zip)
  • 0.28.1(Feb 23, 2022)

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.28.0...0.28.1

    Summary:

    • Improve object save/update action controllers:
      • Prefixed getter methods with get (authorIdent, saveData, and updateData).
      • Added methods SaveAction::filterSaveData() and UpdateAction::filterUpdateData() to allow for subclasses of these controllers to parse/filter data before its merged into the target model.
      • Exclude widget_id and next_url from being merged into target models. These values are defined by the form widget for handling the widget in case of reloads.
    • Fixed labelling typos in file input properties.
    • Fixed focusin event conflict between TinyMCE and Bootstrap Dialog.
    Source code(tar.gz)
    Source code(zip)
  • 0.28.0(Feb 2, 2022)

    Key Features

    Requirements

    Require Node v14.17.

    Dynamic template for form groups partial

    Adds support for swapping out the partial used for rendering the form's collection of groups. Useful to avoid overriding the form widget partial.

    Usage:

    "forms": {
        "default": {
            "groups_template": "app/admin/template/form/my-groups-wrapper",
            "groups": {โ€ฆ}
        }
    }
    
    {{# obj.showNotice }}
        {{> app/admin/template/form/my-custom-notice }}
    {{/ obj.showNotice }}
    
    {{> charcoal/admin/template/form/groups-wrapper }}
    

    Dynamic template for form tabs partial

    Adds support for swapping out the partial used for rendering the form's tabs. Useful to avoid overriding the form widget partial.

    The form widgets use form/nav-tabs.ms, by default. The quick form widgets use form/nav-pills.ms, by default.

    Usage:

    "forms": {
        "default": {
            "tabs_template": "app/admin/template/form/my-custom-tabs",
            "groups": {โ€ฆ}
        }
    }
    

    What's new in 0.28.0?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.27.2...0.28.0

    Updated

    • CDN:
      • Foundation Emails v2.2.1 โ†’ v2.3.1
      • RequireJS v2.3.5 โ†’ v2.3.6
    • Composer:
      • studio-42/elfinder v2.1.59 โ†’ v2.1.60
    • NPM:
      • Dev dependencies
      • Bootstrap v4.6.0 โ†’ v4.6.1
      • eCharts v5.1.2 โ†’ v5.2.2
      • JSON Editor v9.5.1 โ†’ v9.6.0
      • TinyMCE v5.8.2 โ†’ v5.10.2

    Added

    • Add support for minified Admin JS assets; if debug mode is disabled, use minified JS.
    • Add support for novalidate option to disable browser form validation [1c4c4ff].
    • Migrate nav-pills partial from locomotivemtl/charcoal-cms v0.10.0.

    Changed

    • Use minimified assets for JSON Editor.
    • Change eCharts enqueue type from Mustache helper to Assetic helper.
    • Relative path to elFinder Moono theme to take advantage of RequireJS' require.toUrl() method to correctly process relative path as an absolute URI.
    • Clean-up form-based mustache views.

    Fixed

    • Fix line-breaks in compiled assets.
    Source code(tar.gz)
    Source code(zip)
  • 0.27.2(Feb 2, 2022)

    Key Feature

    Refactor ReadonlyInput

    Property value is now rendered as input value instead of display value, by default, to more closely match the fact that the class is a property input.

    Added

    • Input option render_type (defaults to input) to decide if value is rendered using inputVal() or displayVal().
    • Input option show_as_code_block (defaults to false) to render value as <pre> code block.
    • Input option maybe_input_is_serialized (defaults to false) to attempt to parse value as a JSON string to pretty print the value.

    Changed

    • Replaced hasInputVal() with hasPropertyVal().

    What's new in 0.27.2?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.27.1...0.27.2

    Added

    • Methods getDisplayOption() to AbstractPropetyDisplay and getInputOption() to AbstractPropetyInput for retrieving a single option.
    • Methods hasInputPrefix() and hasInputSuffix() to AbstractPropertyInput.

    Changed

    • Updated commonL10n localizations.
    • Improved variable names in Widget\LoadAction.
    • Improved check of non-scalar values in AbstractProperty:hasPropertyVal() method.
    • Improved return value of inputPrefix(), inputSuffix(), and placeholder() on AbstractPropertyInput.
    • Improved resolution of value in setPlaceholder() on AbstractPropertyInput.

    Fixed

    • Fixed display_escape and input_escape setters on property display and property input.
    • Added current language code and locale to FormGroupWidget to fix an edge case where a widget relied on the template controller for the locale and the widget is reloaded via Widget\LoadAction which does not have a controller context.
    Source code(tar.gz)
    Source code(zip)
  • 0.27.1(Feb 2, 2022)

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.27.0...0.27.1

    Updated:

    • locomotivemtl/charcoal-app ~0.8 โ†’ ~0.9
    Source code(tar.gz)
    Source code(zip)
  • 0.27.0(Feb 2, 2022)

    Key Features

    Refactor Property Display + Property Input

    Added base class AbstractProperty and PropertyInterface shared by AbstractPropertyDisplay and AbstractPropertyInput to reduce duplication of code and add missing common features.

    Added get-prefixed methods and changed non-prefixed getters to aliases of the former.

    Escape Property Values

    Added support to escape display and input values. The feature is disabled (false), by default. If the feature is enabled (true), the default function is htmlspecialchars(). The escape option is a function name or expression and optional parameters.

    • For display properties, the option is display_escape.
    • For input properties, the option is input_escape.

    Useful for escaping special characters such as "<" and ">" in email addresses ("[email protected]").

    "email_address": {
        "type": "email",
        "input_type": "charcoal/admin/property/input/readonly",
        "display_escape": true
    }
    
    $input->setEscape('htmlentities');
    
    $input->setEscape(function ($value) {
        return htmlentities($value, ENT_QUOTES, 'UTF-8');
    });
    
    $input->setEscape([
        'function'   => 'htmlentities',
        'parameters' => [ ENT_QUOTES | ENT_IGNORE, 'UTF-8' ],
    ]);
    

    What's new in 0.27.0?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.26.2...0.27.0

    Added

    • Method hasMessage to MessageDispay.
    • Escaping of message in MessageDisplay where HTML is expected.
    • Escaping of value in ReadonlyInput property where HTML is expected.

    Fixed:

    • Undefined variable $val in hasPropertyVal() of AbstractPropertyInput.
    Source code(tar.gz)
    Source code(zip)
  • 0.26.2(Feb 2, 2022)

    Key Feature

    Message Property Display

    New display property allows one to use a property as a placeholder for displaying text, such as a heading or advanced instruction (see example below).

    {
        "heading": {
            "type": "string",
            "storable": false,
            "output_type": "display",
            "display_type": "charcoal/admin/property/display/message",
            "message": {
                "en": "<h3 class=\"pb-2 mb-n2 border-bottom\">My Heading</h3>"
            },
            "show_label": false
        }
    }
    

    What's new in 0.26.2?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.26.1...0.26.2

    Summary

    • Added MessageDisplay property display.
    • Added view service to AbstractPropertyDisplay for parity with AbstractPropertyInput.
    • Changed nav tab tooltip to use tab_title instead of title.
    • Fixed ObjectFormWidget::hasL10nFormProperties(); use prototype model instead of existing model to allow for use with new models.
    Source code(tar.gz)
    Source code(zip)
  • 0.26.1(Sep 29, 2021)

    Key Feature

    Force form to reload page (#52)

    Added an optional form widget property (force_page_reload) that when true will force a page reload after submitting the form.

    Example:

    "admin.edit": {
        "widgets": {
            "form": {
                "type": "charcoal/admin/widget/object-form",
                "obj_type": "app/model/foobar",
                "form_ident": "default",
                "force_page_reload": true
            }
        }
    }
    

    What's new in 0.26.1?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.26.0...0.26.1

    Source code(tar.gz)
    Source code(zip)
  • 0.26.0(Feb 2, 2022)

    Key Features

    Requirements

    • Require PHP ^7.3 or ^8.0.
    • Require Node 14.15 via .nvmrc. This will improve the reliability of installed packages and mitigate accidental major changes to the lock file.

    JSON Editor

    โš ๏ธ [BC] This WILL break any custom assets or views referencing the previous path.

    Moved distribution from assets/dist/scripts/vendors/jsoneditor to assets/dist/jsoneditor.

    TinyMCE

    โš ๏ธ [BC]

    • This MAY break any third-party plugins that do not support TinyMCE v5.
    • This WILL break any custom assets or views referencing the previous path.
    • This WILL break any custom assets or views referencing obsolete themes.

    Migrated from v4 to v5.

    Changed:

    • Moved core distribution from assets/dist/scripts/vendors/tinymce to assets/dist/tinymce.
    • Moved custom plugins from assets/src/scripts/charcoal/admin/tinymce to assets/src/scripts/tinymce.

    Removed:

    • Mobile theme; replaced with Silver theme.
    • Modern theme; replaced with Silver theme.
    • Modern Inline theme; replaced with Silver Inline.
    • Inlite theme; replaced with Quick Toolbar (quickbars) plugin.

    TableWidget object action styles

    Changed pairing of Bootstrap .btn-* styles for row actions. Defaults to "seamless" instead of "dark" when parsing row actions.


    What's new in 0.26.0?

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.25.1...0.26.0

    Updated:

    • Composer:
      • barryvdh/elfinder-flysystem-driver v0.2 โ†’ v0.3
      • phpunit/phpunit v7.5 โ†’ v9.0
      • seld/jsonlint v1.7 โ†’ v1.8
      • squizlabs/php_codesniffer v3.3 โ†’ v3.5
      • tedivm/stash v0.14 โ†’ v0.16
    • NPM:
      • Dev dependencies
      • Bootstrap v4.5.3 โ†’ v4.6.0
      • eCharts v4.9.0 โ†’ v5.1.2
      • elFinder v2.1.57 โ†’ v2.1.59
      • jQuery v3.5.1 โ†’ v3.6.0
      • jQuery UI Bundle v1.12.1 โ†’ v1.12.1-migrate
      • JSON Editor v9.1.2 โ†’ v9.5.1
      • Tempusdominus Bootstrap 4 v5.1.0 โ†’ v5.39.0
      • Tempusdominus Core v5.0.3 โ†’ v5.19.0
      • TinyMCE v4.9.11 โ†’ v5.8.2
      • TinyMCE i18n v19.9.17 โ†’ v20.12.25

    Added:

    • Support to TableWidget for improved end-user customizations to list and object actions.
    • Polyfill for assertArraySubset(), deprecated in PHPUnit v8, and removed in PHPUnit v9.

    Changed:

    • Improved rendering of actions, action button style, and spacing around empty table notice.
    • Cleaned up custom Charcoal plugin for TinyMCE.
    • Cleaned-up unit test classes.

    Removed:

    • JS console log in Login page template.
    • PHP error log in Logout action controller.
    Source code(tar.gz)
    Source code(zip)
  • 0.25.1(Feb 2, 2022)

    Complete commits list: https://github.com/locomotivemtl/charcoal-admin/compare/0.25.0...0.25.1


    Summary:

    • Added support for parsing Translation structures SelectizeInput.
    • Added bootstrap-select localizations to distribution assets.
    • Added localization of SelectizeInput placeholder.
    • Fixed directory permissions of Admin assets in CopyAssetsScript.
    • Fixed constraint of mcaskill/php-html-build-attributes.
    Source code(tar.gz)
    Source code(zip)
  • 0.25.0(Jan 29, 2021)

    Key Features

    Requirements

    • PHP ^7.3
    • locomotivemtl/charcoal-object ~8.0

    BC Breaks

    Assetic collections must be scoped. This container allows adding more files to some collections without overwriting others:

    Before After
    "assets": {
        "collections": {
            "tabulator": {
                "files": [
                    "assets/admin/scripts/property/input/tabulator.js"
                ]
            },
            "utils": {
                "files": [
                    "assets/admin/scripts/utils.js"
                ]
            },
            "js": {
            }
        }
    }
    
    "assets": {
        "collections": {
            "js": {
                "tabulator": {
                    "files": [
                        "assets/admin/scripts/property/input/tabulator.js"
                    ]
                },
                "utils": {
                    "files": [
                        "assets/admin/scripts/utils.js"
                    ]
                }
            }
        }
    }
    

    What's new in 0.25.0?

    Complete commits list: 0.24.6...0.25.0

    Added:

    • Scoping to assets manager collections (see example below).
    • Support for passing a form_data array to SelectizeInput to prefill data in the quick form the same way passing form_data as a URI query parameter would prefil a page form.
    • Methods to ReadonlyInput and PropertyInput to improve checking if value is empty or not.

    Fixed:

    • Merging issues in Assetic collections.
    • Bad reference to master in HierarchichalObjectProperty.
    Source code(tar.gz)
    Source code(zip)
  • 0.24.6(Nov 18, 2020)

    Complete commits list: 0.24.5...0.24.6

    Updated:

    • Vulnerable packages (manually edited the lock file)
    • autoprefixer v9.8.6 โ†’ v10.0.2
    • grunt-postcss v0.9.0 โ†’ @lodder/grunt-postcss v3.0.0
    • Bootstrap v4.5.2 โ†’ v4.5.3
    • eCharts v4.8.0 โ†’ v4.9.0
    • JSON Editor v9.0.4 โ†’ v9.1.2
    • moment.js v2.27.0 โ†’ v2.29.1

    Added:

    • Video input property

    Changed:

    • Compile Admin assets

    Fixed:

    • Audio input property
    Source code(tar.gz)
    Source code(zip)
  • 0.24.5(Oct 26, 2020)

  • 0.24.2(Aug 7, 2020)

  • 0.24.0(Jun 10, 2020)

    Complete commits list: 0.23.10.1...0.24.0

    This release includes many small but important changes and corrections to Charcoal's JS framework.

    Search Widget (PHP)

    • Added support for disabling or customizing the SearchWidget in the CollectionTemplate.
      "dashboards": {
          "admin.collection": {
              "search": false,
              "widgets": {โ€ฆ},
              "layout": {โ€ฆ}
          }
      }
      
      "dashboards": {
          "admin.collection": {
              "search": {
                  "type": "charcoal/admin/widget/app/my-search-widget",
                  "collection_ident": "app/model/list",
                  "properties": [โ€ฆ]
              },
              "widgets": {โ€ฆ},
              "layout": {โ€ฆ}
          }
      }
      

    Search Form (JS)

    • Refactor Widget_Search to add support for passing the search input to widgets.
      • The search_query attribute is assigned to widgets that provide a set_search_query() method in the same way that the presence of set_filters() will receive the search input as a query filter object.
      • The search_query attribute can be used by server-side widgets as an alternative to the complex query filter object.

    Component Options

    • Fixed conflicting usage of opts and data properties.
      • this.opts is a core method of Component that holds the constructor options; MUST not be replaced (as was the case previously)
      • this.data is a local object property that holds the data subset of the constructor options (opts.data)

    Notifications

    • Appropriated suppress_feedback property from Widget_Form.
      • Moved property to Widget._suppress_feedback.
      • Added method Widget.suppress_feedback() to be used from now on.
      if (!this.suppress_feedback()) {
          Charcoal.Admin.feedback().dispatch();
      }
      
      this.suppress_feedback(false);
      
    • Added support for overriding the default display mode for all feedback such as success and notice messages that, by default, are dispatched using toast notifications.
      var alerts = [ { level: 'notice', message: 'โ€ฆ' } ];
      Charcoal.Admin.feedback(alerts).setDisplay('dialog').dispatch();
      
      var alerts = [ { level: 'warning', message: 'โ€ฆ' } ];
      Charcoal.Admin.feedback(alerts).setDisplay('toast').dispatch();
      

    AJAX

    • Added support for error handling and feedback in XHR request to (re)load a widget:
      • Widget.prototype.reload()
    • Added support for error handling and feedback in XHR request to delete an object:
      • Widget_Form.prototype.delete_object()
      protected function preDelete()
      {
          $this->logger->warning(sprintf(
              'Can not delete Section (#%s): Section is immutable.',
              $this->id()
          ));
          throw new Exception(
              $this->translator()->translate('section.delete.immutable')
          );
      }
      
    • Added support to parse any message as feedback in success callback of XHR helper function:
      • Charcoal.Admin.resolveSimpleJsonXhr()
    • Fixed error handling in XHR helper functions:
      • Charcoal.Admin.parseJqXhrResponse()
      • Charcoal.Admin.resolveSimpleJsonXhr()
    Source code(tar.gz)
    Source code(zip)
  • 0.23.5(Mar 6, 2020)

  • 0.23.4(Mar 6, 2020)

  • 0.23.3(Mar 6, 2020)

  • 0.23.1(Mar 2, 2020)

    Complete commits list: 0.23.0...0.23.1

    Summary:

    • Fixed missing parent constructor calls in JavaScript property widgets which prevented them from being stored correctly in the component manager
    • Compiled Admin assets
    Source code(tar.gz)
    Source code(zip)
  • 0.23.0(Mar 2, 2020)

  • 0.22.3(Mar 2, 2020)

  • 0.22.2(Mar 2, 2020)

    Complete commits list: 0.22.1...0.22.2

    Summary:

    • Updated NPM dependencies
    • Updated elFinder to v2.1.53
    • Updated TinyMCE to v4.9.8
    • Updated eCharts to v4.6.0
    • Updated JSON Editor to v8.6.1
    • Replaced JSHint/JSCS with ESLint
    • Removed Yarn Lockfile in favour of NPM Lockfile
    • Compiled Admin assets
    Source code(tar.gz)
    Source code(zip)
Laravel Seo package for Content writer/admin/web master who do not know programming but want to edit/update SEO tags from dashboard

Laravel Seo Tools Laravel is becoming more and more popular and lots of web application are developing. In most of the web application there need some

Tuhin Bepari 130 Dec 23, 2022
Fully customizable and tests supported Laravel admin dashboard for developers.

Laravel Admin dashboard Like Laravel Jetstream but built with Hotwire Turbo + additional perks. Tools used: tailwindcomponents/dashboard Hotwire Turbo

null 12 Nov 1, 2022
Free and open-source Laravel admin dashboard interface built with Livewire & Alpine.js based on Bootstrap 5

Volt Dashboard Laravel Free Frontend Web App for Laravel with Livewire & Alpine.js Never start a development project from scratch again. We've partner

Themesberg 200 Jan 4, 2023
Dashboard to view your http client requests in laravel application

Laravel Blanket is a package with wraps laravel http client requests and provide logs for request and response, also give option to retry any request from dashboard and more...

Ahmed waleed 215 Dec 29, 2022
Laravel Backup Panel provides a dashboard for spatie/laravel-backup package.

Laravel Backup Panel Laravel Backup Panel provides a dashboard for spatie/laravel-backup package. It lets you: create a backup (full | only database |

Pavel Mironchik 366 Dec 6, 2022
1Pilot.io, a universal dashboard to effortlessly manage all your Laravel applications

Website ยท Free Trial ยท Pricing ยท Documentation ยท API ยท Feedback ยท Support [You] What are you, strange being? [1Pilot] Greetings, traveller. I am 1Pilo

1Pilot 10 Nov 21, 2022
Files Course Dashboard EAD with Laravel 9.x

Files Course Dashboard EAD with Laravel 9.x

EspecializaTi 24 Jan 2, 2023
With dadjokes every time you load your control panel you'll be greeted by an epic dad joke on the dashboard.

Filament Dad Jokes Widget With DadJokes every time you load your control panel you'll be greeted by an epic dad joke on the dashboard. Installation Yo

Craig Smith 15 Jan 7, 2023
Awes.io // boilerplate based on Vue, Nuxt, TailwindCSS plus Laravel as a backend. ๐ŸคŸ

Platform for Interactive Business Applications 10x faster to create than the traditional way โ€ข 3x increase application experiences โ€ข 60% decrease in d

Awes.io 753 Dec 30, 2022
Laravel Backend for Learnbot app

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Mobile & Backend developer 4 May 18, 2021
Dead simple Laravel backend support for FilePond js.

Laravel FilePond Backend This package provides a straight forward backend support for Laravel application to work with FilePond file upload javascript

rahulhaque 64 Jan 3, 2023
Web application with Laravel in Backend and VueJS in Frontend

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Benjdia Saad 1 Oct 12, 2021
Laravel application project as Sheina Online Store backend to be built with Laravel and VueJS

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Boas Aditya Christian 1 Jan 11, 2022
Laravel Backend API for the tutorial (Granular permissions with Laravel APIs & React frontend)

Laravel Granular Permissions Backend Getting Started Clone the repository. Install the dependencies composer install Update .env database credentials

Munaf Aqeel Mahdi 4 May 10, 2022
A web app for detecting backend technologies used in a web app, Based on wappalyzer node module

About Techdetector This a web fingerprinting application, it detects back end technologies of a given domain by using the node module wappalyzer. And

Shobi 17 Dec 30, 2022
Generator-hedley - Scaffold a headless Drupal backend, Angular app client, and Behat tests

generator-hedley Scaffold a headless Drupal backend, Angular app client, and Behat tests Hedley is a yeoman generator that scaffolds a headless Drupal

null 99 Jun 3, 2022
PcTools is a proyect developed using {JavaScript,HTML5,CSS} for frontend and {PHP => Mysql} for backend.

PcTools-Proyect PcTools is a proyect developed using {JavaScript,HTML5,CSS} for frontend and {PHP => Mysql} for backend. Future Improvements # Replace

Ihab Fallahy 1 Feb 5, 2022
Backend application using Laravel 9.x REST APIs for games topup from digiflazz.com and payment gateway using xendit.co

TOPUP - Laravel 9.x REST API Documentation is still on progress. For now, you can fork this postman collection Installation Clone this project git clo

Muhammad Athhar Kautsar 46 Dec 17, 2022
Video Chat application built using Metered Video SDK, with PHP Laravel Backend and JavaScript Front-End

Group Video Chat App with PHP Laravel and JavaScript Powered by Metered Video SDK Overview This application is a highly scalable group video calling a

null 2 Aug 18, 2022