diff --git a/plugins/admin/CHANGELOG.md b/plugins/admin/CHANGELOG.md index 4f1ffdb..f3ea696 100644 --- a/plugins/admin/CHANGELOG.md +++ b/plugins/admin/CHANGELOG.md @@ -1,3 +1,10 @@ +# v1.10.38 +## 01/02/2023 + +1. [](#new) + * Update copyright dates + * Keep version number in sync with Grav version + # v1.10.37.1 ## 10/08/2022 diff --git a/plugins/admin/blueprints.yaml b/plugins/admin/blueprints.yaml index 1913b83..f9d63ac 100644 --- a/plugins/admin/blueprints.yaml +++ b/plugins/admin/blueprints.yaml @@ -1,7 +1,7 @@ name: Admin Panel slug: admin type: plugin -version: 1.10.37.1 +version: 1.10.38 description: Adds an advanced administration panel to manage your site icon: empire author: diff --git a/plugins/admin/classes/plugin/Admin.php b/plugins/admin/classes/plugin/Admin.php index ef41488..1d6dee8 100644 --- a/plugins/admin/classes/plugin/Admin.php +++ b/plugins/admin/classes/plugin/Admin.php @@ -1,5 +1,12 @@ component['extends']; $yaml_file = $this->locator->findResource('themes://' . $parent_theme) . '/' . $parent_theme . '.yaml'; - $this->component['config'] = file_get_contents($yaml_file);; + $this->component['config'] = file_get_contents($yaml_file); } if (isset($source_theme)) { @@ -156,8 +156,8 @@ class DevToolsCommand extends ConsoleCommand // Do some filename renaming $base_old_filename = $component_folder . '/' . $current_theme; $base_new_filename = $component_folder . '/' . $new_theme; - @rename( $base_old_filename . '.php', $base_new_filename . '.php'); - @rename( $base_old_filename . '.yaml', $base_new_filename . '.yaml'); + @rename($base_old_filename . '.php', $base_new_filename . '.php'); + @rename($base_old_filename . '.yaml', $base_new_filename . '.yaml'); $camelized_current = $this->inflector::camelize($current_theme); $camelized_new = $this->inflector::camelize($name); @@ -211,7 +211,6 @@ class DevToolsCommand extends ConsoleCommand } echo $source_theme; - } else { /** * Use components folder and twig processing @@ -233,7 +232,7 @@ class DevToolsCommand extends ConsoleCommand $templates = Folder::all($component_folder); try { - foreach($templates as $templateFile) { + foreach ($templates as $templateFile) { if (Utils::endsWith($templateFile, '.twig') && !Utils::endsWith($templateFile, '.html.twig')) { $content = $this->twig->processTemplate($templateFile); $file = File::instance($component_folder . DS . str_replace('.twig', '', $templateFile)); @@ -259,6 +258,20 @@ class DevToolsCommand extends ConsoleCommand $bpname = $this->inflector::hyphenize($this->component['bpname']); rename($component_folder . DS . $type . '.yaml', $component_folder . DS . $bpname . '.yaml'); } + + if ($this->component['flex_name']) { + $flex_classes_folder = $component_folder . DS . 'classes' . DS . 'Flex' . DS . 'Types'; + $flex_name = strtolower($this->inflector::underscorize($this->component['flex_name'])); + $flex_name_camel = $this->inflector::camelize($this->component['flex_name']); + + rename($flex_classes_folder . DS . 'flex_name',$flex_classes_folder . DS . $flex_name_camel); + + rename($flex_classes_folder . DS . $flex_name_camel . DS . 'Object' . '.php',$flex_classes_folder . DS . $flex_name_camel . DS . $flex_name_camel . 'Object' . '.php'); + rename($flex_classes_folder . DS . $flex_name_camel . DS . 'Collection' . '.php',$flex_classes_folder . DS . $flex_name_camel . DS . $flex_name_camel . 'Collection' . '.php'); + + rename($component_folder . DS . 'blueprints' . DS . 'flex-objects' . DS . $type . '.yaml', $component_folder . DS . 'blueprints' . DS . 'flex-objects' . DS . $flex_name . '.yaml'); + } + } $this->output->writeln(''); @@ -318,13 +331,13 @@ class DevToolsCommand extends ConsoleCommand break; case 'description': - if($value === null || trim($value) === '') { + if ($value === null || trim($value) === '') { throw new \RuntimeException('Description cannot be empty'); } break; case 'themename': - if($value === null || trim($value) === '') { + if ($value === null || trim($value) === '') { throw new \RuntimeException('Theme Name cannot be empty'); } diff --git a/plugins/devtools/cli/NewPluginCommand.php b/plugins/devtools/cli/NewPluginCommand.php index f57ee23..d66941d 100644 --- a/plugins/devtools/cli/NewPluginCommand.php +++ b/plugins/devtools/cli/NewPluginCommand.php @@ -3,6 +3,7 @@ namespace Grav\Plugin\Console; use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Question\ChoiceQuestion; use Symfony\Component\Console\Question\Question; require_once(__DIR__ . '/../classes/DevToolsCommand.php'); @@ -35,7 +36,7 @@ class NewPluginCommand extends DevToolsCommand ) ->addOption( 'dev', - null, + null, InputOption::VALUE_OPTIONAL, 'The name/username of the developer' ) @@ -136,11 +137,32 @@ class NewPluginCommand extends DevToolsCommand $this->component['author']['email'] = $io->askQuestion($question); } - $this->component['template'] = 'blank'; + $question = new ChoiceQuestion( + 'Please choose an option', + ['blank' => 'Basic Plugin', + 'flex' => 'Basic Plugin prepared for custom Flex Objects' + ] + ); + $this->component['template'] = $io->askQuestion($question); + + if ($this->component['template'] === 'flex') { + + $question = new Question('Enter Flex Object Name'); + $question->setValidator(function ($value) { + return $this->validate('name', $value); + }); + $this->component['flex_name'] = $io->askQuestion($question); + + $question = new ChoiceQuestion('Please choose a storage type', [ + 'simple' => 'Basic Storage (1 file for all objects) - no media support', + 'file' => 'File Storage (1 file per object)', + 'folder' => 'Folder Storage (1 folder per object)' + ]); + $this->component['flex_storage'] = $io->askQuestion($question); + } $this->createComponent(); return 0; } - } diff --git a/plugins/devtools/components/plugin/blank/README.md.twig b/plugins/devtools/components/plugin/blank/README.md.twig index e9cae52..a64e3fd 100644 --- a/plugins/devtools/components/plugin/blank/README.md.twig +++ b/plugins/devtools/components/plugin/blank/README.md.twig @@ -5,7 +5,7 @@ **This README.md file should be modified to describe the features, installation, configuration, and general usage of the plugin.** -The **{{ component_title }}** Plugin is an extension for [Grav CMS](http://github.com/getgrav/grav). {{ component.description }} +The **{{ component_title }}** Plugin is an extension for [Grav CMS](https://github.com/getgrav/grav). {{ component.description }} ## Installation @@ -13,7 +13,7 @@ Installing the {{ component_title }} plugin can be done in one of three ways: Th ### GPM Installation (Preferred) -To install the plugin via the [GPM](http://learn.getgrav.org/advanced/grav-gpm), through your system's terminal (also called the command line), navigate to the root of your Grav-installation, and enter: +To install the plugin via the [GPM](https://learn.getgrav.org/cli-console/grav-cli-gpm), through your system's terminal (also called the command line), navigate to the root of your Grav-installation, and enter: bin/gpm install {{ component_hyphenated }} @@ -21,13 +21,13 @@ This will install the {{ component_title }} plugin into your `/user/plugins`-dir ### Manual Installation -To install the plugin manually, download the zip-version of this repository and unzip it under `/your/site/grav/user/plugins`. Then rename the folder to `{{ component_hyphenated }}`. You can find these files on [GitHub](https://github.com/{{ developer_hyphenated }}/grav-plugin-{{ component_hyphenated }}) or via [GetGrav.org](http://getgrav.org/downloads/plugins#extras). +To install the plugin manually, download the zip-version of this repository and unzip it under `/your/site/grav/user/plugins`. Then rename the folder to `{{ component_hyphenated }}`. You can find these files on [GitHub](https://github.com/{{ developer_hyphenated }}/grav-plugin-{{ component_hyphenated }}) or via [GetGrav.org](https://getgrav.org/downloads/plugins). You should now have all the plugin files under /your/site/grav/user/plugins/{{ component_hyphenated }} -> NOTE: This plugin is a modular component for Grav which may require other plugins to operate, please see its [blueprints.yaml-file on GitHub](https://github.com/{{ developer_hyphenated }}/grav-plugin-{{ component_hyphenated }}/blob/master/blueprints.yaml). +> NOTE: This plugin is a modular component for Grav which may require other plugins to operate, please see its [blueprints.yaml-file on GitHub](https://github.com/{{ developer_hyphenated }}/grav-plugin-{{ component_hyphenated }}/blob/main/blueprints.yaml). ### Admin Plugin diff --git a/plugins/devtools/components/plugin/flex/CHANGELOG.md.twig b/plugins/devtools/components/plugin/flex/CHANGELOG.md.twig new file mode 100644 index 0000000..37256e0 --- /dev/null +++ b/plugins/devtools/components/plugin/flex/CHANGELOG.md.twig @@ -0,0 +1,5 @@ +# v0.1.0 +## {{ "now"|date("m/d/Y") }} + +1. [](#new) + * ChangeLog started... diff --git a/plugins/devtools/components/plugin/flex/LICENSE.twig b/plugins/devtools/components/plugin/flex/LICENSE.twig new file mode 100644 index 0000000..015a4ae --- /dev/null +++ b/plugins/devtools/components/plugin/flex/LICENSE.twig @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) {{ "now"|date("Y") }} {{ component.author.name }} + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/devtools/components/plugin/flex/README.md.twig b/plugins/devtools/components/plugin/flex/README.md.twig new file mode 100644 index 0000000..a64e3fd --- /dev/null +++ b/plugins/devtools/components/plugin/flex/README.md.twig @@ -0,0 +1,59 @@ +{% set component_title = (component.name|titleize) %} +{% set component_hyphenated = (component.name|hyphenize) %} +{% set developer_hyphenated = (component.author.githubid|hyphenize) %} +# {{ component_title }} Plugin + +**This README.md file should be modified to describe the features, installation, configuration, and general usage of the plugin.** + +The **{{ component_title }}** Plugin is an extension for [Grav CMS](https://github.com/getgrav/grav). {{ component.description }} + +## Installation + +Installing the {{ component_title }} plugin can be done in one of three ways: The GPM (Grav Package Manager) installation method lets you quickly install the plugin with a simple terminal command, the manual method lets you do so via a zip file, and the admin method lets you do so via the Admin Plugin. + +### GPM Installation (Preferred) + +To install the plugin via the [GPM](https://learn.getgrav.org/cli-console/grav-cli-gpm), through your system's terminal (also called the command line), navigate to the root of your Grav-installation, and enter: + + bin/gpm install {{ component_hyphenated }} + +This will install the {{ component_title }} plugin into your `/user/plugins`-directory within Grav. Its files can be found under `/your/site/grav/user/plugins/{{ component_hyphenated }}`. + +### Manual Installation + +To install the plugin manually, download the zip-version of this repository and unzip it under `/your/site/grav/user/plugins`. Then rename the folder to `{{ component_hyphenated }}`. You can find these files on [GitHub](https://github.com/{{ developer_hyphenated }}/grav-plugin-{{ component_hyphenated }}) or via [GetGrav.org](https://getgrav.org/downloads/plugins). + +You should now have all the plugin files under + + /your/site/grav/user/plugins/{{ component_hyphenated }} + +> NOTE: This plugin is a modular component for Grav which may require other plugins to operate, please see its [blueprints.yaml-file on GitHub](https://github.com/{{ developer_hyphenated }}/grav-plugin-{{ component_hyphenated }}/blob/main/blueprints.yaml). + +### Admin Plugin + +If you use the Admin Plugin, you can install the plugin directly by browsing the `Plugins`-menu and clicking on the `Add` button. + +## Configuration + +Before configuring this plugin, you should copy the `user/plugins/{{ component_hyphenated }}/{{ component_hyphenated }}.yaml` to `user/config/plugins/{{ component_hyphenated }}.yaml` and only edit that copy. + +Here is the default configuration and an explanation of available options: + +```yaml +enabled: true +``` + +Note that if you use the Admin Plugin, a file with your configuration named {{component_hyphenated}}.yaml will be saved in the `user/config/plugins/`-folder once the configuration is saved in the Admin. + +## Usage + +**Describe how to use the plugin.** + +## Credits + +**Did you incorporate third-party code? Want to thank somebody?** + +## To Do + +- [ ] Future plans, if any + diff --git a/plugins/devtools/components/plugin/flex/blueprints.yaml.twig b/plugins/devtools/components/plugin/flex/blueprints.yaml.twig new file mode 100644 index 0000000..bd0defd --- /dev/null +++ b/plugins/devtools/components/plugin/flex/blueprints.yaml.twig @@ -0,0 +1,37 @@ +{% set githubid = component.author.githubid ?: component.author.name|hyphenize -%} +name: {{ component.name|titleize }} +slug: {{ component.name|hyphenize }} +type: plugin +version: 0.1.0 +description: {{ component.description }} +icon: plug +author: + name: {{ component.author.name }} + email: {{ component.author.email }} +homepage: https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }} +demo: http://demo.yoursite.com +keywords: grav, plugin, etc +bugs: https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }}/issues +docs: https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }}/blob/develop/README.md +license: MIT + +dependencies: + - { name: grav, version: '>=1.6.0' } + +form: + validation: loose + fields: + enabled: + type: toggle + label: PLUGIN_ADMIN.PLUGIN_STATUS + highlight: 1 + default: 0 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + text_var: + type: text + label: PLUGIN_{{ component.name|underscorize|upper }}.TEXT_VARIABLE + help: PLUGIN_{{ component.name|underscorize|upper }}.TEXT_VARIABLE_HELP diff --git a/plugins/devtools/components/plugin/flex/blueprints/flex-objects/plugin.yaml.twig b/plugins/devtools/components/plugin/flex/blueprints/flex-objects/plugin.yaml.twig new file mode 100644 index 0000000..70e6f15 --- /dev/null +++ b/plugins/devtools/components/plugin/flex/blueprints/flex-objects/plugin.yaml.twig @@ -0,0 +1,132 @@ +title: '{{ component.flex_name|capitalize }}' +description: '{{ component.flex_name|capitalize }}' +type: flex-objects + +# Flex Configuration +config: + # Administration Configuration + admin: + # Admin router (optional) + router: + path: '/{{ component.flex_name|lower|underscorize }}' + + # Admin menu (optional) + menu: + list: + route: '/{{ component.flex_name|lower|underscorize }}' + title: '{{ component.flex_name|capitalize }}' + icon: fa-address-card-o + # Authorization to collection admin + authorize: ['admin.{{ component.flex_name|lower|underscorize }}.list', 'admin.super'] + # Priority -10 .. 10 (highest goes up) + priority: 2 + + # Admin template type / folder + template: default + + # Permissions + permissions: + # Primary permissions + admin.{{ component.flex_name|lower|underscorize }}: + type: crudpl + label: '{{ component.flex_name|capitalize }}' + + # List view + list: + title: name + fields: + published: + field: + type: toggle + label: Published + width: 8 + name: + link: edit + description: + + # Edit View + edit: + title: + template: '{{ object.title }}' + + # Preview View + preview: + enabled: false + route: + #template: '/plugins/flex-objects/directory:contacts' + + # Data Export + export: + enabled: true + method: 'jsonSerialize' + formatter: + class: 'Grav\Framework\File\Formatter\YamlFormatter' + filename: '{{ component.flex_name|lower|underscorize }}' + + # Site Configuration + site: + templates: + collection: + # Lookup for the template layout files for collections of objects + paths: + - 'flex/{TYPE}/collection/{LAYOUT}{EXT}' + object: + # Lookup for the template layout files for objects + paths: + - 'flex/{TYPE}/object/{LAYOUT}{EXT}' + defaults: + # Default template {TYPE}; overridden by filename of this blueprint if template folder exists + type: '{{ component.flex_name|lower|underscorize }}' + # Default template {LAYOUT}; can be overridden in render calls (usually Twig in templates) + layout: default + + # Data Configuration + data: + # Object class to be used, allowing custom methods for the object + object: 'Grav\Plugin\{{ component.name|camelize }}\Flex\Types\{{ component.flex_name|camelize }}\{{ component.flex_name|camelize }}Object' + # Collection class to be used, allowing custom methods for the collections + collection: 'Grav\Plugin\{{ component.name|camelize }}\Flex\Types\{{ component.flex_name|camelize }}\{{ component.flex_name|camelize }}Collection' + # Index class to be used, works as a quick database-like lookup index + index: 'Grav\Common\Flex\Types\Generic\GenericIndex' + storage: + # Storage class, use single file storage (does not support images and assets) + class: 'Grav\Framework\Flex\Storage\{{ component.flex_storage|capitalize }}Storage' + options: + formatter: + # File formatter class, in this case the file is stored in markdown + class: 'Grav\Framework\File\Formatter\JsonFormatter' + # JSON file where all the objects will be stored + folder: user-data://{{ component.flex_name|underscorize }} + search: + # Search options + options: + contains: 1 + # Fields to be searched + fields: + - name + - description + +form: + validation: loose + fields: + published: + type: toggle + label: Published + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.YES + 0: PLUGIN_ADMIN.NO + validate: + type: bool + required: true + name: + type: text + label: Name + validate: + required: true + description: + type: text + label: Description + validate: + required: true diff --git a/plugins/devtools/components/plugin/flex/classes/.gitkeep b/plugins/devtools/components/plugin/flex/classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/plugin/flex/classes/Flex/Types/flex_name/Collection.php.twig b/plugins/devtools/components/plugin/flex/classes/Flex/Types/flex_name/Collection.php.twig new file mode 100644 index 0000000..efbc20d --- /dev/null +++ b/plugins/devtools/components/plugin/flex/classes/Flex/Types/flex_name/Collection.php.twig @@ -0,0 +1,25 @@ + + */ +class {{ component.flex_name|camelize }}Collection extends GenericCollection +{ + +} diff --git a/plugins/devtools/components/plugin/flex/classes/Flex/Types/flex_name/Object.php.twig b/plugins/devtools/components/plugin/flex/classes/Flex/Types/flex_name/Object.php.twig new file mode 100644 index 0000000..07cf6a7 --- /dev/null +++ b/plugins/devtools/components/plugin/flex/classes/Flex/Types/flex_name/Object.php.twig @@ -0,0 +1,25 @@ + +*/ +class {{ component.flex_name|camelize }}Object extends GenericObject +{ + +} diff --git a/plugins/devtools/components/plugin/flex/composer.json.twig b/plugins/devtools/components/plugin/flex/composer.json.twig new file mode 100644 index 0000000..14cfe4f --- /dev/null +++ b/plugins/devtools/components/plugin/flex/composer.json.twig @@ -0,0 +1,30 @@ +{% set githubid = component.author.githubid ?: component.author.name|hyphenize -%} +{ + "name": "{{ githubid|lower }}/{{ component.name|hyphenize }}", + "type": "grav-plugin", + "description": "{{ component.description }}", + "keywords": ["plugin"], + "homepage": "https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }}", + "license": "MIT", + "authors": [ + { + "name": "{{ component.author.name }}", + "email": "{{ component.author.email }}", + "role": "Developer" + } + ], + "require": { + "php": ">=7.1.3" + }, + "autoload": { + "psr-4": { + "Grav\\Plugin\\{{ component.name|camelize }}\\": "classes/" + }, + "classmap": ["{{ component.name|hyphenize }}.php"] + }, + "config": { + "platform": { + "php": "7.1.3" + } + } +} diff --git a/plugins/devtools/components/plugin/flex/languages.yaml.twig b/plugins/devtools/components/plugin/flex/languages.yaml.twig new file mode 100644 index 0000000..855cd0e --- /dev/null +++ b/plugins/devtools/components/plugin/flex/languages.yaml.twig @@ -0,0 +1,4 @@ +en: + PLUGIN_{{ component.name|underscorize|upper }}: + TEXT_VARIABLE: Text Variable + TEXT_VARIABLE_HELP: Text to add to the top of a page diff --git a/plugins/devtools/components/plugin/flex/plugin.php.twig b/plugins/devtools/components/plugin/flex/plugin.php.twig new file mode 100644 index 0000000..f8f5d8a --- /dev/null +++ b/plugins/devtools/components/plugin/flex/plugin.php.twig @@ -0,0 +1,76 @@ + 0, + ]; + + /** + * @return array + * + * The getSubscribedEvents() gives the core a list of events + * that the plugin wants to listen to. The key of each + * array section is the event that the plugin listens to + * and the value (in the form of an array) contains the + * callable (or function) as well as the priority. The + * higher the number the higher the priority. + */ + public static function getSubscribedEvents(): array + { + return [ + 'onPluginsInitialized' => [ + // Uncomment following line when plugin requires Grav < 1.7 + // ['autoload', 100000], + ['onPluginsInitialized', 0] + ], + FlexRegisterEvent::class => [['onRegisterFlex', 0]], + ]; + } + + /** + * Composer autoload + * + * @return ClassLoader + */ + public function autoload(): ClassLoader + { + return require __DIR__ . '/vendor/autoload.php'; + } + + /** + * Initialize the plugin + */ + public function onPluginsInitialized(): void + { + // Don't proceed if we are in the admin plugin + if ($this->isAdmin()) { + return; + } + + // Enable the main events we are interested in + $this->enable([ + // Put your main events here + ]); + } + + public function onRegisterFlex($event): void + { + $flex = $event->flex; + + $flex->addDirectoryType( + '{{ component.flex_name|lower|underscorize }}', + 'blueprints://flex-objects/{{ component.flex_name|lower|underscorize }}.yaml' + ); + + } +} diff --git a/plugins/devtools/components/plugin/flex/plugin.yaml.twig b/plugins/devtools/components/plugin/flex/plugin.yaml.twig new file mode 100644 index 0000000..55e2f2e --- /dev/null +++ b/plugins/devtools/components/plugin/flex/plugin.yaml.twig @@ -0,0 +1,2 @@ +enabled: true +text_var: Custom Text added by the **{{ component.name|titleize }}** plugin (disable plugin to remove) diff --git a/plugins/devtools/components/theme/tailwind/js/main.js b/plugins/devtools/components/theme/tailwind/js/main.js new file mode 100644 index 0000000..8647582 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/js/main.js @@ -0,0 +1,5 @@ +import Alpine from 'alpinejs' + +window.Alpine = Alpine + +Alpine.start() \ No newline at end of file diff --git a/plugins/devtools/components/theme/tailwind/package.json.twig b/plugins/devtools/components/theme/tailwind/package.json.twig index 902fac2..09c8658 100644 --- a/plugins/devtools/components/theme/tailwind/package.json.twig +++ b/plugins/devtools/components/theme/tailwind/package.json.twig @@ -6,25 +6,20 @@ "description": "", "main": "index.js", "scripts": { - "build": "postcss css/site.css -o dist/css/site.css --verbose", - "watch": "postcss css/site.css -o dist/css/site.css --watch --verbose", - "prod" : "postcss css/site.css -o dist/css/site.min.css --env production --verbose" + "build": "npx mix", + "watch": "npx mix watch", + "prod": "npx mix -p" }, "dependencies": {}, "devDependencies": { + "@tailwindcss/forms": "^0.5.0", + "@tailwindcss/typography": "^0.5.2", "alpinejs": "^2.8.2", - "tailwindcss": "^2.1.2", - "@tailwindcss/forms": "^0.3.2", - "@tailwindcss/typography": "^0.4.0", - "tailwindcss-debug-screens": "^2.0.0", - "autoprefixer": "^10.2.5", - "precss": "^4.0.0", - "cssnano": "^4.1.11", - "postcss": "^8.2.9", - "postcss-cli": "^8.3.1", - "postcss-import": "^14.0.1", - "postcss-nested": "^5.0.5", - "postcss-hexrgba": "^2.0.1", - "postcss-color-function": "^4.1.0" + "browser-sync": "^2.27.7", + "browser-sync-webpack-plugin": "^2.3.0", + "laravel-mix": "^6.0.43", + "mix-tailwindcss": "^1.3.0", + "tailwindcss": "^3.0.18", + "tailwindcss-debug-screens": "^2.2.1" } } diff --git a/plugins/devtools/components/theme/tailwind/postcss.config.js b/plugins/devtools/components/theme/tailwind/postcss.config.js deleted file mode 100644 index 655e577..0000000 --- a/plugins/devtools/components/theme/tailwind/postcss.config.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - plugins: { - 'postcss-import': {}, - 'precss': {}, - 'tailwindcss': {}, - 'postcss-nested': {}, - 'autoprefixer': {}, - ...process.env.NODE_ENV === 'production' - ? {'cssnano': {}} : {} - }, -} diff --git a/plugins/devtools/components/theme/tailwind/tailwind.config.js.twig b/plugins/devtools/components/theme/tailwind/tailwind.config.js.twig index 27a4484..9aa99b6 100644 --- a/plugins/devtools/components/theme/tailwind/tailwind.config.js.twig +++ b/plugins/devtools/components/theme/tailwind/tailwind.config.js.twig @@ -1,7 +1,7 @@ -const { colors } = require('tailwindcss/defaultTheme'); +const colors = require('tailwindcss/colors'); module.exports = { - purge: [ + content: [ '../../config/**/*.yaml', '../../pages/**/*.md', './blueprints/**/*.yaml', @@ -62,9 +62,9 @@ module.exports = { extend: {}, }, plugins: [ - require('@tailwindcss/typography'), require('@tailwindcss/forms'), - require('tailwindcss-debug-screens'), + require('@tailwindcss/typography'), + require('tailwindcss-debug-screens') ], important: false, } diff --git a/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig b/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig index 04509fd..643d4de 100644 --- a/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig +++ b/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig @@ -15,10 +15,11 @@ {% endblock head %} {% block stylesheets %} - {% do assets.addCss('theme://dist/css/app' ~ extension ~ '.css', 98) %} + {% do assets.addCss('theme://dist/css/site' ~ extension ~ '.css', 98) %} {% endblock %} {% block javascripts %} + {% do assets.addJs('theme://dist/js/main' ~ extension ~ '.js', 98) %} {% endblock %} {% block assets deferred %} diff --git a/plugins/devtools/components/theme/tailwind/webpack.mix.js b/plugins/devtools/components/theme/tailwind/webpack.mix.js new file mode 100644 index 0000000..a396802 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/webpack.mix.js @@ -0,0 +1,17 @@ +let mix = require('laravel-mix'); +require('mix-tailwindcss'); + +const extension = mix.inProduction() ? '.min' : ''; + +mix.js('js/main.js', `js/main${extension}.js`) + .css('css/site.css', `css/site${extension}.css`) + .tailwind() + .setPublicPath('dist') + .version() + // .browserSync({ + // proxy: 'http://domain.test', + // files: [ + // './dist/mix-manifest.json', + // '../../pages/**/*.md' + // ] + // }) diff --git a/plugins/devtools/languages.yaml b/plugins/devtools/languages.yaml index 2c4d7cf..2026249 100644 --- a/plugins/devtools/languages.yaml +++ b/plugins/devtools/languages.yaml @@ -1,3 +1,7 @@ en: PLUGIN_DEVTOOLS: - COLLISION_CHECK: Online Name Collision Check \ No newline at end of file + COLLISION_CHECK: Online Name Collision Check + +fr: + PLUGIN_DEVTOOLS: + COLLISION_CHECK: Vérification en ligne de collision de noms diff --git a/plugins/flex-objects/CHANGELOG.md b/plugins/flex-objects/CHANGELOG.md index afb1214..ce0cd47 100644 --- a/plugins/flex-objects/CHANGELOG.md +++ b/plugins/flex-objects/CHANGELOG.md @@ -1,3 +1,10 @@ +# v1.3.3 +## 01/04/2023 + +1. [](#improved) + * Save `post-save` action to session + * Set default `post-save` action to `edit` for create and edit + # v1.3.2 ## 12/02/2022 diff --git a/plugins/flex-objects/admin/templates/forms/fields/save-redirect/save-redirect.html.twig b/plugins/flex-objects/admin/templates/forms/fields/save-redirect/save-redirect.html.twig index 2541a3f..92b90c1 100644 --- a/plugins/flex-objects/admin/templates/forms/fields/save-redirect/save-redirect.html.twig +++ b/plugins/flex-objects/admin/templates/forms/fields/save-redirect/save-redirect.html.twig @@ -3,7 +3,7 @@ {% set originalValue = value %} {% set value = (value is null ? field.default : value) %} {% set isNew = key ? false : true %} -{% set savedOption = grav.session.post_entries_save|default('create-new') %} +{% set savedOption = grav.session.post_entries_save|default('edit') %} {% if isNew %} {% set options = {'create-new':'PLUGIN_FLEX_OBJECTS.ACTION.CREATE_NEW', 'edit':'PLUGIN_FLEX_OBJECTS.ACTION.EDIT_ITEM', 'list':'PLUGIN_FLEX_OBJECTS.ACTION.LIST_ITEMS'} %} @@ -12,7 +12,6 @@ {% endif %} {% block input %} - {% set savedOption = not isNew and savedOption == 'create-new' ? 'edit' : savedOption %} {% for key, text in options %} {% set id = field.id|default(field.name) ~ '-' ~ key %} diff --git a/plugins/flex-objects/blueprints.yaml b/plugins/flex-objects/blueprints.yaml index dc93c2f..66c104e 100644 --- a/plugins/flex-objects/blueprints.yaml +++ b/plugins/flex-objects/blueprints.yaml @@ -1,7 +1,7 @@ name: Flex Objects slug: flex-objects type: plugin -version: 1.3.2 +version: 1.3.3 description: Flex Objects plugin allows you to manage Flex Objects in Grav Admin. icon: list-alt author: diff --git a/plugins/flex-objects/classes/Admin/AdminController.php b/plugins/flex-objects/classes/Admin/AdminController.php index 1313cbc..3ba9242 100644 --- a/plugins/flex-objects/classes/Admin/AdminController.php +++ b/plugins/flex-objects/classes/Admin/AdminController.php @@ -907,6 +907,7 @@ class AdminController // Set route to point to the current page. if (!$this->redirect) { $postAction = $request->getParsedBody()['_post_entries_save'] ?? 'edit'; + $this->grav['session']->post_entries_save = $postAction; if ($postAction === 'create-new') { // Create another. $route = $this->referrerRoute->withGravParam('action', null)->withGravParam('', 'add'); diff --git a/plugins/form/CHANGELOG.md b/plugins/form/CHANGELOG.md index 2d9c678..0156059 100644 --- a/plugins/form/CHANGELOG.md +++ b/plugins/form/CHANGELOG.md @@ -1,3 +1,9 @@ +# v7.1.2 +## 01/08/2023 + +1. [](#bugfix) + * Fixes issue with multiplication type BasicCaptcha Math Captcha [#587](https://github.com/getgrav/grav-plugin-form/issues/587) + # v7.1.1 ## 11/29/2022 diff --git a/plugins/form/blueprints.yaml b/plugins/form/blueprints.yaml index 721487a..84f95c2 100644 --- a/plugins/form/blueprints.yaml +++ b/plugins/form/blueprints.yaml @@ -1,7 +1,7 @@ name: Form slug: form type: plugin -version: 7.1.1 +version: 7.1.2 description: Enables forms handling and processing icon: check-square author: diff --git a/plugins/form/classes/BasicCaptcha.php b/plugins/form/classes/BasicCaptcha.php index 4f5a169..61bc10b 100644 --- a/plugins/form/classes/BasicCaptcha.php +++ b/plugins/form/classes/BasicCaptcha.php @@ -32,20 +32,20 @@ class BasicCaptcha // calculator if ($operator === '-') { if ($first_num < $second_num) { - $result = "$second_num-$first_num"; - $captcha_code = $second_num-$first_num; + $result = "$second_num - $first_num"; + $captcha_code = $second_num - $first_num; } else { $result = "$first_num-$second_num"; $captcha_code = $first_num - $second_num; } } elseif ($operator === '*') { - $result = "{$first_num}x{$second_num}"; - $captcha_code = $first_num - $second_num; + $result = "{$first_num} x {$second_num}"; + $captcha_code = $first_num * $second_num; } elseif ($operator === '/') { - $result = "$first_num/ second_num"; + $result = "$first_num / second_num"; $captcha_code = $first_num / $second_num; } elseif ($operator === '+') { - $result = "$first_num+$second_num"; + $result = "$first_num + $second_num"; $captcha_code = $first_num + $second_num; } } else { diff --git a/plugins/login/CHANGELOG.md b/plugins/login/CHANGELOG.md index 78e30e1..f61b561 100644 --- a/plugins/login/CHANGELOG.md +++ b/plugins/login/CHANGELOG.md @@ -1,3 +1,10 @@ +# v3.7.2 +## 01/02/2023 + +1. [](#new) + * Added new `onBeforeSessionStart()` event to store redirect + messages when session is regenerated during login + * Requires Grav `1.7.38` for new event availability + # v3.7.1 ## 06/14/2022 diff --git a/plugins/login/blueprints.yaml b/plugins/login/blueprints.yaml index a904380..ab7cc36 100644 --- a/plugins/login/blueprints.yaml +++ b/plugins/login/blueprints.yaml @@ -1,7 +1,7 @@ name: Login slug: login type: plugin -version: 3.7.1 +version: 3.7.2 testing: false description: Enables user authentication and login screen. icon: sign-in @@ -15,7 +15,7 @@ bugs: https://github.com/getgrav/grav-plugin-login/issues license: MIT dependencies: - - { name: grav, version: '>=1.7.32' } + - { name: grav, version: '>=1.7.38' } - { name: form, version: '>=6.0.0' } - { name: email, version: '>=3.1.6' } diff --git a/plugins/login/login.php b/plugins/login/login.php index 838470c..da908fa 100644 --- a/plugins/login/login.php +++ b/plugins/login/login.php @@ -23,6 +23,7 @@ use Grav\Common\User\Interfaces\UserCollectionInterface; use Grav\Common\User\Interfaces\UserInterface; use Grav\Common\Utils; use Grav\Common\Uri; +use Grav\Events\BeforeSessionStartEvent; use Grav\Events\PluginsLoadedEvent; use Grav\Events\SessionStartEvent; use Grav\Framework\Flex\Interfaces\FlexCollectionInterface; @@ -62,6 +63,9 @@ class LoginPlugin extends Plugin /** @var Invitation|null */ protected $invitation; + protected $temp_redirect; + protected $temp_messages; + /** * @return array */ @@ -70,6 +74,7 @@ class LoginPlugin extends Plugin return [ PluginsLoadedEvent::class => [['onPluginsLoaded', 10]], SessionStartEvent::class => ['onSessionStart', 0], + BeforeSessionStartEvent::class => ['onBeforeSessionStart', 0], PageAuthorizeEvent::class => ['onPageAuthorizeEvent', -10000], 'onPluginsInitialized' => [['initializeSession', 10000], ['initializeLogin', 1000]], 'onTask.login.login' => ['loginController', 0], @@ -124,6 +129,18 @@ class LoginPlugin extends Plugin }; } + /** + * @param BeforeSessionStartEvent $event + * @return void + */ + public function onBeforeSessionStart(BeforeSessionStartEvent $event): void + { + $session = $event->session; + $this->temp_redirect = $session->redirect_after_login ?? null; + $this->temp_messages = $session->messages; + } + + /** * @param SessionStartEvent $event * @return void @@ -132,6 +149,15 @@ class LoginPlugin extends Plugin { $session = $event->session; + if (isset($this->temp_redirect)) { + $session->redirect_after_login = $this->temp_redirect; + unset($this->temp_redirect); + } + if (isset($this->temp_messages)) { + $session->messages = $this->temp_messages; + unset($this->temp_messages); + } + $user = $session->user ?? null; if ($user && $user->exists() && ($this->config()['session_user_sync'] ?? false)) { // User is stored into the filesystem.