diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 0e962caa..cc008c50 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -6,7 +6,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-latest]
+ os: [ubuntu-latest, macos-latest]
php: ['7.4', '8.0']
dependency-version: [prefer-stable]
diff --git a/.htaccess b/.htaccess
index 78941dce..a08fddbc 100755
--- a/.htaccess
+++ b/.htaccess
@@ -17,7 +17,7 @@
RewriteEngine On
-RewriteBase /
+RewriteBase /flextype/
## Begin - Exploits
# If you experience problems on your site block out the operations listed below
diff --git a/.phpunit.result.cache b/.phpunit.result.cache
new file mode 100644
index 00000000..887df1d5
--- /dev/null
+++ b/.phpunit.result.cache
@@ -0,0 +1 @@
+{"version":1,"defects":{"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/FindHelperTest.php::test":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/HelpersTest.php::test":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/EntriesShortcodeTest.php::test":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/RawShortcodeTest.php::test":4,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::has":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::get":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::move":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::copy":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::macro":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::create":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::mixin":4,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::fetch":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::update":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::delete":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesBlogTest.php::create":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/EntriesFieldTest.php::test":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/ParsersFieldTest.php::test":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/PublishedByFieldTest.php::test":3,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/RegistryFieldTest.php::test":4,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/PublishedByFieldTest.php::PublishedByField":3},"times":{"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::create":0.004,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/FilterHelperTest.php::test":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/FindHelperTest.php::test":0.003,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/FlextypeTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/HelpersTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/MarkdownTest.php::test":0.002,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/ShortcodeTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/EntriesShortcodeTest.php::test":0.008,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/RawShortcodeTest.php::test":0.002,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/RegistryShortcodeTest.php::test":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/UrlShortcodeTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/PluginsTest.php::test":0.005,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/FrontmatterTest.php::test":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/JsonTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/NeonTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/PhpArrayTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/PhpCodeTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/YamlTest.php::test":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::has":0.002,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::update":0.004,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::delete":0.007,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::get":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::move":0.008,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::copy":0.009,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::test":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::registry":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::macro":0.012,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::mixin":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesTest.php::fetch":0.007,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/HelpersTest.php::test":0.036,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/FlextypeTest.php::get":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/PluginsTest.php::get":0.007,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/FrontmatterTest.php::encode":0.002,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/FrontmatterTest.php::decode":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/FrontmatterTest.php::get":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/MarkdownTest.php::get":0.002,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/MarkdownTest.php::parse":0.057,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/ShortcodesTest.php::get":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/ShortcodesTest.php::add":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/ShortcodesTest.php::parse":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/JsonTest.php::encode":0.002,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/JsonTest.php::decode":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/JsonTest.php::get":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/NeonTest.php::encode":0.013,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/NeonTest.php::decode":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/NeonTest.php::get":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/PhpArrayTest.php::encode":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/PhpArrayTest.php::decode":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/PhpArrayTest.php::get":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/PhpCodeTest.php::encode":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/PhpCodeTest.php::decode":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/PhpCodeTest.php::get":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/YamlTest.php::encode":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/YamlTest.php::decode":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Serializers\/YamlTest.php::get":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/EntriesShortcodeTest.php::[entries_fetch]":0.004,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/RawShortcodeTest.php::[raw]":0.002,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/RegistryShortcodeTest.php::[registry_get]":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/UrlShortcodeTest.php::[registry_get]":0.001,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Parsers\/Shortcodes\/UrlShortcodeTest.php::[url]":0,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/EntriesBlogTest.php::create":0.008,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/CreatedAtFieldTest.php::test":0.003,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/CreatedByFieldTest.php::test":0.017,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/EntriesFieldTest.php::test":0.005,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/IdFieldTest.php::test":0.005,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/ModifiedAtFieldTest.php::test":0.015,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/ParsersFieldTest.php::test":0.044,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/PublishedAtFieldTest.php::test":0.002,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/PublishedByFieldTest.php::test":0.009,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/RegistryFieldTest.php::test":0.016,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/RoutableFieldTest.php::test":0.007,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/SlugFieldTest.php::test":0.006,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/UuidFieldTest.php::test":0.012,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/VisibilityFieldTest.php::test":0.007,"\/Applications\/MAMP\/htdocs\/flextype\/tests\/src\/flextype\/core\/Entries\/Fields\/PublishedByFieldTest.php::PublishedByField":0.046}}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 86ab04f2..ad000734 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,17 +3,25 @@
### Features
-* **core**: Core updated from Slim 3 to Slim4!
+* **core**: Core updated from Slim 3 to Slim 4!
See: [Upgrade Guide](https://www.slimframework.com/docs/v4/start/upgrade.html)
* **core**: PHP-DI added instead of Pimple DI.
+ See: [Usage Guide](https://php-di.org/doc/frameworks/slim.html)
+
* **entries**: Added ability to create completely customizable high level collections for entries.
- Example: https://github.com/flextype/flextype/issues/563#issuecomment-893507342
+ Example: https://github.com/flextype/flextype/issues/563
-* **entries**: Added new method `getOptions`.
+* **entries**: Added ability to set custom actions for each entries collections.
+
+* **entries**: Added new method `getOptions` to get entries options.
+
+* **entries**: Added new method `setOptions` to set entries options.
+
+* **entries**: Added new method `setRegistry` to set entries registry.
* **entries**: Added ability to override logic for built-in custom fields.
@@ -52,12 +60,65 @@
...
```
-* **media**: Added new Media API based on core Entries API.
+* **endpoints** All Rest API Endpoints codebase were rewritten from scratch.
-* **content**: Added new Content API based on core Entries API.
+* **endpoints** New Rest API Endpoint `/api/utils/cache/clear`.
+
+ ```
+ Clear cache
+
+ endpoint: POST /api/utils/cache/clear
+
+ Body:
+ token - [REQUIRED] - Valid public token.
+ access_token - [REQUIRED] - Valid access token.
+
+ Returns:
+ Returns an empty body with HTTP status 204
+ ```
* **images** League Glide updated to Glide 2.
+* **images** added ablity to define League Glide settings.
+
+ ```yaml
+ api:
+ images:
+
+ # Set to true to enable Images API
+ enabled: true
+
+ # Images driver (gd, imagick)
+ driver: gd
+
+ # Images directory.
+ directory: '/uploads'
+
+ # Images max size
+ max_image_size:
+
+ # Image max width
+ width: 2000
+
+ # Image max height
+ height: 2000
+
+ # Images watermarks
+ watermarks:
+
+ # Images watermarks directory
+ directory: '/watermarks'
+
+ # Images cache
+ cache:
+
+ # Images cache directory
+ directory: '/images'
+
+ # Group of presets for images processing.
+ presets: []
+ ```
+
* **csrf**: Added Atomastic CSRF protection for Cross Site Request Forgery protection by comparing provided token with session token to ensure request validity.
* **serializers**: Added new serializer `Neon`.
@@ -120,7 +181,7 @@
allowed: ['yaml', 'json', 'neon']
```
-* **parsers**: Markdown parser [Commonmark updated to v2](https://commonmark.thephpleague.com/2.0/upgrading/).
+* **parsers**: Markdown parser [Commonmark updated to v2](https://commonmark.thephpleague.com/2.0/upgrading/)
* **parsers**: Added ability to set global settings for all parsers.
@@ -204,7 +265,7 @@
* **cache**: Added new cache driver `Phparray` to storage cache data in raw php arrays files.
-* **helpers**: All core helpers are located in the `/src/flextype/helpers.php`.
+* **helpers**: All core helpers are located in the `/src/flextype/helpers/`.
* **helpers**: Added helper function `app` to get Flextype Application instance.
@@ -214,7 +275,7 @@
* **helpers**: Added helper function `cache` to get Flextype Cache Service.
-* **helpers**: Added helper function `content` to get Flextype Content Service.
+* **helpers**: Added helper function `entries` to get Flextype Entries Service.
* **helpers**: Added helper function `media` to get Flextype Media Service.
@@ -230,13 +291,92 @@
* **helpers**: Added helper function `plugins` to get Flextype Plugins Service.
-* **helpers**: Added helper function `image` to create a new image instance.
+* **helpers**: Added helper function `imageFile` to create a new image instance for image file.
* **helpers**: Added helper function `imageCanvas` to create a new image canvas instance.
-* **helpers**: Added helper function `imageCache` to create a new cached image instance.
+* **helpers**: Added helper function `token` to generate unique token.
-* **macros**: All core macros are located in the `/src/flextype/macros.php`.
+* **helpers**: Added helper function `tokenHash` to generate unique token hash.
+
+* **helpers**: Added helper function `tokenHashValidate` to validate token hash.
+
+* **helpers**: Added helper function `urlFor` to get url for a named route.
+
+* **helpers**: Added helper function `fullUrlFor` to get full url for a named route.
+
+* **helpers**: Added helper function `isCurrentUrl` to determine is current url equal to route name.
+
+* **helpers**: Added helper function `getCurrentUrl` to get current path on given Uri.
+
+* **helpers**: Added helper function `getBasePath` to get base path.
+
+* **helpers**: Added helper function `setBasePath` to set base path.
+
+* **helpers**: Added helper function `redirect` to create redirect.
+
+* **helpers**: Added helper function `upload` to upload files and process uloaded images.
+
+* **uploder**: Added Sirius Uploader for file upload.
+
+ ```yaml
+ # Upload
+ upload:
+
+ # Uploads directory
+ directory: '/uploads'
+
+ # Overwrite existing files.
+ overwrite: true
+
+ # Auto-confirm uploads.
+ autoconfirm: false
+
+ # Prefixing uploads.
+ prefix: ''
+
+ # Validation options
+ validation:
+
+ # Allowed file extensions.
+ allowed_file_extensions: ['gif', 'jpg', 'jpeg', 'png', 'ico', 'webm', 'svg']
+
+ # Maximum file size.
+ max_file_size: '24M'
+
+ # Image validation options
+ image:
+
+ # Image maxiumum and minimum width
+ width:
+ max: 4920
+ min: 100
+
+ # Image maxiumum and minimum height
+ height:
+ max: 3264
+ min: 100
+
+ # Image ratio
+ #ratio:
+ # The option can be a number (eg: 1.3) or a ratio-like string (eg: 4:3, 16:9).
+ # size: 1.3
+
+ # The option error_margin specifies how much the image is allowed to
+ # deviate from the target ratio. Default value is 0.
+ # error_margin: 0
+
+ # Process uploaded files
+ process:
+
+ # Images process settings
+ image:
+
+ # Image quality
+ quality: 70
+ ```
+
+* **macros**: All core macros are located in the `/src/flextype/macros/`.
* **macros**: Added `onlyFromCollection` and `exceptFromCollection` macros for Arrays ([#553](https://github.com/flextype/flextype/issues/553))
@@ -254,49 +394,47 @@
### BREAKING CHANGES
-* **core** Use new helpers functions to access Flextype Services.
+* **helpers** Use new helpers functions to access Flextype Services.
- * use `content()` instead of `flextype('entries')`
+ * use `entries()` instead of `flextype('entries')`
* use `session()` instead of `flextype('session')`
* use `cache()` instead of `flextype('cache')`
* use `app()` instead of `flextype()`
* use `container()` instead of `flextype('container_name_here')`
* use `parsers()` instead of `flextype('parsers')`
* use `serializers()` instead of `flextype('serializers')`
- * use `media()` instead of `flextype('media')`
* use `plugins()` instead of `flextype('plugins')`
* use `emitter()` instead of `flextype('emitter')`
* use `logger()` instead of `flextype('logger')`
* use `registry()` instead of `flextype('registry')`
-* **core**: Use helper function `app` to access Flextype Application instance instead of old helper function `flextype()`.
+* **helpers**: Use helper function `app` to access Flextype Application instance instead of old helper function `flextype()`.
-* **core**: Use helper function `container` to access Flextype Application container instead of old helper function `flextype()` with container name argument.
+* **helpers**: Use helper function `container` to access Flextype Application container instead of old helper function `flextype()` with container name argument.
- * use `container()->get('content')` instead of `flextype('entries')`
- * use `container()->set('content', new Content())` instead of `flextype()['content'] = new Content()`
+ * use `container()->get('entries')` instead of `flextype('entries')`
+ * use `container()->set('content', new Entries())` instead of `flextype()['entries'] = new Entries()`
-* **entries**: Don't use Entries API directly. Instead, you should use API's based on Entries API. e.g. built-in Content API, Media API, or create your own by extending Entries API.
+* **helpers**: Use helper function `filterCollection` instead of old `filter`.
-* **entries**: Project entries moved from `/project/entries/` to `/project/entries/content/`.
+* **tokens**: Project tokens moved from `/project/tokens/` to `/project/entries/tokens/`.
-* **content**: Content API for content manipulations instead of base Entries API.
+* **entries**: Changes for etnries memory storage.
- * use `content()->fetch()` instead of `flextype('entries')->fetch()`
- * use `content()->create()` instead of `flextype('entries')->create()`
- * use `content()->delete()` instead of `flextype('entries')->delete()`
- etc...
-
-* **content**: Changes for content(prev. entries) memory storage.
-
- * use `content()->registry()->get()` instead of `flextype('entries')->storage()->get()`
- * use `content()->registry()->set()` instead of `flextype('entries')->storage()->set()`
- * use `content()->registry()->has()` instead of `flextype('entries')->storage()->has()`
- * use `content()->registry()->delete()` instead of `flextype('entries')->storage()->delete()`
+ * use `entries()->registry()->get()` instead of `flextype('entries')->storage()->get()`
+ * use `entries()->registry()->set()` instead of `flextype('entries')->storage()->set()`
+ * use `entries()->registry()->has()` instead of `flextype('entries')->storage()->has()`
+ * use `entries()->registry()->delete()` instead of `flextype('entries')->storage()->delete()`
note: all method from Atomastic Arrays are available for Arrays Storage Object manipulations
docs: https://github.com/atomastic/arrays
+### Refactoring
+
+* **core**: general code refactoring and improvements.
+
+* **tests**: All unit tests were rewritten.
+
# [0.9.16](https://github.com/flextype/flextype/compare/v0.9.15...v0.9.16) (2021-01-14)
diff --git a/composer.json b/composer.json
index ae32af59..b99f8d82 100755
--- a/composer.json
+++ b/composer.json
@@ -36,19 +36,17 @@
"slim/slim": "^4.8.1",
- "filp/whoops": "^2.14",
-
"league/event": "^2.2.0",
- "league/glide": "^2.0.0",
+ "intervention/image": "^2.6.1",
"phpfastcache/phpfastcache": "^8.0.6",
"respect/validation": "^2.2.3",
"monolog/monolog": "^2.3.2",
"cocur/slugify": "^4.0.0",
- "ramsey/uuid": "^4.1.1",
+ "ramsey/uuid": "^4.2.1",
"symfony/yaml": "^5.3.6",
- "symfony/finder": "^5.3.4",
+ "symfony/finder": "^5.3.7",
"thunderer/shortcode": "^0.7.4",
@@ -56,11 +54,15 @@
"slim/psr7": "^1.4",
"php-di/php-di": "^6.3.4",
"php-di/slim-bridge": "^3.1.1",
- "middlewares/whoops": "^2.0",
- "nette/neon": "^3.2",
+ "nette/neon": "^3.2",
"league/commonmark": "^2.0",
"siriusphp/upload": "^3.0",
+<<<<<<< HEAD
"symfony/console": "^5.3"
+=======
+
+ "filp/whoops": "^2.14"
+>>>>>>> dev
},
"suggest": {
"ext-zend-opcache": "Recommended for better performance",
diff --git a/phpunit.xml b/phpunit.xml
index 69a03bf1..01174ffa 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -11,7 +11,6 @@
- ./app
./src
diff --git a/project/blueprints/accounts-admin/add/blueprint.yaml b/project/blueprints/accounts-admin/add/blueprint.yaml
new file mode 100644
index 00000000..24bea36e
--- /dev/null
+++ b/project/blueprints/accounts-admin/add/blueprint.yaml
@@ -0,0 +1,108 @@
+title: Create new account
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_account_add
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ - name: roles
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: password
+ properties:
+ type: string
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_updated') }}"
+ success: "{{ __('admin_message_entries_api_token_updated') }}"
+ redirect:
+ route: "admin.accounts.edit"
+ args:
+ id: "{{ query.id }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('accounts_admin_create_new_account') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_create') }}"
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputEmail
+ properties:
+ name: id
+ label:
+ value: "{{ __('accounts_admin_email') }}"
+ validation:
+ required: true
+ pattern: '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{1,63}$'
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputPassword
+ properties:
+ name: password
+ label:
+ value: "{{ __('accounts_admin_password') }}"
+ validation:
+ required: true
+ pattern: '(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}'
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Tagify
+ properties:
+ name: roles
+ label:
+ value: "{{ __('accounts_admin_roles') }}"
\ No newline at end of file
diff --git a/project/blueprints/accounts-admin/blueprint.yaml b/project/blueprints/accounts-admin/blueprint.yaml
new file mode 100644
index 00000000..e4fed0a4
--- /dev/null
+++ b/project/blueprints/accounts-admin/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Accounts Admin
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('accounts_admin_accounts') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('admin_create') }}"
+ href: "{{ urlFor('admin.accounts.add') }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/accounts-admin/edit/blueprint.yaml b/project/blueprints/accounts-admin/edit/blueprint.yaml
new file mode 100644
index 00000000..71d42301
--- /dev/null
+++ b/project/blueprints/accounts-admin/edit/blueprint.yaml
@@ -0,0 +1,159 @@
+title: Edit account
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_account_edit
+ process:
+ fields:
+ - name: name
+ properties:
+ type: string
+ - name: bio
+ properties:
+ type: string
+ - name: location
+ properties:
+ type: string
+ - name: website
+ properties:
+ type: string
+ - name: roles
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: new_password
+ properties:
+ type: string
+ - name: id
+ properties:
+ type: string
+ value: "{{ query.id }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_updated') }}"
+ success: "{{ __('admin_message_entries_api_token_updated') }}"
+ redirect:
+ route: "admin.accounts.edit"
+ args:
+ id: "{{ query.id }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('accounts_admin_edit_account') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_save') }}"
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputText
+ properties:
+ name: name
+ label:
+ value: "{{ __('accounts_admin_name') }}"
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputTextarea
+ properties:
+ name: bio
+ rows: 8
+ label:
+ value: "{{ __('accounts_admin_bio') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: InputText
+ properties:
+ name: location
+ label:
+ value: "{{ __('accounts_admin_location') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: InputText
+ properties:
+ name: website
+ label:
+ value: "{{ __('accounts_admin_website') }}"
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: Tagify
+ properties:
+ name: roles
+ label:
+ value: "{{ __('accounts_admin_roles') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: InputPassword
+ properties:
+ name: new_password
+ label:
+ value: "{{ __('accounts_admin_new_password') }}"
\ No newline at end of file
diff --git a/project/blueprints/accounts-admin/login/blueprint.yaml b/project/blueprints/accounts-admin/login/blueprint.yaml
new file mode 100644
index 00000000..d49c8a97
--- /dev/null
+++ b/project/blueprints/accounts-admin/login/blueprint.yaml
@@ -0,0 +1,83 @@
+title: Login
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_account_login
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ - name: password
+ properties:
+ type: string
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 4/12
+ style:
+ margin: 0 auto
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('accounts_admin_login') }}"
+ - type: Row
+ properties:
+ class: g-3 mt-2
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputEmail
+ properties:
+ name: id
+ validation:
+ required: true
+ pattern: '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{1,63}$'
+ label:
+ value: "{{ __('accounts_admin_email') }}"
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputPassword
+ properties:
+ name: password
+ validation:
+ required: true
+ pattern: '(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}'
+ label:
+ value: "{{ __('accounts_admin_password') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mt-4
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit
+ value: "{{ __('accounts_admin_login') }}"
+ - type: Anchor
+ properties:
+ class: btn btn-link
+ value: "{{ __('accounts_admin_forgot_password') }}"
+ href: "./reset-password"
+
\ No newline at end of file
diff --git a/project/blueprints/accounts-admin/registration/blueprint.yaml b/project/blueprints/accounts-admin/registration/blueprint.yaml
new file mode 100644
index 00000000..b77bd35b
--- /dev/null
+++ b/project/blueprints/accounts-admin/registration/blueprint.yaml
@@ -0,0 +1,102 @@
+title: Registration
+icon:
+ set: bootstrap
+ name: file-text
+vars:
+ - name: version
+ type: string
+ value: "@parsers:twig; {{ registry().get('flextype.manifest.version') }}"
+actions:
+ get:
+ - name: foo
+ properties:
+ vars:
+ - name: version
+ type: string
+ value: "@parsers:twig; {{ registry().get('flextype.manifest.version') }}"
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ vars:
+ - name: version
+ type: string
+ value: "@parsers:twig; {{ registry().get('flextype.manifest.version') }}"
+ value: |
+ @parsers:twig;
+ Flextype: {{ version }}
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_account_registration
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ - name: password
+ properties:
+ type: string
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 4/12
+ style:
+ margin: 0 auto
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "@parsers:twig;{{ __('accounts_admin_create_new_account') }} - {{ version }}"
+ - type: Row
+ properties:
+ class: g-3 mt-2
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputEmail
+ properties:
+ name: id
+ label:
+ value: "@parsers:twig;{{ __('accounts_admin_email') }}"
+ validation:
+ required: true
+ pattern: '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{1,63}$'
+ help: "@parsers:twig;{{ __('accounts_admin_installation_email_tip') }}"
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputPassword
+ properties:
+ name: password
+ label:
+ value: "@parsers:twig;{{ __('accounts_admin_password') }}"
+ validation:
+ required: true
+ pattern: '(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}'
+ help: "@parsers:twig;{{ __('accounts_admin_installation_password_tip') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mt-4
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit
+ value: "@parsers:twig;{{ __('accounts_admin_create') }}"
\ No newline at end of file
diff --git a/project/blueprints/accounts-admin/reset-password/blueprint.yaml b/project/blueprints/accounts-admin/reset-password/blueprint.yaml
new file mode 100644
index 00000000..28348839
--- /dev/null
+++ b/project/blueprints/accounts-admin/reset-password/blueprint.yaml
@@ -0,0 +1,70 @@
+title: Reset password
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_account_reset_password
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ - name: password
+ properties:
+ type: string
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 4/12
+ style:
+ margin: 0 auto
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('accounts_admin_reset_password') }}"
+ - type: Row
+ properties:
+ class: g-3 mt-2
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputEmail
+ properties:
+ name: id
+ validation:
+ required: true
+ pattern: '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{1,63}$'
+ label:
+ value: "{{ __('accounts_admin_email') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mt-4
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit
+ value: "{{ __('accounts_admin_reset') }}"
+ - type: Anchor
+ properties:
+ class: btn btn-link
+ value: "{{ __('accounts_admin_cancel') }}"
+ href: "./login"
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/accounts/account/blueprint.yaml b/project/blueprints/admin/entries/accounts/account/blueprint.yaml
new file mode 100644
index 00000000..917845da
--- /dev/null
+++ b/project/blueprints/admin/entries/accounts/account/blueprint.yaml
@@ -0,0 +1,222 @@
+title: Account
+icon:
+ set: bootstrap
+ name: people-circle
+admin:
+ entries:
+ accounts:
+ account:
+ item:
+ emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+
+ blocks:
+ - type: Row
+ properties:
+ class: "m-0"
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: card
+ blocks:
+ - type: Row
+ properties:
+ class: d-flex align-items-center row-hover
+ blocks:
+ - type: Column
+ properties:
+ size: 1/12
+ class: p-2 text-center
+ blocks:
+ - type: Display
+ properties:
+ class: 'asd'
+ value: "{{ icon('person-circle', 'bootstrap') }}"
+ - type: Column
+ properties:
+ size: 10/12
+ blocks:
+ - type: Row
+ properties:
+ class: gy-2
+ blocks:
+ - type: Column
+ properties:
+ size: 5/12
+ class: p-2 px-3
+ blocks:
+ - type: Display
+ properties:
+ wrapper: div
+ style:
+ opacity: .4
+ value: "{{ __('Email') }}"
+ - type: Display
+ properties:
+ wrapper: div
+ value: "{{ strings(entry.id).lastSegment('/') }}"
+ - type: Column
+ properties:
+ size: 1/12
+ class: p-2 text-center
+ blocks:
+ - type: ActionsDropdown
+ properties:
+ items:
+ - href: "{{ urlFor('admin.entries.index') }}?id={{ entry.id }}"
+ value: "{{ __('View') }}"
+ visible: "{{ entry.has_children }}"
+ icon:
+ set: bootstrap
+ name: eye
+ - href: "{{ urlFor('admin.entries.edit') }}?id={{ entry.id }}"
+ value: "{{ __('admin_edit') }}"
+ icon:
+ set: bootstrap
+ name: pencil
+ - href: "{{ urlFor('admin.entries.add') }}?id={{ entry.id }}"
+ value: "{{ __('Add') }}"
+ icon:
+ set: bootstrap
+ name: plus-circle
+ - href: "#"
+ value: "{{ __('admin_duplicate') }}"
+ events:
+ onclick: "event.preventDefault(); document.getElementById('duplicate-content-id-{{ entry.id }}').submit();"
+ icon:
+ set: bootstrap
+ name: files
+ - href: "{{ urlFor('admin.entries.rename') }}?id={{ entry.id }}"
+ value: "{{ __('admin_rename') }}"
+ icon:
+ set: bootstrap
+ name: file-font
+ - href: "{{ urlFor('admin.entries.move') }}?id={{ entry.id }}"
+ value: "{{ __('admin_move') }}"
+ icon:
+ set: bootstrap
+ name: arrow-right-square
+ - href: "#"
+ events:
+ onclick: "confirmationEntryDelete(event, '{{ entry.id }}');"
+ value: "{{ __('admin_delete') }}"
+ icon:
+ set: bootstrap
+ name: trash
+ edit:
+ blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_account_add
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ - name: roles
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: password
+ properties:
+ type: string
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_updated') }}"
+ success: "{{ __('admin_message_entries_api_token_updated') }}"
+ redirect:
+ route: "admin.accounts.edit"
+ args:
+ id: "{{ query.id }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('accounts_admin_create_new_account') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_create') }}"
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputEmail
+ properties:
+ name: id
+ label:
+ value: "{{ __('accounts_admin_email') }}"
+ validation:
+ required: true
+ pattern: '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{1,63}$'
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputPassword
+ properties:
+ name: password
+ label:
+ value: "{{ __('accounts_admin_password') }}"
+ validation:
+ required: true
+ pattern: '(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}'
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Tagify
+ properties:
+ name: roles
+ label:
+ value: "{{ __('accounts_admin_roles') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/accounts/account/item/blueprint.yaml b/project/blueprints/admin/entries/accounts/account/item/blueprint.yaml
new file mode 100644
index 00000000..787659ae
--- /dev/null
+++ b/project/blueprints/admin/entries/accounts/account/item/blueprint.yaml
@@ -0,0 +1,125 @@
+title: Default
+icon:
+ set: bootstrap
+ name: file-text
+vars:
+ - name: foo
+ value: "@parsers:twig; {{ urlFor('admin.entries.deleteProcess') }}"
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ vars:
+ - name: boo
+ value: "boo"
+ value: |
+ @parsers:twig;
+ 1. {{ foo }}
+ 2. {{ boo }}
+
+
+blocks:
+ - type: Row
+ properties:
+ class: "m-0"
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: card
+ blocks:
+ - type: Row
+ properties:
+ class: d-flex align-items-center row-hover
+ blocks:
+ - type: Column
+ properties:
+ size: 1/12
+ class: p-2 text-center
+ blocks:
+ - type: Display
+ properties:
+ value: |
+ @parsers:twig,markdown,shortcode;
+ **Email:** {{ acl().getUserLoggedInEmail() }}
+ **Url:** [url]
+ {#{ icon('person-circle', 'bootstrap') }#}"
+ - type: Column
+ properties:
+ size: 10/12
+ blocks:
+ - type: Row
+ properties:
+ class: gy-2
+ blocks:
+ - type: Column
+ properties:
+ size: 5/12
+ class: p-2 px-3
+ blocks:
+ - type: Display
+ properties:
+ wrapper: div
+ style:
+ opacity: .4
+ value: |
+ @twig
+ - type: Display
+ properties:
+ wrapper: div
+ value: "{{ urlFor('admin.entries.index') }}?id={{ entry.id }}"
+ - type: Column
+ properties:
+ size: 1/12
+ class: p-2 text-center
+ blocks:
+ - type: ActionsDropdown
+ properties:
+ items:
+ - href: "@twig {{ urlFor('admin.entries.index') }}?id={{ entry.id }}"
+ value: "@twig: {{ __('View') }}"
+ visible: "@twig {{ entry.has_children }}"
+ icon:
+ set: bootstrap
+ name: eye
+ - href: "@twig {{ urlFor('admin.entries.edit') }}?id={{ entry.id }}"
+ value: "@twig {{ __('admin_edit') }}"
+ icon:
+ set: bootstrap
+ name: pencil
+ - href: "@twig {{ urlFor('admin.entries.add') }}?id={{ entry.id }} @endtwig"
+ value: "@twig {{ __('Add') }}"
+ icon:
+ set: bootstrap
+ name: plus-circle
+ - href: "#"
+ value: "@twig {{ __('admin_duplicate') }}"
+ events:
+ onclick: "@twig event.preventDefault(); document.getElementById('duplicate-content-id-{{ entry.id }}').submit();"
+ icon:
+ set: bootstrap
+ name: files
+ - href: "@twig {{ urlFor('admin.entries.rename') }}?id={{ entry.id }}"
+ value: "@twig {{ __('admin_rename') }}"
+ icon:
+ set: bootstrap
+ name: file-font
+ - href: "@twig {{ urlFor('admin.entries.move') }}?id={{ entry.id }}"
+ value: "@twig {{ __('admin_move') }}"
+ icon:
+ set: bootstrap
+ name: arrow-right-square
+ - href: "#"
+ events:
+ onclick: "@twig confirmationEntryDelete(event, '{{ entry.id }}');"
+ value: "@twig {{ __('admin_delete') }}"
+ icon:
+ set: bootstrap
+ name: trash
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/accounts/account/move/blueprint.yaml b/project/blueprints/admin/entries/accounts/account/move/blueprint.yaml
new file mode 100644
index 00000000..1d6ed013
--- /dev/null
+++ b/project/blueprints/admin/entries/accounts/account/move/blueprint.yaml
@@ -0,0 +1,90 @@
+title: Move entry
+icon:
+ set: bootstrap
+ name: file-alt
+blocks:
+ - type: Container
+ properties:
+ class: mt-4
+ blocks:
+ - type: Row
+ properties:
+ class: justify-content-center
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_entries_move') }}"
+ class: mb-4
+ - type: Form
+ properties:
+ name: form_entries_move
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ value: "{{ query.id }}"
+ - name: entry_current_id
+ properties:
+ type: string
+ value: "{{ entryCurrentID }}"
+ - name: entry_parent_id
+ properties:
+ type: string
+ value: "{{ entryParentID }}"
+ - name: from
+ properties:
+ type: string
+ - name: to
+ properties:
+ type: string
+ messages:
+ error: "{{ __('admin_message_entries_was_not_moved') }}"
+ success: "{{ __('admin_message_entries_moved') }}"
+ redirect:
+ route: admin.entries.index
+ args:
+ id: "{{ _form.registry.data.to }}"
+ blocks:
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputText
+ properties:
+ name: from
+ value: "{{ entryParentID }}"
+ label:
+ value: "{{ __('admin_from') }}"
+ disabled: true
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: Select2
+ properties:
+ name: to
+ items: "{{ serializers().json.encode(entries) }}"
+ label:
+ value: "{{ __('admin_to') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: pt-2
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit_form_entries_create
+ type: primary
+ value: "{{ __('admin_move') }}"
+ class: js-submit-entry-move-form
+
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/accounts/account/rename/blueprint.yaml b/project/blueprints/admin/entries/accounts/account/rename/blueprint.yaml
new file mode 100644
index 00000000..89a2ec13
--- /dev/null
+++ b/project/blueprints/admin/entries/accounts/account/rename/blueprint.yaml
@@ -0,0 +1,72 @@
+title: Rename entry
+icon:
+ set: bootstrap
+ name: file-alt
+blocks:
+ - type: Container
+ properties:
+ class: mt-4
+ blocks:
+ - type: Row
+ properties:
+ class: justify-content-center
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_rename_entry') }}"
+ class: mb-4
+ - type: Form
+ properties:
+ name: form_entries_rename
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ value: "{{ query.id }}"
+ - name: new_id
+ properties:
+ type: string
+ value: |
+ {% if registry().get('plugins.admin.settings.entries.slugify') %}
+ {{ (strings(query.id).contains('/') ? arraysFromString(query.id, '/').slice(0, -1).toString('/') : query.id) ~ '/' ~ flextype.slugify.slugify(_form.registry.data.name) }}
+ {% else %}
+ {{ (strings(query.id).contains('/') ? arraysFromString(query.id, '/').slice(0, -1).toString('/') : query.id) ~ '/' ~ _form.registry.data.name }}
+ {% endif %}
+ messages:
+ error: "{{ __('admin_message_entries_was_not_renamed') }}"
+ success: "{{ __('admin_message_entries_renamed') }}"
+ redirect:
+ route: admin.entries.index
+ args:
+ id: "{{ (strings(query.id).contains('/') ? arraysFromString(query.id, '/').slice(0, -1).toString('/') : query.id) }}"
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputText
+ properties:
+ name: name
+ label:
+ value: "{{ __('admin_name') }}"
+ help: "{{ __('admin_help_text_for_entries_name') }}"
+ value: "{{ arraysFromString(query.id, '/').last() }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_name_empty_input') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: pt-4
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_rename') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/accounts/blueprint.yaml b/project/blueprints/admin/entries/accounts/blueprint.yaml
new file mode 100644
index 00000000..471a7ea0
--- /dev/null
+++ b/project/blueprints/admin/entries/accounts/blueprint.yaml
@@ -0,0 +1,4 @@
+title: Accounts
+icon:
+ set: bootstrap
+ name: file-text
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/accounts/index/blueprint.yaml b/project/blueprints/admin/entries/accounts/index/blueprint.yaml
new file mode 100644
index 00000000..c6956196
--- /dev/null
+++ b/project/blueprints/admin/entries/accounts/index/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Accounts
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('Accounts') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('Create new account') }}"
+ href: "{{ urlFor('admin.entries.add', {}, {'id': query.id}) }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/accounts/item/blueprint.yaml b/project/blueprints/admin/entries/accounts/item/blueprint.yaml
new file mode 100644
index 00000000..3f2c1475
--- /dev/null
+++ b/project/blueprints/admin/entries/accounts/item/blueprint.yaml
@@ -0,0 +1,126 @@
+title: Default
+icon:
+ set: bootstrap
+ name: file-text
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+
+blocks:
+ - type: Row
+ properties:
+ class: "m-0 {{ urlFor('admin.entries.deleteProcess') }}"
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: card
+ blocks:
+ - type: Row
+ properties:
+ class: d-flex align-items-center row-hover
+ blocks:
+ - type: Column
+ properties:
+ size: 1/12
+ class: p-2 text-center
+ blocks:
+ - type: Display
+ properties:
+ value: "{{ icon('person-circle', 'bootstrap') }}"
+ - type: Column
+ properties:
+ size: 10/12
+ blocks:
+ - type: Row
+ properties:
+ class: gy-2
+ blocks:
+ - type: Column
+ properties:
+ size: 2/12
+ class: p-2 px-3
+ blocks:
+ - type: Display
+ properties:
+ wrapper: div
+ style:
+ opacity: .4
+ value: "{{ __('title') }}"
+ - type: Display
+ properties:
+ wrapper: div
+ value: "{{ entry.title }}"
+ - type: Column
+ properties:
+ size: 2/12
+ class: p-2 px-3
+ blocks:
+ - type: Display
+ properties:
+ wrapper: div
+ style:
+ opacity: .4
+ value: "{{ __('id') }}"
+ - type: Display
+ properties:
+ wrapper: div
+ value: "{{ entry.id }}"
+ - type: Column
+ properties:
+ size: 1/12
+ class: p-2 text-center
+ blocks:
+ - type: ActionsDropdown
+ properties:
+ items:
+ - href: "{{ urlFor('admin.entries.index') }}?id={{ entry.id }}"
+ value: "{{ __('View') }}"
+ visible: "{{ entry.has_children }}"
+ icon:
+ set: bootstrap
+ name: eye
+ - href: "{{ urlFor('admin.entries.edit') }}?id={{ entry.id }}"
+ value: "{{ __('admin_edit') }}"
+ icon:
+ set: bootstrap
+ name: pencil
+ - href: "{{ urlFor('admin.entries.add') }}?id={{ entry.id }}"
+ value: "{{ __('Add') }}"
+ icon:
+ set: bootstrap
+ name: plus-circle
+ - href: "#"
+ value: "{{ __('admin_duplicate') }}"
+ events:
+ onclick: "event.preventDefault(); document.getElementById('duplicate-content-id-{{ entry.id }}').submit();"
+ icon:
+ set: bootstrap
+ name: files
+ - href: "{{ urlFor('admin.entries.rename') }}?id={{ item.id }}"
+ value: "{{ __('admin_rename') }}"
+ icon:
+ set: bootstrap
+ name: file-font
+ - href: "{{ urlFor('admin.entries.move') }}?id={{ item.id }}"
+ value: "{{ __('admin_move') }}"
+ icon:
+ set: bootstrap
+ name: arrow-right-square
+ - href: "#"
+ events:
+ onclick: "confirmationEntryDelete(event, '{{ entry.id }}');"
+ value: "{{ __('admin_delete') }}"
+ icon:
+ set: bootstrap
+ name: trash
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/blueprint.yaml b/project/blueprints/admin/entries/blueprint.yaml
new file mode 100644
index 00000000..8f3644b4
--- /dev/null
+++ b/project/blueprints/admin/entries/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Entries
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "@parsers:twig; {{ __('admin_entries') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('Create new entry') }}"
+ href: "{{ urlFor('admin.entries.add', [], {'id': query.id}) }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/default/add/blueprint.yaml b/project/blueprints/admin/entries/default/add/blueprint.yaml
new file mode 100644
index 00000000..b700c208
--- /dev/null
+++ b/project/blueprints/admin/entries/default/add/blueprint.yaml
@@ -0,0 +1,229 @@
+title: Create new entry
+icon:
+ set: bootstrap
+ name: file-text
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_entries_create
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: id
+ properties:
+ type: string
+ value: |
+ {% if registry().get('plugins.admin.settings.entries.slugify') %}
+ {{ strings(query.id ~ '/' ~ flextype.slugify.slugify(_form.registry.data.name)).trimLeft('/') }}
+ {% else %}
+ {{ strings(query.id ~ '/' ~ _form.registry.data.name).trimLeft('/') }}
+ {% endif %}
+ - name: routable
+ properties:
+ type: bool
+ - name: visibility
+ properties:
+ type: string
+ - name: blueprint
+ properties:
+ type: string
+ - name: published_at
+ properties:
+ type: string
+ - name: publised_by
+ properties:
+ type: string
+ value: "{{ acl().getUserLoggedInUuid() }}"
+ - name: created_by
+ properties:
+ type: string
+ value: "{{ acl().getUserLoggedInUuid() }}"
+ - name: template
+ properties:
+ type: string
+ ignore: "{{ registry().has('plugins.site') ? false : true }}"
+ value: |
+ @parsers:twig;
+ {% if registry().has('plugins.site') %}
+ {% if filesystem().file(PATH_PROJECT ~ '/themes/' ~ registry().get('plugins.site.settings.theme') ~ '/templates/' ~ _form.registry.data.blueprint ~ '.html').exists() %}
+ {{ _form.registry.data.blueprint }}
+ {% else %}
+ default
+ {% endif %}
+ {% endif %}
+ messages:
+ error: "{{ __('admin_message_entries_was_not_created') }}"
+ success: "{{ __('admin_message_entries_created') }}"
+ redirect:
+ route: |
+ @parsers:twig;
+ {% if _form.registry.data.redirect == 'index' %}
+ admin.entries.index
+ {% elseif _form.registry.data.redirect == 'edit' %}
+ admin.entries.edit
+ {% elseif _form.registry.data.redirect == 'add' %}
+ admin.entries.add
+ {% endif %}
+ args:
+ id: "{{ (_form.registry.data.redirect == 'add' or _form.registry.data.redirect == 'index') ? query.id : (strings(query.id).contains('/') ? arraysFromString(query.id, '/').slice(0, -1).toString('/') : query.id) ~ '/' ~ _form.registry.data.name }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_create_new_content') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit_form_entries_create
+ style:
+ display: none
+ - type: ButtonGroup
+ properties:
+ buttons:
+ - type: Button
+ properties:
+ value: "{{ __('admin_create') }}"
+ class: js-submit-entry-create-form
+ data:
+ redirect: index
+ - type: ButtonToggle
+ properties:
+ type: secondary
+ value: "{{ __('admin_create_and_edit') }}"
+ items:
+ - href: "#"
+ value: "{{ __('admin_create_and_edit') }}"
+ class: js-submit-entry-create-form
+ data:
+ redirect: edit
+ - href: "#"
+ value: "{{ __('admin_create_and_add') }}"
+ class: js-submit-entry-create-form
+ data:
+ redirect: add
+ - type: InputHidden
+ properties:
+ name: current_id
+ value: "{{ query.id }}"
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_entries_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: InputText
+ properties:
+ name: name
+ label:
+ value: "{{ __('admin_name') }}"
+ class: js-name
+ help: "{{ __('admin_help_text_for_entries_name') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_name_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: routable
+ value: true
+ items: "{{ serializers().json.encode(routable) }}"
+ label:
+ value: "{{ __('admin_routable') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: visibility
+ value: visible
+ items: "{{ serializers().json.encode(visibility) }}"
+ label:
+ value: "{{ __('admin_visibility') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: blueprint
+ items: "{{ serializers().json.encode(blueprints) }}"
+ label:
+ value: "{{ __('admin_blueprint') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Flatpickr
+ properties:
+ name: published_at
+ label:
+ value: "{{ __('admin_published_at') }}"
+
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/default/blueprint.yaml b/project/blueprints/admin/entries/default/blueprint.yaml
new file mode 100644
index 00000000..09bb847b
--- /dev/null
+++ b/project/blueprints/admin/entries/default/blueprint.yaml
@@ -0,0 +1,249 @@
+title: Default
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_entries_edit
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ value: "{{ query.id }}"
+ - name: title
+ properties:
+ type: string
+ - name: content
+ properties:
+ type: string
+ - name: description
+ properties:
+ type: string
+ - name: routable
+ properties:
+ type: bool
+ - name: visibility
+ properties:
+ type: string
+ - name: published_at
+ properties:
+ type: string
+ - name: source
+ properties:
+ type: string
+ - name: template
+ properties:
+ ignore: "{{ registry().has('plugins.site') ? false : true }}"
+ type: string
+ - name: menu_item_title
+ properties:
+ type: string
+ - name: menu_item_url
+ properties:
+ type: string
+ - name: menu_item_target
+ properties:
+ type: string
+ - name: menu_item_order
+ properties:
+ type: int
+ messages:
+ error: "{{ __('admin_message_entries_changes_not_saved') }}"
+ success: "{{ __('admin_message_entries_changes_saved') }}"
+ redirect:
+ route: admin.entries.edit
+ args:
+ id: "{{ query.id }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_edit_content') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ class: js-submit-entries-form-editor
+ value: "{{ __('admin_save') }}"
+ id: submit
+ - type: Tabs
+ properties:
+ tabs:
+ main:
+ title: "{{ __('admin_main') }}"
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3
+ blocks:
+ - type: Trumbowyg
+ properties:
+ name: content
+ label:
+ value: "{{ __('admin_entries') }}"
+ options:
+ btns:
+ - strong
+ - em
+ - del
+ - link
+ - insertImage
+ - viewHTML
+ settings:
+ title: "{{ __('admin_settings') }}"
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: Heading
+ properties:
+ value: "{{ __('admin_general') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3
+ blocks:
+ - type: InputTextarea
+ properties:
+ name: description
+ validation:
+ required: true
+ rows: 3
+ label:
+ value: "{{ __('admin_description') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: template
+ label:
+ value: "{{ __('admin_template') }}"
+ items: "{{ serializers().json.encode(templates) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: routable
+ label:
+ value: "{{ __('admin_routable') }}"
+ items: "{{ serializers().json.encode(routable) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: visibility
+ label:
+ value: "{{ __('admin_visibility') }}"
+ items: "{{ serializers().json.encode(visibility) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Flatpickr
+ properties:
+ name: published_at
+ label:
+ value: "{{ __('admin_published_at') }}"
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: Heading
+ properties:
+ value: "{{ __('admin_menu') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputText
+ properties:
+ name: menu_item_title
+ label:
+ value: "{{ __('admin_menu_item_title') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputText
+ properties:
+ name: menu_item_url
+ label:
+ value: "{{ __('admin_menu_item_url') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: menu_item_target
+ label:
+ value: "{{ __('admin_menu_item_target') }}"
+ items: { _self: _self, _blank: _blank, _parent: _parent, _top: _top }
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputNumber
+ properties:
+ name: menu_item_order
+ label:
+ value: "{{ __('admin_menu_item_order') }}"
+ value: 1
+
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/default/index/blueprint.yaml b/project/blueprints/admin/entries/default/index/blueprint.yaml
new file mode 100644
index 00000000..9b22b64b
--- /dev/null
+++ b/project/blueprints/admin/entries/default/index/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Entries
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_entries') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('Create new entry') }}"
+ href: "{{ urlFor('admin.entries.add', {}, {'id': query.id}) }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/default/item/blueprint.yaml b/project/blueprints/admin/entries/default/item/blueprint.yaml
new file mode 100644
index 00000000..25d88643
--- /dev/null
+++ b/project/blueprints/admin/entries/default/item/blueprint.yaml
@@ -0,0 +1,126 @@
+title: Default
+icon:
+ set: bootstrap
+ name: file-text
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+
+blocks:
+ - type: Row
+ properties:
+ class: m-0
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: card
+ blocks:
+ - type: Row
+ properties:
+ class: d-flex align-items-center row-hover
+ blocks:
+ - type: Column
+ properties:
+ size: 1/12
+ class: p-2 text-center
+ blocks:
+ - type: Display
+ properties:
+ value: "{{ icon('file-text', 'bootstrap') }}"
+ - type: Column
+ properties:
+ size: 10/12
+ blocks:
+ - type: Row
+ properties:
+ class: gy-2
+ blocks:
+ - type: Column
+ properties:
+ size: 2/12
+ class: p-2 px-3
+ blocks:
+ - type: Display
+ properties:
+ wrapper: div
+ style:
+ opacity: .4
+ value: "{{ __('title') }}"
+ - type: Display
+ properties:
+ wrapper: div
+ value: "{{ entry.title }}"
+ - type: Column
+ properties:
+ size: 2/12
+ class: p-2 px-3
+ blocks:
+ - type: Display
+ properties:
+ wrapper: div
+ style:
+ opacity: .4
+ value: "{{ __('id') }}"
+ - type: Display
+ properties:
+ wrapper: div
+ value: "{{ entry.id }}"
+ - type: Column
+ properties:
+ size: 1/12
+ class: p-2 text-center
+ blocks:
+ - type: ActionsDropdown
+ properties:
+ items:
+ - href: "{{ urlFor('admin.entries.index') }}?id={{ entry.id }}"
+ value: "{{ __('View') }}"
+ visible: "{{ entry.has_children }}"
+ icon:
+ set: bootstrap
+ name: eye
+ - href: "{{ urlFor('admin.entries.edit') }}?id={{ entry.id }}"
+ value: "{{ __('admin_edit') }}"
+ icon:
+ set: bootstrap
+ name: pencil
+ - href: "{{ urlFor('admin.entries.add') }}?id={{ entry.id }}"
+ value: "{{ __('Add') }}"
+ icon:
+ set: bootstrap
+ name: plus-circle
+ - href: "#"
+ value: "{{ __('admin_duplicate') }}"
+ events:
+ onclick: "event.preventDefault(); document.getElementById('duplicate-content-id-{{ entry.id }}').submit();"
+ icon:
+ set: bootstrap
+ name: files
+ - href: "{{ urlFor('admin.entries.rename') }}?id={{ item.id }}"
+ value: "{{ __('admin_rename') }}"
+ icon:
+ set: bootstrap
+ name: file-font
+ - href: "{{ urlFor('admin.entries.move') }}?id={{ item.id }}"
+ value: "{{ __('admin_move') }}"
+ icon:
+ set: bootstrap
+ name: arrow-right-square
+ - href: "#"
+ events:
+ onclick: "confirmationEntryDelete(event, '{{ entry.id }}');"
+ value: "{{ __('admin_delete') }}"
+ icon:
+ set: bootstrap
+ name: trash
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/default/move/blueprint.yaml b/project/blueprints/admin/entries/default/move/blueprint.yaml
new file mode 100644
index 00000000..1d6ed013
--- /dev/null
+++ b/project/blueprints/admin/entries/default/move/blueprint.yaml
@@ -0,0 +1,90 @@
+title: Move entry
+icon:
+ set: bootstrap
+ name: file-alt
+blocks:
+ - type: Container
+ properties:
+ class: mt-4
+ blocks:
+ - type: Row
+ properties:
+ class: justify-content-center
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_entries_move') }}"
+ class: mb-4
+ - type: Form
+ properties:
+ name: form_entries_move
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ value: "{{ query.id }}"
+ - name: entry_current_id
+ properties:
+ type: string
+ value: "{{ entryCurrentID }}"
+ - name: entry_parent_id
+ properties:
+ type: string
+ value: "{{ entryParentID }}"
+ - name: from
+ properties:
+ type: string
+ - name: to
+ properties:
+ type: string
+ messages:
+ error: "{{ __('admin_message_entries_was_not_moved') }}"
+ success: "{{ __('admin_message_entries_moved') }}"
+ redirect:
+ route: admin.entries.index
+ args:
+ id: "{{ _form.registry.data.to }}"
+ blocks:
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputText
+ properties:
+ name: from
+ value: "{{ entryParentID }}"
+ label:
+ value: "{{ __('admin_from') }}"
+ disabled: true
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: Select2
+ properties:
+ name: to
+ items: "{{ serializers().json.encode(entries) }}"
+ label:
+ value: "{{ __('admin_to') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: pt-2
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit_form_entries_create
+ type: primary
+ value: "{{ __('admin_move') }}"
+ class: js-submit-entry-move-form
+
\ No newline at end of file
diff --git a/project/blueprints/admin/entries/default/rename/blueprint.yaml b/project/blueprints/admin/entries/default/rename/blueprint.yaml
new file mode 100644
index 00000000..2e463053
--- /dev/null
+++ b/project/blueprints/admin/entries/default/rename/blueprint.yaml
@@ -0,0 +1,72 @@
+title: Rename entry
+icon:
+ set: bootstrap
+ name: file-alt
+blocks:
+ - type: Container
+ properties:
+ class: mt-4
+ blocks:
+ - type: Row
+ properties:
+ class: justify-content-center
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_rename_content') }}"
+ class: mb-4
+ - type: Form
+ properties:
+ name: form_entries_rename
+ process:
+ fields:
+ - name: id
+ properties:
+ type: string
+ value: "{{ query.id }}"
+ - name: new_id
+ properties:
+ type: string
+ value: |
+ {% if registry().get('plugins.admin.settings.entries.slugify') %}
+ {{ (strings(query.id).contains('/') ? arraysFromString(query.id, '/').slice(0, -1).toString('/') : query.id) ~ '/' ~ flextype.slugify.slugify(_form.registry.data.name) }}
+ {% else %}
+ {{ (strings(query.id).contains('/') ? arraysFromString(query.id, '/').slice(0, -1).toString('/') : query.id) ~ '/' ~ _form.registry.data.name }}
+ {% endif %}
+ messages:
+ error: "{{ __('admin_message_entries_was_not_renamed') }}"
+ success: "{{ __('admin_message_entries_renamed') }}"
+ redirect:
+ route: admin.entries.index
+ args:
+ id: "{{ (strings(query.id).contains('/') ? arraysFromString(query.id, '/').slice(0, -1).toString('/') : query.id) }}"
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputText
+ properties:
+ name: name
+ label:
+ value: "{{ __('admin_name') }}"
+ help: "{{ __('admin_help_text_for_entries_name') }}"
+ value: "{{ arraysFromString(query.id, '/').last() }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_name_empty_input') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: pt-4
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_rename') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/plugins/blueprint.yaml b/project/blueprints/admin/plugins/blueprint.yaml
new file mode 100644
index 00000000..19f14fdb
--- /dev/null
+++ b/project/blueprints/admin/plugins/blueprint.yaml
@@ -0,0 +1,30 @@
+title: Plugin
+type: plugins
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_plugins') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('admin_get_more_plugins') }}"
+ href: "https://flextype.org/downloads/extend/plugins"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/plugins/information/blueprint.yaml b/project/blueprints/admin/plugins/information/blueprint.yaml
new file mode 100644
index 00000000..f6f772d6
--- /dev/null
+++ b/project/blueprints/admin/plugins/information/blueprint.yaml
@@ -0,0 +1,20 @@
+title: Plugin Information
+type: plugins
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_information') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/plugins/settings/blueprint.yaml b/project/blueprints/admin/plugins/settings/blueprint.yaml
new file mode 100644
index 00000000..733cbb4a
--- /dev/null
+++ b/project/blueprints/admin/plugins/settings/blueprint.yaml
@@ -0,0 +1,68 @@
+title: Plugin Settings
+type: plugins
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_settings
+ process:
+ fields:
+ - name: settings
+ properties:
+ type: string
+ - name: id
+ properties:
+ type: string
+ value: "{{ query.id }}"
+ messages:
+ error: "{{ __('admin_message_settings_was_not_saved') }}"
+ success: "{{ __('admin_message_settings_saved') }}"
+ redirect:
+ route: admin.settings.index
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_settings') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_save') }}"
+ id: submit
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: Codemirror
+ properties:
+ name: settings
+ value: "{{ settings }}"
+ options:
+ mode: yaml
+
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/access/add/blueprint.yaml b/project/blueprints/admin/system/api/access/add/blueprint.yaml
new file mode 100644
index 00000000..ffe1283b
--- /dev/null
+++ b/project/blueprints/admin/system/api/access/add/blueprint.yaml
@@ -0,0 +1,209 @@
+title: Create new token
+icon:
+ set: bootstrap
+ name: file-text
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_create
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ value: 0
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: created_at
+ properties:
+ type: string
+ value: "{{ time }}"
+ - name: created_by
+ properties:
+ type: string
+ value: "{{ acl().getUserLoggedInUuid() }}"
+ - name: uuid
+ properties:
+ type: string
+ value: "{{ uuid }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_created') }}"
+ success: "{{ __('admin_message_entries_api_token_created') }}"
+ redirect:
+ route: |
+ {% if _form.registry.data.redirect == 'index' %}
+ admin.api.tokens
+ {% elseif _form.registry.data.redirect == 'edit' %}
+ admin.api.edit
+ {% elseif _form.registry.data.redirect == 'add' %}
+ admin.api.add
+ {% endif %}
+ args:
+ api: "{{ query.api }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_create_new_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit_form_token_create
+ style:
+ display: none
+ - type: ButtonGroup
+ properties:
+ buttons:
+ - type: Button
+ properties:
+ value: "{{ __('admin_create') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: index
+ - type: ButtonToggle
+ properties:
+ type: secondary
+ value: "{{ __('admin_create_and_edit') }}"
+ items:
+ - href: "#"
+ value: "{{ __('admin_create_and_edit') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: edit
+ - href: "#"
+ value: "{{ __('admin_create_and_add') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: add
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/access/blueprint.yaml b/project/blueprints/admin/system/api/access/blueprint.yaml
new file mode 100644
index 00000000..568442f1
--- /dev/null
+++ b/project/blueprints/admin/system/api/access/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Entries
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_entries') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('admin_create_new_token') }}"
+ href: "{{ urlFor('admin.api.add', {}, {'api': query.api}) }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/access/edit/blueprint.yaml b/project/blueprints/admin/system/api/access/edit/blueprint.yaml
new file mode 100644
index 00000000..8908ef88
--- /dev/null
+++ b/project/blueprints/admin/system/api/access/edit/blueprint.yaml
@@ -0,0 +1,157 @@
+title: Edit token
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_edit
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: token
+ properties:
+ type: string
+ value: "{{ query.token }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_updated') }}"
+ success: "{{ __('admin_message_entries_api_token_updated') }}"
+ redirect:
+ route: "admin.api.edit"
+ args:
+ api: "{{ query.api }}"
+ token: "{{ query.token }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_edit_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_save') }}"
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/blueprint.yaml b/project/blueprints/admin/system/api/blueprint.yaml
new file mode 100644
index 00000000..71356ecd
--- /dev/null
+++ b/project/blueprints/admin/system/api/blueprint.yaml
@@ -0,0 +1,19 @@
+title: API
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_api') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/entries/add/blueprint.yaml b/project/blueprints/admin/system/api/entries/add/blueprint.yaml
new file mode 100644
index 00000000..ffe1283b
--- /dev/null
+++ b/project/blueprints/admin/system/api/entries/add/blueprint.yaml
@@ -0,0 +1,209 @@
+title: Create new token
+icon:
+ set: bootstrap
+ name: file-text
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_create
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ value: 0
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: created_at
+ properties:
+ type: string
+ value: "{{ time }}"
+ - name: created_by
+ properties:
+ type: string
+ value: "{{ acl().getUserLoggedInUuid() }}"
+ - name: uuid
+ properties:
+ type: string
+ value: "{{ uuid }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_created') }}"
+ success: "{{ __('admin_message_entries_api_token_created') }}"
+ redirect:
+ route: |
+ {% if _form.registry.data.redirect == 'index' %}
+ admin.api.tokens
+ {% elseif _form.registry.data.redirect == 'edit' %}
+ admin.api.edit
+ {% elseif _form.registry.data.redirect == 'add' %}
+ admin.api.add
+ {% endif %}
+ args:
+ api: "{{ query.api }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_create_new_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit_form_token_create
+ style:
+ display: none
+ - type: ButtonGroup
+ properties:
+ buttons:
+ - type: Button
+ properties:
+ value: "{{ __('admin_create') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: index
+ - type: ButtonToggle
+ properties:
+ type: secondary
+ value: "{{ __('admin_create_and_edit') }}"
+ items:
+ - href: "#"
+ value: "{{ __('admin_create_and_edit') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: edit
+ - href: "#"
+ value: "{{ __('admin_create_and_add') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: add
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/entries/blueprint.yaml b/project/blueprints/admin/system/api/entries/blueprint.yaml
new file mode 100644
index 00000000..568442f1
--- /dev/null
+++ b/project/blueprints/admin/system/api/entries/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Entries
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_entries') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('admin_create_new_token') }}"
+ href: "{{ urlFor('admin.api.add', {}, {'api': query.api}) }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/entries/edit/blueprint.yaml b/project/blueprints/admin/system/api/entries/edit/blueprint.yaml
new file mode 100644
index 00000000..8908ef88
--- /dev/null
+++ b/project/blueprints/admin/system/api/entries/edit/blueprint.yaml
@@ -0,0 +1,157 @@
+title: Edit token
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_edit
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: token
+ properties:
+ type: string
+ value: "{{ query.token }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_updated') }}"
+ success: "{{ __('admin_message_entries_api_token_updated') }}"
+ redirect:
+ route: "admin.api.edit"
+ args:
+ api: "{{ query.api }}"
+ token: "{{ query.token }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_edit_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_save') }}"
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/images/add/blueprint.yaml b/project/blueprints/admin/system/api/images/add/blueprint.yaml
new file mode 100644
index 00000000..ffe1283b
--- /dev/null
+++ b/project/blueprints/admin/system/api/images/add/blueprint.yaml
@@ -0,0 +1,209 @@
+title: Create new token
+icon:
+ set: bootstrap
+ name: file-text
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_create
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ value: 0
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: created_at
+ properties:
+ type: string
+ value: "{{ time }}"
+ - name: created_by
+ properties:
+ type: string
+ value: "{{ acl().getUserLoggedInUuid() }}"
+ - name: uuid
+ properties:
+ type: string
+ value: "{{ uuid }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_created') }}"
+ success: "{{ __('admin_message_entries_api_token_created') }}"
+ redirect:
+ route: |
+ {% if _form.registry.data.redirect == 'index' %}
+ admin.api.tokens
+ {% elseif _form.registry.data.redirect == 'edit' %}
+ admin.api.edit
+ {% elseif _form.registry.data.redirect == 'add' %}
+ admin.api.add
+ {% endif %}
+ args:
+ api: "{{ query.api }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_create_new_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit_form_token_create
+ style:
+ display: none
+ - type: ButtonGroup
+ properties:
+ buttons:
+ - type: Button
+ properties:
+ value: "{{ __('admin_create') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: index
+ - type: ButtonToggle
+ properties:
+ type: secondary
+ value: "{{ __('admin_create_and_edit') }}"
+ items:
+ - href: "#"
+ value: "{{ __('admin_create_and_edit') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: edit
+ - href: "#"
+ value: "{{ __('admin_create_and_add') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: add
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/images/blueprint.yaml b/project/blueprints/admin/system/api/images/blueprint.yaml
new file mode 100644
index 00000000..568442f1
--- /dev/null
+++ b/project/blueprints/admin/system/api/images/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Entries
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_entries') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('admin_create_new_token') }}"
+ href: "{{ urlFor('admin.api.add', {}, {'api': query.api}) }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/images/edit/blueprint.yaml b/project/blueprints/admin/system/api/images/edit/blueprint.yaml
new file mode 100644
index 00000000..8908ef88
--- /dev/null
+++ b/project/blueprints/admin/system/api/images/edit/blueprint.yaml
@@ -0,0 +1,157 @@
+title: Edit token
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_edit
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: token
+ properties:
+ type: string
+ value: "{{ query.token }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_updated') }}"
+ success: "{{ __('admin_message_entries_api_token_updated') }}"
+ redirect:
+ route: "admin.api.edit"
+ args:
+ api: "{{ query.api }}"
+ token: "{{ query.token }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_edit_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_save') }}"
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/media/add/blueprint.yaml b/project/blueprints/admin/system/api/media/add/blueprint.yaml
new file mode 100644
index 00000000..ffe1283b
--- /dev/null
+++ b/project/blueprints/admin/system/api/media/add/blueprint.yaml
@@ -0,0 +1,209 @@
+title: Create new token
+icon:
+ set: bootstrap
+ name: file-text
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_create
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ value: 0
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: created_at
+ properties:
+ type: string
+ value: "{{ time }}"
+ - name: created_by
+ properties:
+ type: string
+ value: "{{ acl().getUserLoggedInUuid() }}"
+ - name: uuid
+ properties:
+ type: string
+ value: "{{ uuid }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_created') }}"
+ success: "{{ __('admin_message_entries_api_token_created') }}"
+ redirect:
+ route: |
+ {% if _form.registry.data.redirect == 'index' %}
+ admin.api.tokens
+ {% elseif _form.registry.data.redirect == 'edit' %}
+ admin.api.edit
+ {% elseif _form.registry.data.redirect == 'add' %}
+ admin.api.add
+ {% endif %}
+ args:
+ api: "{{ query.api }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_create_new_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit_form_token_create
+ style:
+ display: none
+ - type: ButtonGroup
+ properties:
+ buttons:
+ - type: Button
+ properties:
+ value: "{{ __('admin_create') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: index
+ - type: ButtonToggle
+ properties:
+ type: secondary
+ value: "{{ __('admin_create_and_edit') }}"
+ items:
+ - href: "#"
+ value: "{{ __('admin_create_and_edit') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: edit
+ - href: "#"
+ value: "{{ __('admin_create_and_add') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: add
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/media/blueprint.yaml b/project/blueprints/admin/system/api/media/blueprint.yaml
new file mode 100644
index 00000000..568442f1
--- /dev/null
+++ b/project/blueprints/admin/system/api/media/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Entries
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_entries') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('admin_create_new_token') }}"
+ href: "{{ urlFor('admin.api.add', {}, {'api': query.api}) }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/media/edit/blueprint.yaml b/project/blueprints/admin/system/api/media/edit/blueprint.yaml
new file mode 100644
index 00000000..8908ef88
--- /dev/null
+++ b/project/blueprints/admin/system/api/media/edit/blueprint.yaml
@@ -0,0 +1,157 @@
+title: Edit token
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_edit
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: token
+ properties:
+ type: string
+ value: "{{ query.token }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_updated') }}"
+ success: "{{ __('admin_message_entries_api_token_updated') }}"
+ redirect:
+ route: "admin.api.edit"
+ args:
+ api: "{{ query.api }}"
+ token: "{{ query.token }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_edit_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_save') }}"
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/registry/add/blueprint.yaml b/project/blueprints/admin/system/api/registry/add/blueprint.yaml
new file mode 100644
index 00000000..ffe1283b
--- /dev/null
+++ b/project/blueprints/admin/system/api/registry/add/blueprint.yaml
@@ -0,0 +1,209 @@
+title: Create new token
+icon:
+ set: bootstrap
+ name: file-text
+emitter:
+ addListener:
+ - name: onAdminThemeTail
+ properties:
+ value: |
+
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_create
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ value: 0
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: created_at
+ properties:
+ type: string
+ value: "{{ time }}"
+ - name: created_by
+ properties:
+ type: string
+ value: "{{ acl().getUserLoggedInUuid() }}"
+ - name: uuid
+ properties:
+ type: string
+ value: "{{ uuid }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_created') }}"
+ success: "{{ __('admin_message_entries_api_token_created') }}"
+ redirect:
+ route: |
+ {% if _form.registry.data.redirect == 'index' %}
+ admin.api.tokens
+ {% elseif _form.registry.data.redirect == 'edit' %}
+ admin.api.edit
+ {% elseif _form.registry.data.redirect == 'add' %}
+ admin.api.add
+ {% endif %}
+ args:
+ api: "{{ query.api }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_create_new_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ name: submit_form_token_create
+ style:
+ display: none
+ - type: ButtonGroup
+ properties:
+ buttons:
+ - type: Button
+ properties:
+ value: "{{ __('admin_create') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: index
+ - type: ButtonToggle
+ properties:
+ type: secondary
+ value: "{{ __('admin_create_and_edit') }}"
+ items:
+ - href: "#"
+ value: "{{ __('admin_create_and_edit') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: edit
+ - href: "#"
+ value: "{{ __('admin_create_and_add') }}"
+ class: js-submit-token-create-form
+ data:
+ redirect: add
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/registry/blueprint.yaml b/project/blueprints/admin/system/api/registry/blueprint.yaml
new file mode 100644
index 00000000..568442f1
--- /dev/null
+++ b/project/blueprints/admin/system/api/registry/blueprint.yaml
@@ -0,0 +1,29 @@
+title: Entries
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_entries') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('admin_create_new_token') }}"
+ href: "{{ urlFor('admin.api.add', {}, {'api': query.api}) }}"
+ class: btn btn-primary
\ No newline at end of file
diff --git a/project/blueprints/admin/system/api/registry/edit/blueprint.yaml b/project/blueprints/admin/system/api/registry/edit/blueprint.yaml
new file mode 100644
index 00000000..8908ef88
--- /dev/null
+++ b/project/blueprints/admin/system/api/registry/edit/blueprint.yaml
@@ -0,0 +1,157 @@
+title: Edit token
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_token_edit
+ process:
+ fields:
+ - name: title
+ properties:
+ type: string
+ - name: limit_calls
+ properties:
+ type: int
+ - name: icon.name
+ properties:
+ type: string
+ - name: icon.set
+ properties:
+ type: string
+ - name: state
+ properties:
+ type: string
+ - name: calls
+ properties:
+ type: int
+ - name: api
+ properties:
+ type: string
+ value: "{{ query.api }}"
+ - name: token
+ properties:
+ type: string
+ value: "{{ query.token }}"
+ messages:
+ error: "{{ __('admin_message_entries_api_token_was_not_updated') }}"
+ success: "{{ __('admin_message_entries_api_token_updated') }}"
+ redirect:
+ route: "admin.api.edit"
+ args:
+ api: "{{ query.api }}"
+ token: "{{ query.token }}"
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_edit_token') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_save') }}"
+ - type: Row
+ properties:
+ class: g-3
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: InputHidden
+ properties:
+ name: redirect
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_title_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputNumber
+ properties:
+ name: limit_calls
+ label:
+ value: "{{ __('admin_api_calls_limit') }}"
+ value: 0
+ help: "{{ __('admin_help_text_for_api_calls_limit_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('admin_error_api_calls_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: Select2
+ properties:
+ name: state
+ value: enabled
+ items:
+ enabled: "{{ __('admin_enabled') }}"
+ disabled: "{{ __('admin_disabled') }}"
+ label:
+ value: "{{ __('admin_state') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.name
+ label:
+ value: "{{ __('admin_icon_name') }}"
+ value: "newspaper"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ blocks:
+ - type: InputText
+ properties:
+ name: icon.set
+ label:
+ value: "{{ __('admin_icon_set') }}"
+ value: "bootstrap"
+ class: js-title
+ help: "{{ __('admin_help_text_for_tokens_label') }}"
+ validation:
+ required: true
+ minlength: 1
+ errorMessage: "{{ __('form_admin_error_icon_empty_input') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/settings/blueprint.yaml b/project/blueprints/admin/system/settings/blueprint.yaml
new file mode 100644
index 00000000..f4600184
--- /dev/null
+++ b/project/blueprints/admin/system/settings/blueprint.yaml
@@ -0,0 +1,64 @@
+title: Settings
+type: settings
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ properties:
+ name: form_settings
+ process:
+ fields:
+ - name: settings
+ properties:
+ type: string
+ messages:
+ error: "{{ __('admin_message_settings_was_not_saved') }}"
+ success: "{{ __('admin_message_settings_saved') }}"
+ redirect:
+ route: admin.settings.index
+ blocks:
+ - type: Row
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ id: title
+ value: "{{ __('admin_settings') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: InputSubmit
+ properties:
+ type: primary
+ value: "{{ __('admin_save') }}"
+ id: submit
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ blocks:
+ - type: Codemirror
+ properties:
+ name: settings
+ value: "{{ settings }}"
+ options:
+ mode: yaml
+
\ No newline at end of file
diff --git a/project/blueprints/admin/system/tools/blueprint.yaml b/project/blueprints/admin/system/tools/blueprint.yaml
new file mode 100644
index 00000000..4606384d
--- /dev/null
+++ b/project/blueprints/admin/system/tools/blueprint.yaml
@@ -0,0 +1,20 @@
+title: Tools
+type: system
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_tools') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/tools/cache/blueprint.yaml b/project/blueprints/admin/system/tools/cache/blueprint.yaml
new file mode 100644
index 00000000..c483a641
--- /dev/null
+++ b/project/blueprints/admin/system/tools/cache/blueprint.yaml
@@ -0,0 +1,32 @@
+title: Cache
+type: system
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_cache') }}"
+ - type: Column
+ properties:
+ size: 6/12
+ class: d-flex align-items-center justify-content-end text-end
+ blocks:
+ - type: Anchor
+ properties:
+ value: "{{ __('admin_clear_cache_all') }}"
+ href: "#"
+ class: btn btn-primary
+ events:
+ onclick: "clearCache('all');"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/tools/information/blueprint.yaml b/project/blueprints/admin/system/tools/information/blueprint.yaml
new file mode 100644
index 00000000..955d65d8
--- /dev/null
+++ b/project/blueprints/admin/system/tools/information/blueprint.yaml
@@ -0,0 +1,20 @@
+title: Information
+type: system
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_information') }}"
\ No newline at end of file
diff --git a/project/blueprints/admin/system/tools/registry/blueprint.yaml b/project/blueprints/admin/system/tools/registry/blueprint.yaml
new file mode 100644
index 00000000..00062864
--- /dev/null
+++ b/project/blueprints/admin/system/tools/registry/blueprint.yaml
@@ -0,0 +1,20 @@
+title: Registry
+type: system
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4 mb-4
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 6/12
+ blocks:
+ - type: Heading
+ properties:
+ size: large
+ value: "{{ __('admin_registry') }}"
\ No newline at end of file
diff --git a/project/blueprints/blog/blueprint.yaml b/project/blueprints/blog/blueprint.yaml
new file mode 100644
index 00000000..69d2aa4b
--- /dev/null
+++ b/project/blueprints/blog/blueprint.yaml
@@ -0,0 +1,196 @@
+title: Blog
+type: entry
+icon:
+ set: bootstrap
+ name: file-text
+blocks:
+ - type: Container
+ properties:
+ class: mt-4
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ process:
+ fields:
+ - title
+ - content
+ - description
+ - keywords
+ messages:
+ error: admin_message_entries_changes_saved
+ success: admin_message_entries_changes_not_saved
+ redirect:
+ route: admin.entries.edit args:id,type
+ properties:
+ name: form_entries_edit
+ blocks:
+ - type: InputSubmit
+ properties:
+ id: submit
+ style:
+ display: none
+ - type: Tabs
+ properties:
+ tabs:
+ main:
+ title: "{{ __('admin_main') }}"
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3
+ blocks:
+ - type: Trumbowyg
+ properties:
+ name: content
+ label:
+ value: "{{ __('admin_entries') }}"
+ options:
+ btns:
+ - strong
+ - em
+ - del
+ - link
+ - insertImage
+ - viewHTML
+ settings:
+ title: "{{ __('admin_settings') }}"
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: Heading
+ properties:
+ value: "{{ __('admin_general') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3
+ blocks:
+ - type: InputTextarea
+ properties:
+ name: description
+ validation:
+ required: true
+ rows: 3
+ label:
+ value: "{{ __('admin_description') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: template
+ label:
+ value: "{{ __('admin_template') }}"
+ items: "{{ serializers().json.encode(templates) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: routable
+ label:
+ value: "{{ __('admin_routable') }}"
+ items: "{{ serializers().json.encode(routable) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: visibility
+ label:
+ value: "{{ __('admin_visibility') }}"
+ items: "{{ serializers().json.encode(visibility) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Flatpickr
+ properties:
+ name: published_at
+ label:
+ value: "{{ __('admin_published_at') }}"
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: Heading
+ properties:
+ value: "{{ __('admin_menu') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputText
+ properties:
+ name: menu_item_title
+ label:
+ value: "{{ __('admin_menu_item_title') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputText
+ properties:
+ name: menu_item_url
+ label:
+ value: "{{ __('admin_menu_item_url') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: menu_item_target
+ label:
+ value: "{{ __('admin_menu_item_target') }}"
+ items: { _self: _self, _blank: _blank, _parent: _parent, _top: _top }
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputNumber
+ properties:
+ name: menu_item_order
+ label:
+ value: "{{ __('admin_menu_item_order') }}"
+ value: 1
+
+
+
+
\ No newline at end of file
diff --git a/project/blueprints/blog/post/blueprint.yaml b/project/blueprints/blog/post/blueprint.yaml
new file mode 100644
index 00000000..daf1277b
--- /dev/null
+++ b/project/blueprints/blog/post/blueprint.yaml
@@ -0,0 +1,196 @@
+title: Blog post
+type: entry
+icon:
+ set: bootstrap
+ name: file
+blocks:
+ - type: Container
+ properties:
+ class: mt-4
+ breakpoint: medium
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ blocks:
+ - type: Form
+ process:
+ fields:
+ - title
+ - content
+ - description
+ - keywords
+ messages:
+ error: admin_message_entries_changes_saved
+ success: admin_message_entries_changes_not_saved
+ redirect:
+ route: admin.entries.edit args:id,type
+ properties:
+ name: form_entries_edit
+ blocks:
+ - type: InputSubmit
+ properties:
+ id: submit
+ style:
+ display: none
+ - type: Tabs
+ properties:
+ tabs:
+ main:
+ title: "{{ __('admin_main') }}"
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: InputText
+ properties:
+ name: title
+ label:
+ value: "{{ __('admin_title') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3
+ blocks:
+ - type: Trumbowyg
+ properties:
+ name: content
+ label:
+ value: "{{ __('admin_entries') }}"
+ options:
+ btns:
+ - strong
+ - em
+ - del
+ - link
+ - insertImage
+ - viewHTML
+ settings:
+ title: "{{ __('admin_settings') }}"
+ blocks:
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: Heading
+ properties:
+ value: "{{ __('admin_general') }}"
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3
+ blocks:
+ - type: InputTextarea
+ properties:
+ name: description
+ validation:
+ required: true
+ rows: 3
+ label:
+ value: "{{ __('admin_description') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: template
+ label:
+ value: "{{ __('admin_template') }}"
+ items: "{{ serializers().json.encode(templates) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: routable
+ label:
+ value: "{{ __('admin_routable') }}"
+ items: "{{ serializers().json.encode(routable) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: visibility
+ label:
+ value: "{{ __('admin_visibility') }}"
+ items: "{{ serializers().json.encode(visibility) }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Flatpickr
+ properties:
+ name: published_at
+ label:
+ value: "{{ __('admin_published_at') }}"
+ - type: Row
+ blocks:
+ - type: Column
+ properties:
+ size: 12
+ class: mb-3 mt-3
+ blocks:
+ - type: Heading
+ properties:
+ value: "{{ __('admin_menu') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputText
+ properties:
+ name: menu_item_title
+ label:
+ value: "{{ __('admin_menu_item_title') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputText
+ properties:
+ name: menu_item_url
+ label:
+ value: "{{ __('admin_menu_item_url') }}"
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: Select2
+ properties:
+ name: menu_item_target
+ label:
+ value: "{{ __('admin_menu_item_target') }}"
+ items: { _self: _self, _blank: _blank, _parent: _parent, _top: _top }
+ - type: Column
+ properties:
+ size: 3/12
+ class: mb-3
+ blocks:
+ - type: InputNumber
+ properties:
+ name: menu_item_order
+ label:
+ value: "{{ __('admin_menu_item_order') }}"
+ value: 1
+
+
+
+
\ No newline at end of file
diff --git a/project/config/flextype/settings.yaml b/project/config/flextype/settings.yaml
new file mode 100644
index 00000000..cd77c3f1
--- /dev/null
+++ b/project/config/flextype/settings.yaml
@@ -0,0 +1,702 @@
+# Set the timezone to be used on the project.
+# For a list of valid timezone settings, see:
+# http://php.net/manual/en/timezones.php
+timezone: UTC
+
+# Charset
+#
+# Set internal character encoding.
+#
+# Currently the following names are supported:
+# http://php.net/manual/en/function.mb-regex-encoding.php#121645
+charset: UTF-8
+
+# The locale that'll be used by the Flextype.
+#
+# Available locales to use: src/flextype/config/locales.yaml
+locale: en_US
+
+# Application Base url
+#
+# Define application base url
+base_url: ''
+
+# Application Base Path
+#
+# Define application base path if application located in subdirectory
+base_path: '/flextype'
+
+# Valid date format
+#
+# Date format variants:
+#
+# d-m-Y H:i" - 02-02-2020 09:41
+# Y-m-d H:i" - 2020-02-02 09:41
+# m/d/Y h:i a - 02/02/2020 09:41 pm
+# H:i d-m-Y - 09:41 02-02-2020
+# h:i a m/d/Y - 09:41 pm 02/02/2020
+
+# Valid date format
+date_format: 'd-m-Y H:i'
+
+# Valid date format to display
+date_display_format: 'd-m-Y H:i'
+
+# Display errors
+#
+# Please make sure to set false for error `display` in production!
+#
+# Displaying PHP errors on a public server can be a serious security risk:
+#
+# - Error messages are displayed with detailed information about the code structure (e.g. file path, class, method)
+# - With Whoops enabled, there will be even more detailed information about the code structure
+# - Detailed error messages for login failures could leak information to attackers
+#
+# In a production environment, always log errors to your PHP error logs.
+errors:
+
+ # Set true to display errors.
+ display: true
+
+ # Editor (emacs, idea, macvim, phpstorm, sublime, textmate, xdebug, vscode, atom, espresso)
+ editor: atom
+
+ # Error page title
+ page_title: Error!
+
+ # Handler (pretty, plain, json, xml)
+ handler: pretty
+
+# Entries
+entries:
+ directory: '/entries'
+ collections:
+ default:
+ filename: entry
+ extension: yaml
+ serializer: yaml
+ fields:
+ registry:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/RegistryField.php"
+ entries:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/EntriesField.php"
+ fetch:
+ result: toObject
+ slug:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/SlugField.php"
+ published_at:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/PublishedAtField.php"
+ published_by:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/PublishedByField.php"
+ modified_at:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/ModifiedAtField.php"
+ created_at:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/CreatedAtField.php"
+ created_by:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/CreatedByField.php"
+ routable:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/RoutableField.php"
+ parsers:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/ParsersField.php"
+ visibility:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/VisibilityField.php"
+ uuid:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/UuidField.php"
+ id:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/IdField.php"
+ accounts:
+ pattern: accounts
+ filename: entry
+ extension: yaml
+ serializer: yaml
+ fields:
+ registry:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/RegistryField.php"
+ slug:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/SlugField.php"
+ parsers:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/ParsersField.php"
+ uuid:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/UuidField.php"
+ id:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/IdField.php"
+ accounts_item:
+ pattern: accounts/(.*)
+ filename: account
+ extension: yaml
+ serializer: yaml
+ fields:
+ registry:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/RegistryField.php"
+ slug:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/SlugField.php"
+ registered_at:
+ enabled: true
+ path: "/project/plugins/accounts/core/Entries/Fields/RegisteredAtField.php"
+ parsers:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/ParsersField.php"
+ uuid:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/UuidField.php"
+ id:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/IdField.php"
+ tokens:
+ pattern: tokens
+ filename: token
+ extension: yaml
+ serializer: yaml
+ fields:
+ modified_at:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/ModifiedAtField.php"
+ created_at:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/CreatedAtField.php"
+ created_by:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/CreatedByField.php"
+ uuid:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/UuidField.php"
+ id:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/IdField.php"
+ tokens_item:
+ pattern: tokens/([a-zA-Z0-9_-]+)
+ filename: token
+ extension: yaml
+ serializer: yaml
+ fields:
+ modified_at:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/ModifiedAtField.php"
+ created_at:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/CreatedAtField.php"
+ created_by:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/CreatedByField.php"
+ uuid:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/UuidField.php"
+ id:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Default/IdField.php"
+ calls:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Tokens/Items/CallsField.php"
+ total_calls:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Tokens/Items/TotalCallsField.php"
+ state:
+ enabled: true
+ path: "/src/flextype/core/Entries/Fields/Tokens/Items/StateField.php"
+
+# Cache
+#
+# - enabled: Set to true to enable caching
+#
+# - prefix: Cache prefix string (prevents cache conflicts)
+#
+# - driver: Available drivers: auto (will get one from installed cache drivers), apcu,
+# apc, array, wincache, xcache, memcache, memcached, redis, file.
+#
+# - drivers.files.path: The path where the written cache files belong to (system temp directory by default).
+#
+# - drivers.files.secure_file_manipulation: This option enforces a strict I/O manipulation policy by adding more integrity checks.
+# This option may slow down the write operations, therefore you must use it with caution.
+#
+# - drivers.files.htaccess: Option designed to (dis)allow the auto-generation of .htaccess.
+#
+# - drivers.files.security_key: A security key that define the subdirectory name. 'auto' value will be the HTTP_HOST value.
+#
+# - drivers.files.cache_file_extension: This allows you to setup a custom (but safe) cache file extension. ('txt|cache|db|pfc')
+#
+# - drivers.files.item_detailed_dates: This option will define if the Items will make use of detailed dates such as Creation/modification date.
+# Trying to access to these date without being explicitly enabled will throw a LogicException
+#
+# - drivers.files.auto_tmp_fallback: Option designed to automatically attempt to fallback to temporary directory if the cache fails to write on the specified directory.
+#
+# - drivers.files.default_ttl: This option define a default ttl (time-to-live, in seconds) for item that has no specified expiration date/ttl.
+#
+# - drivers.files.default_key_hash_function: This option will allow you to define a custom hash function for the $item->getEncodedKey() method.
+# Callable objects are not allowed, but static method such as \Absolute\Namespace\ToStatic::method are allowed.
+#
+# - drivers.files.default_file_name_hash_function: This option will allow you to define a custom hash function for every I/O method that ends up to write an hashed filename on the disk.
+#
+# - drivers.files.default_chmod: This option will define the chmod used to write driver cache files.
+#
+# - drivers.files.limited_memory_by_object:
+#
+# - drivers.files.compress_data:
+#
+# - drivers.files.prevent_cache_slams: This option will allow you to prevent cache slams when making use of heavy cache items.
+#
+# - drivers.files.cache_slams_timeout: This option defines the cache slams timeout in seconds.
+cache:
+ enabled: false
+ router: routes
+ auto_reload:
+ storage: false
+ plugins: false
+ flextype: false
+ driver: auto
+ drivers:
+ apcu: {}
+ cassandra:
+ host: '127.0.0.1'
+ port: 9042
+ timeout: 2
+ username: ''
+ password: ''
+ ssl_enabled: false
+ ssl_verify: false
+ default_ttl: 900
+ cookie:
+ aware_of_untrustable_data: false
+ limited_memory_by_object: 4096
+ default_ttl: 900
+ couchbase:
+ host: '127.0.0.1'
+ port: 8091
+ username: ''
+ password: ''
+ bucket_name: default
+ default_ttl: 900
+ couchdb:
+ database: 'flextype'
+ path: '/'
+ host: '127.0.0.1'
+ port: 8091
+ username: ''
+ password: ''
+ bucket_name: default
+ ssl: false
+ timeout: 10
+ default_ttl: 900
+ devnull: {}
+ devfalse: {}
+ devtrue: {}
+ phparray:
+ path: '/data'
+ security_key: 'auto'
+ htaccess: true
+ secure_file_manipulation: false
+ default_ttl: 900
+ files:
+ path: '/data'
+ security_key: 'auto'
+ htaccess: true
+ secure_file_manipulation: false
+ cache_file_extension: txt
+ default_ttl: 900
+ leveldb:
+ path: '/data'
+ security_key: 'auto'
+ htaccess: true
+ default_ttl: 900
+ memcache:
+ host: '127.0.0.1'
+ port: 11211
+ sasl_user: ''
+ sasl_password: ''
+ path: ''
+ compress_data: false
+ servers: {}
+ default_ttl: 900
+ memcached:
+ host: '127.0.0.1'
+ port: 11211
+ sasl_user: ''
+ sasl_password: ''
+ path: ''
+ compress_data: false
+ servers: {}
+ default_ttl: 900
+ memstatic: {}
+ mongodb:
+ host: '127.0.0.1'
+ port: 27017
+ username: ''
+ password: ''
+ timeout: 3
+ servers: {}
+ collection_name: 'Cache'
+ default_ttl: 900
+ predis:
+ host: '127.0.0.1'
+ port: 6379
+ password: ''
+ timeout: 5
+ database: 0
+ opt_prefix: ''
+ persistent: false
+ default_ttl: 900
+ redis:
+ host: '127.0.0.1'
+ port: 6379
+ password: ''
+ timeout: 5
+ database: 0
+ opt_prefix: ''
+ default_ttl: 900
+ riak:
+ host: '127.0.0.1'
+ port: 8098
+ prefix: 'riak'
+ default_ttl: 900
+ sqlite:
+ path: '/data'
+ security_key: auto
+ htaccess: true
+ default_ttl: 900
+ ssdb:
+ host: 127.0.0.1
+ port: 8888
+ password: ''
+ timeout: 5
+ wincache: {}
+ xcache: {}
+ zenddisk: {}
+ zendshm: {}
+
+# Slim
+#
+# - add_content_length_header: When true, Slim will add a Content-Length header to
+# the response. If you are using a runtime analytics tool,
+# such as New Relic, then this should be disabled.
+#
+# - router_cache_file: Filename for caching the FastRoute routes. Must be set to
+# a valid filename within a writeable directory. If the file
+# does not exist, then it is created with the correct cache
+# information on first run. Set to false to disable the FastRoute
+# cache system.
+#
+# - determine_route_before_app_middleware: When true, the route is calculated before
+# any middleware is executed. This means that you
+# can inspect route parameters in middleware if you need to.
+#
+# - output_buffering: If false, then no output buffering is enabled.
+# If 'append' or 'prepend', then any echo or print statements
+# are captured and are either appended or prepended to the Response
+# returned from the route callable.
+add_content_length_header: true
+router_cache_file: false
+determine_route_before_app_middleware: false
+output_buffering: append
+
+# Slugify
+slugify:
+
+ # Set true to enable slugify.
+ enabled: true
+
+ # By default Slugify will use dashes as separators.
+ # If you want to use a different default separator,
+ # you can set the separator option.
+ separator: "-"
+
+ # By default Slugify will convert the slug to lowercase.
+ # If you want to preserve the case of the string you can set the
+ # lowercase option to false.
+ lowercase: true
+
+ # By default Slugify will remove leading and trailing separators before
+ # returning the slug. If you do not want the slug to be trimmed you can
+ # set the trim option to false.
+ trim: true
+
+ # You can also change the regular expression that is used to replace
+ # characters with the separator.
+ regexp: "/[^A-Za-z0-9]+/"
+
+ # Lowercasing is done before using the regular expression.
+ # If you want to keep the lowercasing behavior but your
+ # regular expression needs to match uppercase letters,
+ # you can set the lowercase_after_regexp option to true.
+ lowercase_after_regexp: false
+
+ # Adds in an option to go through strip_tags() in case the string contains HTML etc.
+ strip_tags: false
+
+# Serializers
+#
+# json.decode.cache: Cache result data or no. Default is true.
+# json.decode.assoc: Decode assoc. When TRUE, returned objects will be converted into associative arrays.
+# json.decode.depth: Decode Depth. Set the maximum depth. Must be greater than zero.
+# json.decode.flags: Bitmask consisting of decode options.
+# json.encode.options: Bitmask consisting of encode options
+# json.encode.depth: Encode Depth. Set the maximum depth. Must be greater than zero.
+#
+# yaml.decode.cache: Cache result data or no. Default is true.
+# yaml.decode.native: Use native php pecl parser or symfony parser.
+# yaml.decode.flags: A bit field of DUMP_* constants to customize the dumped YAML string.
+# yaml.encode.inline: The level where you switch to inline YAML.
+# yaml.encode.indent: The amount of spaces to use for indentation of nested nodes.
+# yaml.encode.flags: A bit field of DUMP_* constants to customize the dumped YAML string.
+#
+# frontmatter.decode.cache: Cache result data or no. Default is true.
+# frontmatter.decode.header_serializer: Header serializer.
+# frontmatter.encode.header_serializer: Header serializer.
+#
+# neon.decode.cache: Cache result data or no. Default is true.
+# neon.encode.flags: The flag can be 1, which will create multiline output.
+#
+# phparray.decode.cache: Cache result data or no. Default is true.
+#
+# phpcode.decode.cache: Cache result data or no. Default is true.
+serializers:
+ json:
+ decode:
+ cache: true
+ assoc: true
+ depth: 512
+ flags: 0
+ encode:
+ options: 0
+ depth: 512
+ yaml:
+ decode:
+ cache: true
+ native: true
+ flags: 0
+ encode:
+ inline: 10
+ indent: 2
+ flags: 0
+ frontmatter:
+ decode:
+ cache: true
+ header:
+ serializer: yaml
+ allowed: ['yaml', 'json', 'neon']
+ encode:
+ header:
+ serializer: yaml
+ allowed: ['yaml', 'json', 'neon']
+ neon:
+ decode:
+ cache: true
+ encode:
+ flags: 1
+ phparray:
+ decode:
+ cache: true
+ phpcode:
+ decode:
+ cache: true
+
+# Parsers
+#
+# - markdown.cache: Cache result data or no. Default is true.
+#
+# - markdown.commonmark.renderer.block_separator: String to use for separating renderer block elements.
+#
+# - markdown.commonmark.renderer.inner_separator: String to use for separating inner block contents.
+#
+# - markdown.commonmark.renderer.soft_break: String to use for rendering soft breaks.
+#
+# - markdown.commonmark.commonmark.enable_em: Disable parsing by setting to false; enable with true (default: true)
+#
+# - markdown.commonmark.commonmark.enable_strong: Disable parsing by setting to false; enable with true (default: true)
+#
+# - markdown.commonmark.commonmark.use_asterisk: Disable parsing of * for emphasis by setting to false; enable with true (default: true)
+#
+# - markdown.commonmark.commonmark.use_underscore: Disable parsing of _ for emphasis by setting to false; enable with true (default: true)
+#
+# - markdown.commonmark.commonmark.unordered_list_markers: Array of characters that can be used to indicate a bulleted list.
+#
+# - markdown.commonmark.html_input: `strip` all HTML (equivalent to 'safe' => true). `allow` all HTML input as-is (default value; equivalent to `‘safe’ => false) `escape` Escape all HTML.
+#
+# - markdown.commonmark.allow_unsafe_links: Remove risky link and image URLs by setting this to false (default: true).
+#
+# - markdown.commonmark.max_nesting_level: The maximum nesting level for blocks (default: PHP_INT_MAX). Setting this to a positive integer can help protect against long parse times and/or segfaults if blocks are too deeply-nested.
+#
+# - markdown.commonmark.slug_normalizer.max_length: Limits the size of generated slugs (defaults to 255 characters)
+parsers:
+ markdown:
+ cache: true
+ commonmark:
+ renderer:
+ block_separator: "\n"
+ inner_separator: "\n"
+ soft_break: "\n"
+ commonmark:
+ enable_em: true
+ enable_strong: true
+ use_asterisk: true
+ use_underscore: true
+ unordered_list_markers: ['-', '*', '+']
+ html_input: 'allow'
+ allow_unsafe_links: false
+ max_nesting_level: 9223372036854775807
+ slug_normalizer:
+ max_length: 255
+ shortcodes:
+ cache: true
+ shortcodes:
+ media:
+ enabled: true
+ path: "/src/flextype/core/Parsers/Shortcodes/MediaShortcode.php"
+ entries:
+ enabled: true
+ path: "/src/flextype/core/Parsers/Shortcodes/EntriesShortcode.php"
+ raw:
+ enabled: true
+ path: "/src/flextype/core/Parsers/Shortcodes/RawShortcode.php"
+ registry:
+ enabled: true
+ path: "/src/flextype/core/Parsers/Shortcodes/RegistryShortcode.php"
+ url:
+ enabled: true
+ path: "/src/flextype/core/Parsers/Shortcodes/UrlShortcode.php"
+
+# CORS
+#
+# CORS (Cross-origin resource sharing) allows JavaScript web apps to make HTTP requests to other domains.
+# This is important for third party web apps using Flextype, as without CORS, a JavaScript app hosted on example.com
+# couldn't access our APIs because they're hosted on another.com which is a different domain.
+cors:
+
+ # Set to true to enable cors
+ enabled: true
+
+ # The Access-Control-Allow-Origin response header indicates whether
+ # the response can be shared with requesting code from the given origin.
+ #
+ # read more: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
+ origin: "*"
+
+ # The Access-Control-Allow-Headers response header is used in response
+ # to a preflight request which includes the Access-Control-Request-Headers
+ # to indicate which HTTP headers can be used during the actual request.
+ #
+ # read more: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers
+ headers: ["X-Requested-With", "Content-Type", "Accept", "Origin", "Authorization"]
+
+ # The Access-Control-Allow-Methods response header specifies the method
+ # or methods allowed when accessing the resource in response to a preflight request.
+ #
+ # read more: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods
+ methods: [GET, POST, PUT, DELETE, PATCH, OPTIONS]
+
+ # The Access-Control-Expose-Headers response header indicates which headers
+ # can be exposed as part of the response by listing their names.
+ #
+ # read more: https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Access-Control-Expose-Headers
+ expose: []
+
+ # The Access-Control-Allow-Credentials response header tells browsers whether
+ # to expose the response to frontend JavaScript code when the request's credentials
+ # mode (Request.credentials) is include.
+ #
+ # read more: https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials
+ credentials: false
+
+# Upload
+upload:
+
+ # Uploads directory
+ directory: '/uploads'
+
+ # Overwrite existing files.
+ overwrite: true
+
+ # Auto-confirm uploads.
+ autoconfirm: false
+
+ # Prefixing uploads.
+ prefix: ''
+
+ # Validation options
+ validation:
+
+ # Allowed file extensions.
+ allowed_file_extensions: ['gif', 'jpg', 'jpeg', 'png', 'ico', 'webm', 'svg']
+
+ # Maximum file size.
+ max_file_size: '24M'
+
+ # Image validation options
+ image:
+
+ # Image maxiumum and minimum width
+ width:
+ max: 4920
+ min: 100
+
+ # Image maxiumum and minimum height
+ height:
+ max: 3264
+ min: 100
+
+ # Image ratio
+ #ratio:
+ # The option can be a number (eg: 1.3) or a ratio-like string (eg: 4:3, 16:9).
+ # size: 1.3
+
+ # The option error_margin specifies how much the image is allowed to
+ # deviate from the target ratio. Default value is 0.
+ # error_margin: 0
+
+ # Process uploaded files
+ process:
+
+ # Images process settings
+ image:
+
+ # Image quality
+ quality: 70
+
+# Session
+#
+# Set session options before you start the session
+# Standard PHP session configuration options
+# https://secure.php.net/manual/en/session.configuration.php
+session:
+
+ # Session name
+ name: Flextype
+
+# Flextype Rest APIs
+api:
+
+ # Entries API
+ entries:
+
+ # Set to true to enable Entries API
+ enabled: true
+
+ # Registry API
+ registry:
+
+ # Set to true to enable Registry API
+ enabled: true
+
+ # Utils API
+ utils:
+
+ # Set to true to enable Utils API
+ enabled: true
\ No newline at end of file
diff --git a/project/config/plugins/accounts-admin/settings.yaml b/project/config/plugins/accounts-admin/settings.yaml
new file mode 100644
index 00000000..46cb2237
--- /dev/null
+++ b/project/config/plugins/accounts-admin/settings.yaml
@@ -0,0 +1,13 @@
+enabled: true
+priority: 90
+supper_admin_registered: true
+from:
+ name: Flextype
+ email: sergey.romanenko@flextype.org
+navigation:
+ links: { }
+ actions:
+ -
+ properties:
+ href: '{{ urlFor(''admin.accounts.index'') }}'
+ icon: { set: bootstrap, name: users }
diff --git a/project/config/plugins/accounts/settings.yaml b/project/config/plugins/accounts/settings.yaml
new file mode 100644
index 00000000..d944aa08
--- /dev/null
+++ b/project/config/plugins/accounts/settings.yaml
@@ -0,0 +1,77 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# Accounts plugin priority
+priority: 100
+
+# From email
+from:
+ name: Flextype
+ email: sergey.romanenko@flextype.org
+
+# Index(accounts)
+index:
+ enabled: true
+
+# Registraton
+registration:
+ enabled: true
+ default_roles: user
+ default_state: enabled
+ redirect:
+ route:
+ name: accounts.login
+
+# Login
+login:
+ enabled: true
+ redirect:
+ route:
+ name: accounts.profile
+
+# Profile
+profile:
+ enabled: true
+
+# Profile Edit
+profile_edit:
+ enabled: true
+ redirect:
+ route:
+ name: accounts.profile
+
+# New Password
+new_password:
+ enabled: true
+ redirect:
+ route:
+ name: accounts.login
+
+# Reset Password
+reset_password:
+ enabled: true
+ redirect:
+ route:
+ name: accounts.login
+
+# Logout
+logout:
+ redirect:
+ route:
+ name: accounts.login
+
+
+# Entries
+entries:
+ accounts:
+ collection: accounts
+ fields:
+ uuid:
+ enabled: true
+ path: "/project/plugins/accounts/app/Fields/UuidField.php"
+ id:
+ enabled: true
+ path: "/project/plugins/accounts/app/Fields/IdField.php"
+ registered_at:
+ enabled: true
+ path: "/project/plugins/accounts/app/Fields/RegisteredAtField.php"
\ No newline at end of file
diff --git a/project/config/plugins/acl/settings.yaml b/project/config/plugins/acl/settings.yaml
new file mode 100644
index 00000000..21f1d326
--- /dev/null
+++ b/project/config/plugins/acl/settings.yaml
@@ -0,0 +1,5 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# ACL plugin priority
+priority: 40
diff --git a/project/config/plugins/admin/settings.yaml b/project/config/plugins/admin/settings.yaml
new file mode 100644
index 00000000..d8b4388c
--- /dev/null
+++ b/project/config/plugins/admin/settings.yaml
@@ -0,0 +1,49 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# custom admin pane route
+route: admin
+
+# entries settings
+entries:
+ slugify: true
+
+# plugin priority
+priority: 50
+
+# admin navigation
+navigation:
+ dropdown:
+
+ links: []
+ actions:
+ - properties:
+ href: "{{ urlFor('admin.entries.index') }}"
+ icon:
+ set: bootstrap
+ name: newspaper
+ - properties:
+ href: "{{ urlFor('admin.media.index') }}"
+ icon:
+ set: bootstrap
+ name: images
+ - properties:
+ href: "{{ urlFor('admin.plugins.index') }}"
+ icon:
+ set: bootstrap
+ name: box
+ - properties:
+ href: "{{ urlFor('admin.tools.index') }}"
+ icon:
+ set: bootstrap
+ name: briefcase
+ - properties:
+ href: "{{ urlFor('admin.api.index') }}"
+ icon:
+ set: bootstrap
+ name: diagram-3
+ - properties:
+ href: "{{ urlFor('admin.settings.index') }}"
+ icon:
+ set: bootstrap
+ name: gear
diff --git a/project/config/plugins/blueprints/settings.yaml b/project/config/plugins/blueprints/settings.yaml
new file mode 100644
index 00000000..60ed207c
--- /dev/null
+++ b/project/config/plugins/blueprints/settings.yaml
@@ -0,0 +1,126 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# Blueprint plugin priority
+priority: 40
+
+# Place to load
+assetsLoadOnAdmin: true
+assetsLoadOnSite: false
+
+# Entries
+entries:
+ directory: '/blueprints'
+ collections:
+ default:
+ filename: blueprint
+ extension: yaml
+ serializer: yaml
+ fields: []
+
+# Blocks
+blocks:
+ ActionsDropdown:
+ type: ActionsDropdown
+ properties: []
+ template: plugins/blueprints/blocks/blocks/ActionsDropdown/block.html
+ Anchor:
+ type: Anchor
+ properties: []
+ template: plugins/blueprints/blocks/blocks/Anchor/block.html
+ Alert:
+ type: Alert
+ properties: []
+ template: plugins/blueprints/blocks/blocks/Alert/block.html
+ Button:
+ type: Button
+ properties: []
+ template: plugins/blueprints/blocks/blocks/Button/block.html
+ ButtonGroup:
+ type: ButtonGroup
+ properties: []
+ template: plugins/blueprints/blocks/blocks/ButtonGroup/block.html
+ Display:
+ type: Display
+ properties: []
+ template: plugins/blueprints/blocks/blocks/Display/block.html
+ Divider:
+ type: Divider
+ properties: []
+ template: plugins/blueprints/blocks/blocks/Divider/block.html
+ Container:
+ type: Container
+ properties: []
+ blocks: []
+ template: plugins/blueprints/blocks/blocks/Container/block.html
+ Row:
+ type: Row
+ properties: []
+ blocks: []
+ template: plugins/blueprints/blocks/blocks/Row/block.html
+ Column:
+ type: Column
+ properties: []
+ blocks: []
+ template: plugins/blueprints/blocks/blocks/Column/block.html
+ Tabs:
+ type: Tabs
+ properties: []
+ template: plugins/blueprints/blocks/blocks/Tabs/block.html
+ Form:
+ type: Form
+ properties: []
+ blocks: []
+ template: plugins/blueprints/blocks/blocks/Form/block.html
+ Heading:
+ type: Heading
+ properties: []
+ template: plugins/blueprints/blocks/blocks/Heading/block.html
+ Image:
+ type: Image
+ properties: []
+ template: plugins/blueprints/blocks/blocks/Image/block.html
+ InputText:
+ type: InputText
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputText/block.html
+ InputEmail:
+ type: InputEmail
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputEmail/block.html
+ InputPassword:
+ type: InputPassword
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputPassword/block.html
+ InputTextarea:
+ type: InputTextarea
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputTextarea/block.html
+ InputHidden:
+ type: InputHidden
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputHidden/block.html
+ InputNumber:
+ type: InputNumber
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputNumber/block.html
+ InputTags:
+ type: InputTags
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputTags/block.html
+ InputSelect:
+ type: InputSelect
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputSelect/block.html
+ InputReset:
+ type: InputReset
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputReset/block.html
+ InputButton:
+ type: InputButton
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputButton/block.html
+ InputSubmit:
+ type: InputSubmit
+ properties: []
+ template: plugins/blueprints/blocks/blocks/InputSubmit/block.html
diff --git a/project/config/plugins/codemirror/settings.yaml b/project/config/plugins/codemirror/settings.yaml
new file mode 100644
index 00000000..bb09e679
--- /dev/null
+++ b/project/config/plugins/codemirror/settings.yaml
@@ -0,0 +1,183 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# Plugin priority
+priority: 41
+
+# Place to load
+assetsLoadOnAdmin: true
+assetsLoadOnSite: false
+
+# Blocks
+blocks:
+ Codemirror:
+ type: Codemirror
+ properties:
+ name: codemirror
+
+ # Codemirror options
+ options:
+
+ # The mode to use.
+ # https://codemirror.net/mode/
+ # variants: yaml, yaml-frontmatter, htmlmixed, xml, php, javascript, markdown, css, twig
+ mode: "yaml-frontmatter"
+
+ # Explicitly set the line separator for the editor.
+ # By default is null)
+ lineSeparator: null
+
+ # Whether to show line numbers to the left of the editor.
+ lineNumbers: true
+
+ # Whether CodeMirror should scroll or wrap for long lines.
+ # Defaults to false (scroll).
+ lineWrapping: false
+
+ # At which number to start counting lines.
+ firstLineNumber: 1
+
+ # Determines whether the gutter scrolls along with the content horizontally (false)
+ # or whether it stays fixed during horizontal scrolling.
+ fixedGutter: true
+
+ # Chooses a scrollbar implementation.
+ scrollbarStyle: "native"
+
+ # When fixedGutter is on, and there is a horizontal scrollbar, by default the gutter will be visible to the left of this scrollbar.
+ # If this option is set to true, it will be covered by an element with class CodeMirror-gutter-filler.
+ coverGutterNextToScrollbar: true
+
+ # This disables editing of the editor content by the user.
+ # If the special value "nocursor" is given (instead of simply true),
+ # focusing of the editor is also disallowed.
+ readOnly: false
+
+ # This label is read by the screenreaders when CodeMirror text area is focused.
+ # This is helpful for accessibility.
+ screenReaderLabel: ""
+
+ # Whether the cursor should be drawn when a selection is active.
+ showCursorWhenSelecting: false
+
+ # The theme to style the editor with. only "elegant" available
+ theme: elegant
+
+ # The width of a tab character.
+ # Defaults to 2.
+ tabSize: 2
+
+ # How many spaces a block (whatever that means in the edited language) should be indented.
+ # The default is 2.
+ indentUnit: 2
+
+ # Whether, when indenting, the first N*tabSize spaces should be replaced by N tabs.
+ # Default is false.
+ indentWithTabs: false
+
+ # Whether to use the context-sensitive indentation that the mode provides (or just indent the same as the line before).
+ # Defaults to true.
+ smartIndent: true
+
+ # Flips overall layout and selects base paragraph direction to be left-to-right or right-to-left.
+ # Default is "ltr".
+ direction: ltr
+
+ # Determines whether horizontal cursor movement through right-to-left (Arabic, Hebrew) text is visual
+ # (pressing the left arrow moves the cursor left) or logical (pressing the left arrow moves to the next lower index in the string, which is visually right in right-to-left text).
+ # The default is false on Windows, and true on other platforms.
+ rtlMoveVisually: false
+
+ # Configures whether the editor should re-indent the current line when a character is typed that might change its proper indentation (only works if the mode supports indentation).
+ # Default is true.
+ electricChars: true
+
+ # Configures the key map to use.
+ # https://codemirror.net/doc/manual.html#keymaps
+ keyMap: "default"
+
+ # When enabled, which is the default, doing copy or cut when there is no selection will copy or cut the whole lines that have cursors on them.
+ lineWiseCopyCut: true
+
+ # When pasting something from an external source (not from the editor itself), if the number of lines matches the number of selection,
+ # CodeMirror will by default insert one line per selection. You can set this to false to disable that behavior.
+ pasteLinesPerSelection: true
+
+ # Determines whether multiple selections are joined as soon as they touch (the default) or only when they overlap (true).
+ selectionsMayTouch: true
+
+ # The maximum number of undo levels that the editor stores.
+ # Note that this includes selection change events.
+ undoDepth: 200
+
+ # The period of inactivity (in milliseconds) that will cause a new history event to be started when typing or deleting.
+ historyEventDelay: 1250
+
+ # Can be used to make CodeMirror focus itself on initialization.
+ #
+ # When fromTextArea is used, and no explicit value is given for this option,
+ # it will be set to true when either the source textarea is focused,
+ # or it has an autofocus attribute and no other element is focused.
+ autofocus: false
+
+ # Controls whether drag-and-drop is enabled.
+ dragDrop: true
+
+ # Half-period in milliseconds used for cursor blinking.
+ # By setting this to zero, blinking can be disabled. A negative value hides the cursor entirely.
+ cursorBlinkRate: 530
+
+ # How much extra space to always keep above and below the cursor when approaching the top or bottom of the visible view in a scrollable document.
+ cursorScrollMargin: 0
+
+ # Determines the height of the cursor.
+ # Default is 1, meaning it spans the whole height of the line.
+ # For some fonts (and by some tastes) a smaller height (for example 0.85),
+ # which causes the cursor to not reach all the way to the bottom of the line, looks better
+ cursorHeight: 1
+
+ # If set to true, will keep the cursor height constant for an entire line (or wrapped part of a line).
+ # When false, the cursor's height is based on the height of the adjacent reference character.
+ singleCursorHeightPerLine: true
+
+ # Controls whether, when the context menu is opened with a click outside of the current selection, the cursor is moved to the point of the click.
+ resetSelectionOnContextMenu: true
+
+ # Highlighting is done by a pseudo background-thread that will work for workTime milliseconds
+ workTime: 200
+
+ # and then use timeout to sleep for workDelay milliseconds.
+ workDelay: 300
+
+ # Indicates how quickly CodeMirror should poll its input textarea for changes (when focused).
+ # Most input is captured by events, but some things, like IME input on some browsers, don't generate events that allow CodeMirror to properly detect it.
+ pollInterval: 100
+
+ # By default, CodeMirror will combine adjacent tokens into a single span if they have the same class.
+ # This will result in a simpler DOM tree, and thus perform better. With some kinds of styling (such as rounded corners), this will change the way the document looks. You can set this option to false to disable this behavior.
+ flattenSpans: true
+
+ # When enabled (off by default), an extra CSS class will be added to each token, indicating the (inner) mode that produced it, prefixed with "cm-m-".
+ # For example, tokens from the XML mode will get the cm-m-xml class.
+ # https://codemirror.net/doc/manual.html#innerMode
+ addModeClass: false
+
+ # When highlighting long lines, in order to stay responsive,
+ # the editor will give up and simply style the rest of the line as plain text when it reaches a certain position.
+ maxHighlightLength: 10000
+
+ # Specifies the amount of lines that are rendered above and below the part of the document that's currently scrolled into view.
+ # This affects the amount of updates needed when scrolling, and the amount of work that such an update does.
+ # You should usually leave it at its default, 10. Can be set to Infinity to make sure the whole document is always rendered, and thus the browser's text search works on it. This will have bad effects on performance of big documents.
+ viewportMargin: 10
+
+ # Specifies whether or not spellcheck will be enabled on the input.
+ spellcheck: false
+
+ # Specifies whether or not autocorrect will be enabled on the input.
+ autocorrect: false
+
+ # Specifies whether or not autocapitalization will be enabled on the input.
+ autocapitalize: false
+
+ template: plugins/codemirror/blocks/Codemirror/block.html
\ No newline at end of file
diff --git a/project/config/plugins/contact/settings.yaml b/project/config/plugins/contact/settings.yaml
new file mode 100644
index 00000000..2b4f36fb
--- /dev/null
+++ b/project/config/plugins/contact/settings.yaml
@@ -0,0 +1,14 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# Contact plugin priority
+priority: 100
+
+default_subject: Default subject
+message_success: "Email sended."
+from:
+ name: Flextype
+ email: sergey.romanenko@flextype.org
+to:
+ name: Flextype
+ email: sergey.romanenko@flextype.org
diff --git a/project/config/plugins/data-guard/settings.yaml b/project/config/plugins/data-guard/settings.yaml
new file mode 100644
index 00000000..af67fe5e
--- /dev/null
+++ b/project/config/plugins/data-guard/settings.yaml
@@ -0,0 +1,2 @@
+enabled: true
+priority: 100
diff --git a/project/config/plugins/feed/settings.yaml b/project/config/plugins/feed/settings.yaml
new file mode 100644
index 00000000..c2c8c8ae
--- /dev/null
+++ b/project/config/plugins/feed/settings.yaml
@@ -0,0 +1,3 @@
+enabled: true
+priority: 100
+feed: []
diff --git a/project/config/plugins/flatpickr/settings.yaml b/project/config/plugins/flatpickr/settings.yaml
new file mode 100644
index 00000000..c6dc78af
--- /dev/null
+++ b/project/config/plugins/flatpickr/settings.yaml
@@ -0,0 +1,160 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# Plugin priority
+priority: 41
+
+# Place to load
+assetsLoadOnAdmin: true
+assetsLoadOnSite: false
+
+# Blocks
+blocks:
+ Flatpickr:
+ type: Flatpickr
+ properties:
+ name: flatpickr
+
+ # Flatpickr options
+ options:
+
+ # Allows the user to enter a date directly input the input field. By default, direct entry is disabled.
+ allowInput: false
+
+ # Allow preloading of invalid date
+ allowInvalidPreload: false
+
+ # Exactly the same as date format, but for the altInput field
+ altFormat: "F j, Y"
+
+ # Show the user a readable date (as per altFormat), but return something totally different to the server.
+ altInput: false
+
+ # This class will be added to the input element created by the altInput option.
+ # Note that altInput already inherits classes from the original input.
+ altInputClass: ""
+
+ # Whether to enable animations, such as month transitions
+ animate: true
+
+ # Defines how the date will be formatted in the aria-label for calendar days, using the same tokens as dateFormat.
+ # If you change this, you should choose a value that will make sense if a screen reader reads it out loud.
+ ariaDateFormat: "F j, Y"
+
+ # Whether the default time should be auto-filled when the input is empty and gains or loses focus.
+ autoFillDefaultTime: true
+
+ # Whether clicking on the input should open the picker.
+ # Set it to false if you only want to open the calendar programmatically
+ clickOpens: true
+
+ # Whether calendar should close after date selection
+ closeOnSelect: true
+
+ # If "mode" is "multiple", this string will be used to join
+ # selected dates together for the date input value.
+ conjunction: null
+
+ # A string of characters which are used to define how the date will be displayed in the input box.
+ # See https://chmln.github.io/flatpickr/formatting
+ dateFormat: "d-m-Y H:i"
+
+ # The initial selected date(s).
+ defaultDate: null
+
+ # Initial value of the hour element, when no date is selected
+ defaultHour: 12
+
+ # Initial value of the minute element, when no date is selected
+ defaultMinute: 0
+
+ # Initial value of the seconds element, when no date is selected
+ defaultSeconds: 0
+
+ # Set this to true to always use the non-native picker on mobile devices.
+ # By default, Flatpickr utilizes native datetime widgets unless certain options (e.g. disable) are used.
+ disableMobile: false
+
+ # Disables all dates except these specified.
+ # See https://chmln.github.io/flatpickr/examples/#disabling-all-dates-except-select-few
+ #enable: []
+
+ # Disables certain dates, preventing them from being selected.
+ # See https://chmln.github.io/flatpickr/examples/#disabling-specific-dates
+ #disable: []
+
+ # Enables seconds selection in the time picker.
+ enableSeconds: false
+
+ # Enables the time picker
+ enableTime: true
+
+ # Adjusts the step for the hour input (incl. scrolling)
+ hourIncrement: 1
+
+ # By default, clicking anywhere outside of calendar/input will close the calendar.
+ # Clicking on elements specified in this option will not close the calendar
+ ignoredFocusElements: []
+
+ # Displays the calendar inline
+ inline: false
+
+ # The locale, either as a string (e.g. "ru", "en") or as an object.
+ # See https://chmln.github.io/flatpickr/localization/
+ locale: "default"
+
+ # Adjusts the step for the minute input (incl. scrolling)
+ minuteIncrement: 5
+
+ # Date selection mode, defaults to "single"
+ # variants: single, multiple, or range
+ mode: "single"
+
+ # How the month selector in the calendar should be shown
+ # variants: dropdown, static
+ monthSelectorType: "static"
+
+ # HTML for the right arrow icon, used to switch months.
+ nextArrow: ""
+
+ # Hides the day selection in calendar.
+ # Use it along with "enableTime" to create a time picker.
+ noCalendar: false
+
+ # A custom datestring parser
+ parseDate: false
+
+ # Plugins.
+ # See https://chmln.github.io/flatpickr/plugins/
+ # plugins: []
+
+ # How the calendar should be positioned with regards to the input.
+ # variants: auto, above, below, auto left, auto center, above right, below left, below center, below right
+ position: "auto"
+
+ # The element off of which the calendar will be positioned.
+ # Defaults to the date input
+ positionElement: null
+
+ # HTML for the left arrow icon, used to switch months.
+ prevArrow: ""
+
+ # Whether to display the current month name in shorthand mode, e.g. "Sep" instead "September"
+ shorthandCurrentMonth: false
+
+ # Creates a wrapper to position the calendar. Use this if the input is inside a scrollable element
+ static: false
+
+ # Sets the number of months to show
+ showMonths: 1
+
+ # Displays time picker in 24 hour mode without AM/PM selection when enabled.
+ time_24hr: false
+
+ # Display week numbers left of the calendar.
+ weekNumbers: false
+
+ # See https://chmln.github.io/flatpickr/examples/#flatpickr-external-elements
+ wrap: false
+
+ template: plugins/flatpickr/blocks/Flatpickr/block.html
\ No newline at end of file
diff --git a/project/config/plugins/icon/settings.yaml b/project/config/plugins/icon/settings.yaml
new file mode 100644
index 00000000..e0b85b9e
--- /dev/null
+++ b/project/config/plugins/icon/settings.yaml
@@ -0,0 +1,5 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# Icon plugin priority
+priority: 1
diff --git a/project/config/plugins/page-view-counter/settings.yaml b/project/config/plugins/page-view-counter/settings.yaml
new file mode 100644
index 00000000..af67fe5e
--- /dev/null
+++ b/project/config/plugins/page-view-counter/settings.yaml
@@ -0,0 +1,2 @@
+enabled: true
+priority: 100
diff --git a/project/config/plugins/php-embed/settings.yaml b/project/config/plugins/php-embed/settings.yaml
new file mode 100644
index 00000000..d4ca9418
--- /dev/null
+++ b/project/config/plugins/php-embed/settings.yaml
@@ -0,0 +1 @@
+enabled: true
diff --git a/project/config/plugins/phpmailer/settings.yaml b/project/config/plugins/phpmailer/settings.yaml
new file mode 100644
index 00000000..ede80ba7
--- /dev/null
+++ b/project/config/plugins/phpmailer/settings.yaml
@@ -0,0 +1,5 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# PHP Mailer plugin priority
+priority: 100
diff --git a/project/config/plugins/reading-time/settings.yaml b/project/config/plugins/reading-time/settings.yaml
new file mode 100644
index 00000000..af67fe5e
--- /dev/null
+++ b/project/config/plugins/reading-time/settings.yaml
@@ -0,0 +1,2 @@
+enabled: true
+priority: 100
diff --git a/project/config/plugins/redirect/settings.yaml b/project/config/plugins/redirect/settings.yaml
new file mode 100644
index 00000000..0e49a99a
--- /dev/null
+++ b/project/config/plugins/redirect/settings.yaml
@@ -0,0 +1,3 @@
+enabled: true
+priority: 100
+redirect: []
diff --git a/project/config/plugins/section/settings.yaml b/project/config/plugins/section/settings.yaml
new file mode 100644
index 00000000..d4ca9418
--- /dev/null
+++ b/project/config/plugins/section/settings.yaml
@@ -0,0 +1 @@
+enabled: true
diff --git a/project/config/plugins/select2/settings.yaml b/project/config/plugins/select2/settings.yaml
new file mode 100644
index 00000000..05b5bc49
--- /dev/null
+++ b/project/config/plugins/select2/settings.yaml
@@ -0,0 +1,91 @@
+# enabled: true or false to disable the plugin
+enabled: true
+
+# Plugin priority
+priority: 41
+
+# Place to load
+assetsLoadOnAdmin: true
+assetsLoadOnSite: false
+
+# Blocks
+blocks:
+ Select2:
+ type: Select2
+ properties:
+ name: select2
+
+ # Select2 options
+ options:
+
+ # Provides support for ajax data sources.
+ # See: https://select2.org/data-sources/ajax
+ ajax: null
+
+ # Provides support for clearable selections.
+ # See: https://select2.org/selections#clearable-selections
+ allowClear: false
+
+ # Controls whether the dropdown is closed after a selection is made.
+ # See: https://select2.org/dropdown#forcing-the-dropdown-to-remain-open-after-selection
+ closeOnSelect: true
+
+ # Allows rendering dropdown options from an array.
+ # See: https://select2.org/data-sources/arrays
+ data: null
+
+ # Enable debugging messages in the browser console.
+ debug: false
+
+ # Sets the dir attribute on the selection and dropdown containers to indicate the direction of the text.
+ # See: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir
+ dir: ltr
+
+ # When set to `true`, the select control will be disabled.
+ disabled: false
+
+ # Dropdown auto width
+ dropdownAutoWidth: false
+
+ # Adds additional CSS classes to the dropdown container.
+ # The helper :all: can be used to add all CSS classes present on the original