All notable changes to twill
will be documented in this file.
- Configuration system for capsules #924
- Automated
belongsTo
browser field relationship #913 - Internal API documentation #929
- Connected fields array values support #935
- Capsules finder methods and helpers
d30f341d
- Ability to retrieve all image crops in a single call, as generated URLs or data arrays #928
- Ability to disable crops entirely on the
medias
field #9220a153c29
7dbfaef6
- Support for custom title key in related browsers #942
- Custom create modal view regression #920
- Subdomain routing regression #908
- Media Library uploads regression when using Postgres #941
- Fix "Unresolvable dependency resolving" problem #952
- Ensures app/Twill/Capsules exists during install
deff0a87
- Fix minor typos in documentation
3dcf4fa2
- Docs: update form fields documentation #945
- Docs: add missing docs for $permalinkBase
1609765b
- Docs: add duplicate param to $indexOptions
d665967d
- Docs: add skipCreateModal option to controller docs
08fd0167
- Update rebase GitHub Actions version to support forks with branches of the same name
e08ee215
- Capsules without translations: move HasCapsules trait to the base model
8b730e81
- Laravel configuration caching: set the capsules list config as an array
2b5b07a5
- Update documentation to reflect Laravel 8 support
c01c426d
- Fix wording and add proper method description
e1293551
- Laravel 8 and PHP 8 support #740
- After long months of compatibility testing and stability testing in production, Twill is finally compatible with the latest versions of PHP and the Laravel framework.
- Twill Capsules #729
- Twill Capsules are modules encapsulated in a single folder. Like modules, they can be generated from the command line, but they can also be installed from a remote repository. We think this will enable new ways for the community and ourselves to share reusable and customizable Twill modules.
- Deep nested modules #775
- When using dot notation to nest modules, it was previously only possible to use a single children module. With those changes, it is now possible to go add deep as needed.
- Image and file replacement from the media library #660
- This new feature enables your users to replace an image or file globally from the media library, preserving all relationships with records, blocks and repeaters where the image or file has been attached.
- Nested repeaters support outside of blocks
ce75aff1
- Algolia search in docs
c1d85e48
- Glide cloud sources classes to allow Glide and S3 integration
11f0f502
- Allow renaming tag tables
3f34da73
- Allow passing email and password directly on the command line when creating a superadmin user
812331d1
- Add target attribute in Twill navigation entries to allow opening in new window
3418edcc
- Automate CMS permalink for nested modules
94742f29
- Add ability to store more data from the Google Maps API #721
dfaa5f8e
- Allow to use a different name than relationship when hydrating a repeater #717
9ead6d5c
- Support custom model identifier key in controller #780
fce6465d
- Add optional note into the Browser modal (via the Browser Field)
b4cb5b83
- 2.1 regressions with blocks configuration #813
- Block name (configuration key) and component not matching issues
- Duplicate blocks and Twill blocks conflicts issues
- Show a better message when block is missing #712
3dd66067
- Add default icon and trigger (repeater) to Block
ae162ac3
- Logging deprecated use of block and repeater definitions in config
1beadaae
- Generate Vue Blocks only for 'compiled' and confirm overwriting if file exists
bc7dfa50
- Fix uploads with custom root path on S3
a92b6232
- Closes #553. The rationale for keeping the S3_ROOT in the uuid in database is to allow changing its value while keeping, for example, older uploads in the previous root (which might be connected to a different Imgix source). It would also be a breaking change to remove the root from the uuid in database. We might reconsider this for Twill 3.
- Fix S3-compatible storage compatibility (DO Spaces)
4c8cc698
- "Create and add another" fix for macOS Safari/FF #782
2d403516
- Nested listing: maxDepth now respected
9e9c7f8d
- Publication bug in module create modal #732
7afdca7f
- Broken variables for FR emails #734
2cc9984a
- Drop index error on mediables table #800
a29a0294
- Artisan make:module (deprecated) should prompt for input #725
a5b3ffc2
- Fix for checkboxes stored as string #694
27c9887c
736a0642
- Prevent the permalink preview from wrapping when over 52 characters long
33b5641d
- Don't create superuser while on no-interaction
efac9ff7
- Route name duplicating prefix and module
f446363b
- Don't render languages columns when only one is available
c46bdcda
- Fixed nested listing on undefined children
ef9a8dfb
- Documentation
- Vapor support
- We've had the opportunity to deploy Twill instances to Laravel Vapor and refactored the way Twill deals with its own assets urls internally in the process.
- Use vendor Twill manifest when public/ is missing
5ff29afe
- i18n
- Misc.
- Wysiwyg with Quill : set default styling for italic and underline in the editor
32bbfb4f
- Consider morphed models when getting the name of the class to obtain the repository
cad35392
- Easier to use starter route
0d9c0d09
- Make slug model namespace dynamic
308f2a92
3ba04e51
7cbbc253
- Preserve the blocks order when c
alling a block editor
deafbef0
- Add fallback for adminEditUrl in browser fields
a55f9848
3b16f22d
- Wysiwyg with Quill : set default styling for italic and underline in the editor
- CI and testing
- Setup CI tests on GitHub Actions
03ab2714
- With Travis CI dropping free support for open source projects, we've had to migrate to a new CI service. GitHub Actions made the most sense for us. The migration took time to get right but we now test a larger compatibility matrix, from PHP 7.1 to PHP 8 and from Laravel 5.8 to 8.
- Add on demand rebase GitHub Actions workflow
d2a5c8e3
- Add on demand frontend build GitHub Actions workflow
c8bdf928
- Turn on TestBench debug
8c40b7d9
- Display response errors
7bb74eec
- Setup CI tests on GitHub Actions
- Community updates
- Security
- Fix npm dependencies vulnerabilities
- Fix npm dependencies vulnerabilities in docs
- Fix block editor group parameter update
121b0166
- Both
group
andgroups
can be used and receive a string or an array
- Both
- Fix #701: settings forms regression
053c4ea4
- Fix skipCreateModal option on submodules
2474ae56
- Fix #670: multi select field doesn't prevent user from picking duplicated option
33e54a43
- Remove legacy product requirement on required fields (#697) (#699)
89469159
- Fix regression introduced by #620 (#702)
52b66289
- Self-contained blocks (#597)
1e95b0ac
9ae502a4
948985ef
66fa7c5e
c00759ee
- This change allows defining blocks without adding them to the
twill.block_editor
configuration - This is backwards compatible with blocks already defined in configuration
- Repeaters are now created in a dedicated folder:
views/admin/repeaters
by default, but your existing repeaters in theviews/admin/blocks
file will still work - Annotations are now supported in blocks and repeaters Blade files:
- Provide a title with
@twillPropTitle
or@twillBlockTitle
or@twillRepeaterTitle
- Provide an icon with
@twillPropIcon
or@twillBlockIcon
or@twillRepeaterIcon
- Provide a group with
@twillPropGroup
or@twillBlockGroup
or@twillRepeaterGroup
(defaults toapp
) - Provide a repeater trigger label with
@twillPropTrigger
or@twillRepeaterTrigger
- Provide a repeater max items with
@twillPropMax
or@twillRepeaterMax
- Define a block or repeater as compiled with
@twillPropCompiled
or@twillBlockCompiled
or@twillRepeaterCompiled
- Define a block or repeater component with
@twillPropComponent
or@twillBlockComponent
or@twillRepeaterComponent
- Example:
@twillBlockTitle('Body text') @twillBlockIcon('text') @formField('wysiwyg', [ 'name' => 'text', 'label' => 'Text', ])
- This change also provides new Artisan commands:
php artisan twill:make:block {name} {baseBlock} {icon}
, which generates a new block based on a provided blockphp artisan twill:list:blocks
, which lists blocks with a couple of options:-s|--shorter
for a shorter table,-b|--blocks
for blocks only,-r|--repeaters
for repeaters only,-a|--app
for app blocks/repeaters only,-c|--custom
for app blocks/repeaters overriding Twill blocks/repeaters only,-t|--twill
for Twill blocks/repeaters only
php artisan twill:list:icons
, which lists all icons availablephp artisan twill:make:module
, equivalent to the now deprecatedtwill:module
which will be removed in Twill 3.0.
- Provide a title with
- This change allows defining blocks without adding them to the
- Resolve npm modules from root app (#617)
360d82c1
- This change allows requiring node modules from the root project folder. Previously, custom Vue components could only use npm packages installed by Twill itself. With this change, any npm package from the main app can be required. We do this by adding the root
npm_modules
folder to webpack’s module resolver.
- This change allows requiring node modules from the root project folder. Previously, custom Vue components could only use npm packages installed by Twill itself. With this change, any npm package from the main app can be required. We do this by adding the root
- Add a new option to skip the add new modal to create records (#642)
1ec1f428
- This change allows users to create full records by landing directly on the form when adding new records
- It is enabled through the new
skipCreateModal
option of a module's controller$indexOptions
array.
- Implement a new behavior to allow saving repeaters into json columns (#654)
85f96306
a2fffa4f
- This trait is not intended to replace main repeaters but to give a quick and easy alternative for simple elements where creating a new table might be an overkill.
- Simply define an array with repeater names on your repository:
protected $jsonRepeaters = [ 'REPEATER_NAME_1', 'REPEATER_NAME_2', ... ]
- Add new options to medias and files form fields
c564ecc2
571cc1e9
- filesizeMax, on the files field, to prevent selecting a file which filesize is above provided value in mb
- widthMin, on the medias field, to prevent selecting an image which width is below provided value in px
- heightMin, on the medias field, to prevent selecting an image which height is below provided value in px
- Added new option to display filenames of images in the media library grid (#658)
2034b6e7
- Add confirmation modal option to checkbox and radio form fields (#687)
41261c18
b152cdd9
fe6ec3d0
- Allow user to filter by unused images or files in the media library (#688)
a52349a9
261941fc
- Add admin title tag suffix to config (#680)
3aefcdc3
- Support checkbox form field in settings
d62d303f
- Support date_picker and color form fields in settings (#576)
f66aaa68
- Allow 3 columns layout by setting up a middle columns (#638)
2b2e3e49
- Allow browsers to sync extra pivot attributes (#629)
f33b8825
- Provide env variable for configuring custom s3 hosts
5894ccce
- Add ability to provide a custom morphed repeaters name (#679)
3a118bc3
- Support required option on wysiwyg form field
e780bcfd
- Support disabled option on select form field
e780bcfd
- Allow format change in datepicker field (#628)
936057d8
- Allow datepicker format in publication dates (#636)
477bc288
- Allow a model class to be passed instead of the relation name (#640/#619)
8bf8e8f0
- Add new
buttonOnTop
option to medias, files and browser form fields (#598)964c99a0
cf8ead0d
- Provide optional parameters for changing label and including a note in tags form field
0d535710
- Fix new listing actions behaviors
2d1b2eb5
- Destroy action was not removed when disabling forceDelete in indexOptions
- Duplicate action was showing in trash and was not removed when disabled in indexOptions (which is by default)
- Fix bulk destroy integration
- Fix validation errors display (#605)
fc5b16a9
- With the simplification of the exception handler in #561 the override of the invalidJson method was dropped by mistake. It is currently necessary as the frontend expects errors only in a validation exception response. In future improvements it would be better to keep the default Laravel response format and update the frontend to read one level deeper.
- Fix local disk and Glide base url request scheme resolution
15a2dbea
- This commit introduced an issue by using request() in config. When using php artisan config:cache that request is not coming externally with the appropriate headers.
- Fix draggable regression on datatable
a79e3d2e
- Fix scheme being added twice when APP_URL has the scheme (#651)
2e5784cc
- Fix Twill form utils aliases on Laravel 7
c0018e5c
- Fix connected fields component alias
4b61b78e
- Fix typo in translation
c0c492c5
- Fix child module redirect when adding new records in Laravel 6 / 7
e60c5066
- Fix filesize limit uploader error display (#614)
21263a3e
- Fix missing row duplication event handler for nested tables (#615)
c50b16d2
- Fix translateTitle in a form (#648)
8f5b0e28
- Fix route name duplicating prefix and module (#591)
267eec02
- Fix media form fields binding
73104e62
- Fix blocks spacing
56b5bc21
- Fix icons missing svg attributes
c29b9dd6
- Fix tests
cd50ea9d
- Fix translated medias in settings (#620)
e036313d
- Fix select with no options (#625)
3adea583
- Fix select field in settings: wrap string values in quotes (#653)
86d72939
- Fix preview iframe resizing for blocks (#669)
33f77ee7
- Fix notifications url (#678)
379df54c
- Fix multi_select values escaping (#690)
d54b94ac
- i18n improvements (#624/#573/#632)
fc856c40
ba802587
- Added a twill:sync-lang command to generate lang files from a CSV input
- Configure vue-timeago to respect the set locale
- Configure date-fns and flatpickr so they respect locale
- Update french translations
3b01dcfa
edd47e7a
- Add norwegian translations (#602)
12acbd6f
- Add italian translations
6389ffdd
1155d33e
- Add spanish translation (#689)
65789733
9163757d
- Fixes in russian localization (#586)
1d03572e
- Dynamically set time format using Internationalization API
8d53a489
- Update i18n keys and exported CSV
4cef3f5d
39346337
- Log Twill APIs exceptions in browser console
c6956b8f
- Improve tree reorder algorithm for nested modules (#600)
c00bf011
- Ignore symfony dump buttons in preview to be able to expand dd() output (#657)
90524b47
- Pass the block currently being rendered to the layout view (#664)
67df265a
- Make hydrateHandleBlocks and blocks preview recursive (#644)
eb41a1b8
- Add secondary_navigation example in docs (#692)
19879f01
- Documentation improvements
ce7c8f95
2c1a0d29
5e223e52
8822c21a
af410508
0f7b3a05
8aead1f3
4a090409
e6c313c3
3c2c3a1f
- Update composer deps
8082d7a2
- Update docs dependencies
ff1c7c7a
- Update frontend build and version
d49df23
- Update npm dependencies
11711592
- Add nested module test
b2c2b01b
- Update distributed assets
2a1fe7c5
a87aea14
8ca8cb23
63a10782
5eb8654d
2f48abc3
2b877921
687ad5f6
- Fix fields not rendering after switching locales (#572)
4ea1943b
- Fix duplicate action on Laravel 7
a30922b1
- Update distributed assets
4e19670c
- Update 2.0 changelog
24fa0942
- Update CHANGELOG.md
cb923aa6
- Fix changelog release date
57cd4e3e
We're really excited to release Twill 2.0 after a few months of focus to really set the project up for success. We've responded to the community pain points, supporting both Laravel 6 and 7, removing the need to build blocks and assets, improving documentation, introducing automated testing, and many more updates and bug fixes you can read more about below.
We were also very positively surprised by the number and quality of external contributions. Twill now has 42 contributors, twice as much as our previous release, and community members are starting to provide excellent support to other developers from their experience working with it. Thanks a lot to everyone involved! Twill also surpassed 20k installs recently!
We also want to note we understood the concerns shared by the community about our lack of releases in the past few months, and hope that this release will make you love working with Twill even more after patiently waiting for it. Our support for Laravel 6 took time to perfect, with dependencies going deprecated. Our changes to the frontend build or to the repositories traits needed to be challenged in different codebases. Stability is key for our users and it was important for us to take the time to make it right.
We could have tagged Laravel 6 support earlier though, that's entirely true, and that's something we want to address moving forward. We will now commit to releasing at least once every month. We might not want to be as quick as Laravel with a major release every 6 months, but we will be more actively releasing even if it is for a few minor fixes, that's for sure. With that said, we also want to say thank you to all the developers that tested our changes on the master branch during the past few months. It's been incredibly helpful to get feedback and contributions from the community.
We hope you enjoy this release, it is quite a big one. We're already excited about the next one!
HOW TO UPDATE
First, update your composer.json
file by using: "area17/twill": "^2.0"
.
Run composer update
in your project and then, run Twill's own update command: php artisan twill:update
. This will force update your published Twill assets. You can delete the old ones from your repository.
If you're worrying about your custom blocks disappearing from the build, you should not! Blocks are now rendered at runtime, without you having to compile them from Blade to Vue components or wait for Twill to rebuild its assets anymore! Check out our changelog below to learn more.
Finally, you will need to migrate your database using php artisan migrate
. Read more below on what might affect your existing codebase before doing so.
- Semantic versioning
- Laravel versions support
- Blocks and frontend build workflow
- Database migrations loading strategy
- Database migrations changes
- Translation models
When releasing Laravel 6 at Laracon US last year, Taylor Otwell explained why v6 instead of v5.9, since it wasn't a "paradigm changing" release for the framework. That was because Laravel adopted semantic versioning (major.minor.patch
). For simplicity, and because this is common practice for open source projects, we made that shift as well.
Starting with Twill 2.0.0, major releases are released only when breaking changes are necessary, while minor and patch releases may be released as often as every week. Minor and patch releases should never contain breaking changes.
When referencing Twill from your composer.json
file, you should always use a version constraint such as ^2.0
, since major releases of Twill do include breaking changes.
Until recently, Laravel and Twill were following romantic versioning (
paradigm.major.minor
). This is why Twill 1.2.2 was not just about patches but new features and improvements as well. Because today's release includes breaking changes and Twill now follows semantic versionning, we have to tag it as2.0.0
, even if it is not a paradigm shift at all.
Twill 2.0 supports Laravel 6 and 7, but does not support Laravel 5.4 and 5.5 anymore. 5.6, 5.7 and 5.8 are still supported.
We've removed all references to deprecated Laravel helpers from Twill, updated dependencies, and deleted some deprecated code from dropping support of 5.4 and 5.5.
We've also migrated from the deprecated dimsav/laravel-translatable to astronomic/laravel-translatable.
We've removed the Debug Bar and Inspector debugging packages as Laravel now ships with Ignition and we felt like developers should be able to pick the tools they prefer.
It is not necessary to rebuild Twill's frontend when working with blocks anymore. Their templates are now dynamically rendered in Blade and loaded at runtime by Vue. Practically, it means you do not need to run php artisan twill:blocks
and npm run twill-build
after creating or updating a block. Just reload the page to see your changes after saving your Blade file!
This is possible because Twill's blocks Vue components are simple single file components that only have a template and a mixin registration. Blocks components are now dynamically registered by Vue using x-template
scripts that are inlined by Blade.
In the process, we've also migrated from Laravel Mix to the latest version of Vue CLI, to have better control over our build. That also allowed us to fix an issue that had been annoying to quite a few users: conflicts with your own application's Laravel Mix configuration. Now, Twill's publishes it's manifest to its own directory with a custom name, and won't be a blocker to running both of your builds if necessary anymore.
If you are currently using custom Vue blocks (as in, you edited the template
, script
or style
section of a generated block Vue file), you will still need to rebuild Twill assets as you used to, but we have a 2 new Artisan commands to help you and we recommend to use them instead of our previous versions' npm scripts:
php artisan twill:build
, which will build Twill's assets with your custom blocks, located in thetwill.block_editor.custom_vue_blocks_resource_path
new configurable path (with defaults toassets/js/blocks
, like in previous versions).php artisan twill:dev
, which will start a local server that watches for changes in Twill's frontend directory. You need to set'dev_mode' => true
in yourconfig/twill.php
file when using this command. This is especially helpful for Twill's contributors, but can also be useful if you use a lot of custom components in your application.
Both commands take a --noInstall
option to avoid running npm ci
before every build.
With that, it is now possible to define a block as being compiled
in the twill.block_editor.blocks
configuration array so that the imported Vue file is prefered at runtime over the inline, template-only, version, and so that you can use the new no-build workflow for all your regular blocks!
It is also possible to completely disable this feature by setting the twill.block_editor.inline_blocks_templates
config flag to false
.
If you do disable this feature, you could continue using previous versions's npm scripts, but we recommend you stop rebuilding Twill assets entirely unless you are using custom code in your generated Vue blocks. If you do keep using our npm scripts instead of our new Artisan commands, you will need to update twill-build
from:
"twill-build": "rm -f public/hot && npm run twill-copy-blocks && cd vendor/area17/twill && npm ci && npm run prod && cp -R public/* ${INIT_CWD}/public",
to:
"twill-build": "npm run twill-copy-blocks && cd vendor/area17/twill && npm ci && npm run prod && cp -R dist/* ${INIT_CWD}/public",
On top of custom blocks, we've also made it possible to rebuild Twill with custom Vue components. This can be used to override Twill's own Vue components or create new form fields, for example. The new twill.custom_components_resource_path
configuration can be used to provide a path under Laravel resources
folder that will be used as a source of Vue components to include in your form js build when running php artisan twill:build
.
We also namespaced our inline javascript variables to prevent any conflict in the global window
moving forward. We know that window.STORE
and window.vm
were being used to hook into Twill's frontend application by some developers. This commit tried to make sure to keep that working , but your mileage may vary if you are overriding Twill views. You should update to window.TWILL.STORE
and window.TWILL.vm
or even better, using window.{{ config('twill.js_namespace') }}
instead of directly using window.TWILL
if you are in a Blade file and process.env.VUE_APP_NAME
if you are in a Vue file.
Finally, to help custom workflows, maintainers and contributors, we made everything configurable:
manifest_file
, which defaults totwill-manifest.json
public_directory
, which defaults toassets/admin
, like in previous versions, and can now be controlled through theTWILL_ASSETS_DIR
environment variabledev_mode
, which defaults tofalse
dev_mode_url
, which defaults to http://localhost:8080 and can be controlled through theTWILL_DEV_MODE_URL
environment variable.
d88ab7a0
/969e1260
/#510
/13a37fb5
/c309a3a1
/4a61875d
/9bc9c249
/dc0c5043
/43f4f6e1
/b86e8d2d
/f80278c0
/482af7fd
/6676c8e0
/3ca864bc
/ea3d7a99
/1cfd81e2
/c183b914
/20f2e022
/0a0692bf
/fb0236f2
/4cfd4f61
/ed4de74f
/e37b4cd1
/228105a3
/fbad6585
/d4f04f6b
/2ac51b3c
/5f49f67c
/471f654f
/160743b4
/b92c9d95
/0f326d59
/82b35ac2
/cedbea45
/9a754806
/45ff20c1
As recommended by Laravel's documentation, we've decided to load Twill's database migrations without publishing them. This will allow more flexibility in the future and it avoids polluting the host application migrations folder.
A boolean config key has been introduced to control this new behavior: twill.load_default_migrations
. It defaults to true
starting with Twill 2.0.
Even if you are migrating from a Twill 1.x application, you should not have to worry about running those new migrations as they have been modified to always check for existence (or inexistence) of tables and columns before doing anything. If you want to maintain migrations yourself, feel free to disable this option and use Twill's migrations
folder as a source of truth to update yours.
We've also prepared for all tables to be prefixed by twill_
in the next major release and exposed new config keys to control their names so you can already start using prefixed tables with Twill 2.0.
372#issuecomment-537965676
/7fced605
/ee489635
Like Laravel, Twill now uses big integers in migrations helpers. This is a breaking change with backwards compatibility provided through the twill.migrations_use_big_integers
configuration key.
Twill now automatically takes care of your translations models fillable
by reusing your translatedAttributes
array as long as you define a $baseModuleModel
, which now happens automatically when generating modules from the CLI. This is not a breaking change but we think you should update to this new approach to avoid duplicating your columns list in 2 files.
#414
/c4e3c3fa
/957702ac
/7a783deb
/cc958d4d
/c8151ede
- Smarter CLI
- Automated testing
- OAuth login
- JSON fields groups
- Azure uploads
- CMS i18n
- Duplicate records
- Destroy records in the trash
- Automated browsers and repeaters
- Subdomain routing
- Tiptap WYSIWYG
- And more...
Twill's module
command now offers available options through a series of questions and then generates model and migration files content dynamically depending on provided options, removing previous versions comments, providing a greatly improved developer experience.
You can use the new --all
option to enable all traits without any prompt. When providing no option, the prompt defaults to yes for all options. When providing one or multiple options, the prompt defaults to no for all other options.
It is possible to use artisan's --no-interaction
option to skip the prompt.
TravisCI is now testing Twill on all currently supported and future PHP versions. Almost 60% of all the PHP code is now covered by a PHPUnit test. Syntax errors are being checked by PHP-CS-Fixer and Scrutinizer CI is now analyzing Twill's codebase at every single commit. Prettier is now configured to maintain Twill's PSR-2 style. PHPStan also helped us fixing a few issues.
38e224ea
/e1e67949
/213b2c9b
/#516
/5af10938
/#517
/3a3605b6
/#533
94362dc5
/3d468aa4
/c287dc18
/18b069f3
/d0cab04c
/f6d2e720
/c13a267a
/9f30604d
/35749445
/85c2730c
/915053eb
/0c753c4f
/3c7e9a82
/3956339f
/6416e41b
/7cb0ac44
/21436f5c
/8f8316bb
/ff2b37e6
/466e2cc0
/c7ad1b91
/2dd11547
/5d2f7eb0
/c6f8a1ec
/2df4e94d
/6c59927a
/6a92f46b
/5cf42a51
/5082beb6
/4c5dda9e
/57c770db
/9599a055
/fc801000
/10669f1f
/cc3d5637
/0b75750e
/723f8c08
/ceb6b39d
/90898bbc
/c86b9700
/2819959f
/094a9fab
/2c2ea3ec
/9639281b
/727416e4
/cb0cb0f7
/6892e5a4
/acddf89d
/dfab755b
/2df955e9
/c4b8b599
/18405838
/ca929ecd
/7fa3a133
/708c8ced
/8bd24c28
/28de0782
/42f48b08
/12eea8ed
/bec7af63
/1c8567c5
/aa61012a
/a80b6e3c
/a85a4255
/9631e7c5
/b1308bad
You can enable the new twill.enabled.users-oauth
feature to let your users login to the CMS using any third party service supported by Laravel Socialite. By default, twill.oauth.providers
only includes google
, but you are free to change it or add more services to it. In the case of using Google, you would of course need to provide the following environment variables:
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_CALLBACK_URL=https://admin.<madewithtwill.com>/login/oauth/callback/google
d07002e3
/afd14245
/ 06ec2d4e
/be848d6e
It is now possible to automatically save and retrieve multiple form fields in a single JSON column in database. See #410
.
5564e488
/#452
/657e83cf
/#501
/b48793af
/#541
/74926425
/6437a073
/84176e44
A new endpoint_type
to support Azure storage of all uploads, exactly like when working with S3.
#424
/2129c084
/#443
/d81a5b94
/b7a89f38
/4bf2e133
We added a new layout to enable creating custom pages, keeping the navigation of your admin console. See our dedicated documentation section.
f1f62e16
/b72b6d12
/6040300e
/ef4e748d
/cc79fd83
/42869139
/8b5271d5
/ca5f3ce0
Clean up your repositories with this new feature that will automatically save and retrieve browser and repeaters fields for you. See #400
968e7da2
.
#467
/f5cef179
/89c2297c
/6fd64187
It is finally possible to destroy and bulk destroy records in the trash!
Records can now be duplicated from the listing page.
bb706c26
/a4e2d870
/068b6f2c
/8e39f165
/a32100e9
/bcce64fd
The CMS UI can now be translated. We are shipping this update with Russian and Chinese translations. CMS users can choose their preferred language in their profile. As we are updating this changelog, French, German, Dutch, Portuguese and Polish translations have already been contributed by the community.
#563
/#565
/#566
/de60c543
/b22e7b4b
/6f7d0527
/2abd8160
/7369838a
/af9f995d
/293f74ca
/e5eca909
/cb2da8c1
/07ddbdb7
/664cd633
/6de8008b
/cbd50c6c
/871a5ac4
/ff59fd83
/ecab8b9e
/e5540f73
/455595c7
/4e9420b1
/74fb490b
/90c303b4
/b8470635
/7e9f6d72
/26bbc59e
/8941bec9
/49a04f3d
/93c206c9
/fe37e5c3
/4dbc43ed
/d5ce295d
/56e7fed2
/f26f6a70
/becebc53
/01f629d8
/502165e7
/71209b66
/a5f097d3
/55ed36be
/f92e93c5
/d9c70aaa
/267c6672
/57a19985
/c5d514b1
/b593ad38
/abb61e38
/c1e59ba1
/11a094b7
/05ff649b
/ca27cbb4
/154d0d59
/8bdb2192
/cb482ea8
/6dcef35f
Enabling the new 'twill.support_subdomain_admin_routing'
config key allows adding top level keys to Twill's navigation and dashboard modules configuration, mapping to a subdomain. This is a very simple way to implement multi-tenant CMS/sites in Twill.
A navigation array looking like the following would expose your CMS on the admin.subdomain1.app-url.test
and admin.subdomain2.app-url.test
urls, with its corresponding links:
<?php
return [
'subdomain1' => [
'module1' => [...],
...
],
'subdomain2' => [
'module2' => [...]
...
]
];
App name can be set per subdomain using the 'twill.app_names' configuration array. For our example above:
<?php
return [
'app_names' => [
'subdomain1' => 'App 1 name',
'subdomain2' => 'App 2 name',
],
];
Subdomain configuration nesting also applies to the dashboard modules
key.
You can also provide a custom block_single_layout
per subdomain by creating a Blade file under resources/views/subdomain/layouts/blocks
.
In order to provide HTML tables support in the WYSIWYG form field, we've integrated the Tiptap editor with Twill. You can use it by using the new type
option of the wysiwyg
form field, with the tiptap
value. You can then enable the table
button in your toolbarOptions
.
ae62d294
/150eb3b1
/754e4cce
/cf25ee82
/e8b450db
/6d396a16
/6bb6e25b
/5f798ef6
/bc58e7e3
/6323071b
/584a622e
- Add form utils component aliases
5d5fa662
@formFieldset, @formColumns, @formCollapsedFields, @formConnectedFields, @formInlineCheckboxes
- Add sideFieldset and sideFieldsets sections to form
807674a2
- Add slot to publisher component
f4fceac4
- Fix #90 Add maxlength option to image metadata
54233d21
- Allow enabling svg rendering parameters in Imgix and Glide services
e3d89bc0
- Add disabled property in the form submitOptions
9129e642
- Support custom repository in dashboard and buckets configuration
9d3578e3
- Expose glide configuration
b95ca7f6
- Added get preset url for glide
26015870
- Support multi-browsers in blocks
f6cea4e5
- Add FilterLinks on Listings and Buckets
3a83a069
/c4c22bee
- Add new icons
c762ea21
#397
Support Glide Presets6afbbf5b
#521
Added support for nested repeaters in block0470afda
#526
Implement updateRepeater() for morphMany relations26a0d2de
#528
Added an extra prop to repeater field to override the name0ce0c4cc
#551
Display and apply default filters in listings77eb7f23
#562
Add new fieldNote option to browser, medias and files fieldsaa7a1c5d
#371
Fix maps implementation when printing values from an array.e6a6ac2d
#380
Bug fix with undefined route name when blocks-editor is disabledeaacdbcc
#381
Add check on translatable input store to prevent duplicate field objects2544d059
#385
Fix create superadmin user Artisan command2425ea37
#390
Fix ignoring current email in UserRequest9a6a1c10
#395
Fixed TTY issue for twill build command #23690141c36
#402
When hydrating an old revision, include the ID so relationship methods don't fail62914c81
#418
Fix join() syntax57fbdaf1
#421
Display error when the blocks dir is not foundfed7b92f
#423
Fix missing /js/blocks dir on twill:blocks command47440423
#425
Fix published being sent as string on json1cafa780
#427
Fix google2fa settings not being enabled702e31a3
#429
Fix some deprecated helpers2f1e3489
#431
fixed an http & https issue from APP URLabb1509f
#446
Fixed 'delete' => true not working in indexOptions, refs #28981a32414
#449
Fix « Handle Repeater » feature compatibility with Laravel 5.67b0a275f
#459
Wysiwyg - Counter limit (fix counter limit in Textfield)01151e54
#460
Wysiwyg - Make sure quill is ready when checking content length392f29c0
#461
Forms with no Content fieldset : fix sticky publisher module and fix sticky nav sections9a87a2b7
#469
Check the index exists before trying to save browsers in blocksd1c99948
#475
Fix the admin url of an element in the browser listing44ad2182
#481
Fix typo in docs for nested module764d9fc2
#484
Fix join() syntax in MediaLibrary/Glide.php40288a9f
#485
Fix/destroy sub modulece5d88a0
#506
add required namespaces for Arr and Str in views and blade macrosff811087
#509
Fix inconsistent use of integer and bigInteger on MariaDB 10.3c36252de
#523
Fixed a bug causing select field not accepting default to be falsed1ca7681
#536
Exception handler should return json response on ajax calldec4714a
#539
Fix getSlug() function when locale fallback is activatedc48ca396
- Fix #41 – Use text columns for medias and files uuid, alt_text, caption and filename, make alt_text nullable
96cdebd8
- Fix #504 Swap order of breadcrumbs and secondary nav
2f9a9070
- Apply mine filters on dashboard drafts only if revisions are enabled
0481894d
- Fix activity log breaking on destroyed subjects
d1a18490
- Fix lang switcher border
4ca820fa
- Fix spacing issues
dfea4805
- Fix isAjax check on VSelect component
46a6b424
- Force assets publish on twill:update
21e3fda9
- Fix deeper Twill namespaces
d64a1585
- Fix typo for issue #362
ac76481c
- Fix environment requirements in docs
40ab9d93
- Fix #290 implementation
076ed178
when uploading multiple files at once, the endpoint root was appended once for each file and when not providing the environment variable, null was appended
- Fix missing AWS_ROOT variable
2a467f22
- Fix #399 dashboard repositories service container resolution
8491bbf5
- Fix regression on form notifications
991a6212
- Fix bulk delete warning modal reference
b515028e
- Fix module maker migration generator
8e7fd67f
- Fix migration stub typo
ea14f330
- Form - Make sure $disableContentFieldset is defined
296cb90d
- Prevent LQIP generator command crashes by letting it skip on exceptions
68d9ad6c
#386
Refactor calling trait methods from repository7e45019e
#387
Refactor getLanguageLabelFromLocaleCode to use php intl's "Locale::getDisplayLanguage"e85ff145
#396
Added Logo and Badges to README3bb38272
#398
Responsive filtersb95820f4
#404
Change the way of maintaining Twill version numberd4ba16a3
#430
Move logic to modele1ac4abf
#442
Implement a Sortable function closer to the one offered by Translatable.e46b2318
#445
Replace bcrypt() with Hash::make in CreateSuperAdmin command00711ede
#450
Add style for subscript into wysiwyg8e00ed1e
#500
Extend slug character supportfe888ffe
#534
Slug characters extended42071f08
#537
Refactored HandleRepeaters trait136e7123
#538
Refactored HandleBrowsers trait61a1e810
- 2.0 version and docs updates
f7f2aff1
- Allow using the content editor even if revisions are disabled
b0095e4f
- Add message clarifying grouped validation error messages in blocks
e35afce6
- More 2.0 docs adjustements
e39e029f
- 2.0 documentation updates
09e22483
- Allow firstOrCreate to have only attributes
01415792
- Use bold font in wysiwyg editor content
bbb1bb99
- Disable Quill warnings
4fc8f3a7
- Consider itemLabel better in browser and files form fields
57e4d9da
- Button : add download and rel attributes
cc790342
- Button with a:href : update props and add target
9a2cdd8c
- CSS - set default button as inline block to avoid small visual regression
416dcb4c
- Button update default styling so it works with ahref
204efc6b
- Refactor Button component so it is using render function and can be used to display links
993b8bee
- Invert sorting order in ModuleRepository.
78a36d7f
#428
Use 'SemVer way' of requiring packages in composerad92fbf2
- Update composer.json
786d2606
,93a2f5ab
,aef641f5
,1aaf8ae9
- Update distributed assets
1c74628b
- Update docs dependencies
1990f8ca
Twill just surpassed 10k installs and today, version 1.2.2 is available with a significant amount of improvements and bug fixes thanks to the efforts of 21 contributors: Amr Noman, Antoine Doury, Antonin Caudron, Antonio Carlos Ribeiro, Bram Mittendorff, Daniel Ramos, Dmitrii Larionov, Fernando Petrelli, Franca Winter, Gilbert Moufflet, Jarred Bishop, Lorren Gordon, Nikhil Trivedi, Pablo Barrios, Quentin Renard, Rafael Milewski, Ray Tri, Riaan Laubscher, Stevan Pavlović, Yanhao Li, Žiga Pavlin.
Glide support for local image rendering
Glide is an open source image rendering service that integrates well with Twill and Laravel. It is a self-hosted option for local development and/or production websites and apps that have limited needs for image resizing and cropping. For image-heavy production websites and apps, we still recommend Imgix or a similar third party service, or at least setting up a CDN on top of your images.
The media and file libraries local
endpoint type has also been completely reworked to work with Laravel default public storage location. Remember to run php artisan storage:link
locally and as part of your deployment process if you are using local uploads rather than S3.
To try out Glide on a fresh Twill app, it is as simple as updating 2 environment variables:
MEDIA_LIBRARY_ENDPOINT_TYPE=local
MEDIA_LIBRARY_IMAGE_SERVICE=A17\Twill\Services\MediaLibrary\Glide
Of course, more configuration variables are available through the new glide
key of Twill's configuration. See the default configuration here.
Making repeaters happy again
Repeaters had a couple of issues that are now fixed in this release:
- repeaters in forms are now updating the initially created database record instead of needlessly creating a new record each time their parent model gets updated
- repeaters in blocks are now restored correctly when restoring a past revision
- medias and files fields support has been improved
Different images per language support
You can now globally enable the ability for your content editors to provide different images per language in the media form field using the media_library.translated_form_fields
configuration key (defaults to false
). The user experience is exactly the same as our other translatable field. When rendering in a template or API, you can fallback to the default language if no image has been selected for the current language.
Cleaning up internals
Lead by community member Stevan Pavlović, an effort to clean Twill internals begins with this release. Laravel helpers and facades are getting replaced by dependency injection or at least, for now, to avoid consequent breaking changes, by fully qualified imports.
And a lot more in the changelog below!
HOW TO UPDATE
To update, you will need to run composer update
in your project and then run the new Twill provided artisan command: twill:update
. This will generates new database migrations and invite you to migrate your database. Those new migrations are safe to run as they check for the existence (or inexistence) of tables and columns in your database before doing anything. If you are upgrading from an earlier version than 1.2
, you will need to update your composer.json
file first: "area17/twill": "1.2.*"
.
NOTE ABOUT UPCOMING LARAVEL 6 AND SEMANTIC VERSIONING
Laravel 6 upcoming release was announced a few weeks ago at Laracon US! Twill will of course support it soon after the official release, which should happen at the end of August at Laracon EU 🤞.
Taylor Otwell also explained why v6 instead of v5.9 since the next release is not a paradigm shift for the framework: Laravel is adopting semantic versioning (major.minor.patch
) and for simplicity, we will make that shift as well.
Right now, Laravel and Twill are following romantic versioning (paradigm.major.minor
). This is why Twill 1.2.2 is not just about patches but new features and improvements too.
Moving forward, once Laravel 6 is released, a release with breaking changes will be considered major, which would mean Twill 2.0.0 right now. A release with new features would be 1.3.0, and patches would be 1.2.3.
You can start using Composer's caret version range (^1.2.2
) now if you'd like to benefit from new features without fearing breaking changes on your next composer update
! If you'd rather stick to a stricter way of requiring Twill versions (fair enough, we do that in Twill's npm dependencies for your own safety), you will have to update your composer.json
file to get new features rather than patches only.
- Local image rendering service using Glide 🖼 (6e427fc6, e878b9af, 2a54c030, 0e8adb85)
- Support for translated medias field and extra metadatas (d16386e5, 484c3c1e, e384dad4, 5b28acf7, 4db1ff45)
- Support for maxlength counter on WYSIWYG form fields (d6301ff7, 93af3915, c916e760)
- Support for block groups (57bed474)
- Configuration option to prefix s3 uploads (#290) (b85df5ac)
- Helper to dump ready to use SQL queries (87e20508)
- Option to provide a custom static permalink under the form's title editor (f9c6ed71)
twill:update
command and new database migrations for 1.2.2 (b251ffa0)
- Fix media and file local libraries: local disk is now defined automatically by Twill, and configured to work seamlessly with Glide (10b9cc7a, 52cabe32, ff1add80, 10aa2c53, 876c93a2)
- Fix repeaters issues with restoration, update, medias and files fields support (7ec42565, 6425a3fe, c2703b25, 60a239b8, 7e348f4d)
- Fix #32: markdown based mail notifications breaking in host Laravel apps (c0239ad7)
- Fix authorization gates conflicts (d2036f29, b08b1218)
- Fix default Quill.js WYSIWYG theme rendering (e593ac6f)
- Fix browser when a selected item is deleted (5e085139)
- Fix global search input misbehavior (31fef7ce)
- Fix publish button label copy when publishing is not available (82ec2c8d)
- Fix Twill dev script console errors by disabling host check in hot script (0707f5bc)
- Fix Twill provided blocks validation rule (cc277f5e)
- Fix support for custom app namespace (#280) (eb780a5b)
- Fix canvas rendered cropped image no-cache hack (#261) (ebe4450b)
- Fix S3 uploader signature function calls (#259) (41828cd5)
- Fix missing header method exception in ValidateBackHistory middleware (#234) (2ee1080d)
- Fix media metadata helper issues (1b07f493)
- Fix some documentation typos (df870b54, a6dda857)
- Fix some styling bugs (faa4f89e, 77e4d2d0)
- Fix dashboard settings: activity option was not used (f67ca2ef)
- Twill's CLI now automatically format the provided module name to be valid:
article
,articles
,Article
, you name it, will now correctly generate file for anarticles
Twill module with the correct stub replacements. (3e5d6e99) - Forms extensibility improvements (d2f4008c, 7382c64c, a06b7a8a)
- Switch from push() to save() when creating/updating models (661e5cfd)
- Add more Language code to label mappings (#299) (d842b441)
- Support more languages in frontend slugify function (2f656287)
- Improved support for Quill.js toolbar modules on the
wysiwyg
form field (e593ac6f, ff9a8319, 3f675d27) - Improve support for translatable.use_property_fallback (15a9331b)
- Use morphClass consistently in browsers (4ec38c2b)
- Use module controller defined scopes when counting by status (56a2d3aa)
- Code quality (replace helpers and facades by dependency injection when possible or fully qualified facades) (6f449ac2, 89687c1f, 9554a0cd, b0a3297c, 358ca416, 86192a16, 21068eb3, d443309d, 05bdfa2a, 80a0f919, 5acb7f1f, 49b2c664, 7625fb33, 1dea3d93, 6972435b, d597f713, 1de922b6, 37b4fd2a, 6092fba0, 6fe254a8, 5044c8ef, f9e2b5cd, c9ef6b52, bcc77308, 2b3f6d3f, df3650a0, a6106b7e, 6b5c49ac, d80ef94c, c889c116, 4f80c83d, 6f4e9c92)
- Update composer dependencies (e1dfc11e)
- Update npm dependencies (06184c0b)
- Update docs to VuePress 1.0 (72217206)
- Laravel 5.8 support (#209)
- CMS users 2 factor authentication (requires the
php-imagick
extension installed when enabled) (2753b4aa) - Media library custom fields (181eabe3)
- Browser field with multi-types (a0804b7, e6864f4)
- Medias, select and radio fields support in settings (#87) (5ba1dcd, 8d251f1)
- Support for default values in input and wysiwyg fields (1b27210)
- Add option to keep value inside connector field when toggled (d0a92f2)
- Implement an easy way to check for images existence (#53) (19e6f8f)
- Provide a way to disable the main content fieldset in forms (862307e)
- Add wide modal option to browser form field (#105) (389ce5d)
- Enable HTML rendering in browsers (#100) (f318bb1, 9ff1bc5)
- Add a way to add pattern for the routes and domain of the admin (fbc4919)
- Fix medias and files form fields conflicts (#72) (adbfe66)
- Fix login error state (e55fd55)
- Fix npm scripts in documentation (5a6d368)
- Correct documentation typos (#43) (aece0a3)
- Fix reference to hard-coded twill users table name by using config value (ec9b377)
- Fix wrong parameter order in fileObject helper (#99) (1746daf)
- Fix settings for all types of translatable configurations (2570c5f)
- Fix select field value in settings for codebases with multiple languages (0936899)
- Update and block vue-select to last version (2.5.1). Update style and logic according to changes in vue-select (b3d200d)
- Fixed published scopes hook (3bfbfd0)
- Fix publication timeframe listing column (2eee60e)
- Fix CMS global search on translated titles (a5b05d3)
- Fix for non existing crop settings (ca778f6)
- Fix default locale column length Closes #80 (209e63f)
- Fix logged-in admin user privilege escalation (27cd3f8a)
- Prevent unauthorized users from accessing CMS users listing
- Fix translated file form field creating duplicate attached files after saving twice
- Fix uploader showing duplicate on upload error
- Update to Laravel Mix 4 (#113)
- Address some install and build issues:
- Publish compiled assets on install
- Provide an experimental artisan based build command
php artisan twill:build
- Move npm documentation down as this is not needed to get started anymore, only when creating custom blocks
- Fix npm scripts cp syntax once again, fixing #165
- Update front language components to support large number of languages (#47) (5e6c22a)
- Check database connection before twill:install (#66) (30b25be)
- Improve create super admin command (#68) (8ca8927)
- Added default false value to published column on module's default migration (#93) (21e7317)
- Wysiwyg - Default styling for the superscript (8b0e950)
- Update image styling in browser items list (b3c1103)
- Memoize translations to avoid querying the relationship multiple times when checking for active translations (d0b85be, 90c1b78)
- Languages list in listings – show first 4 only (ad434c7)
- Allow main nav to scroll on overflow-x (432b463)
- Add repeaterName parameter to repository repeater relates functions (#129) (aead7aa)
- Remove unecessary check for empty value before saving text fields into vuex store (e8866e4)
- Improve usability of the full screen content editor on mobile
- Various documentation improvements
It's been an exciting first few months for Twill, and along the way, we've been listening to your feedback. Today, we're excited to release Twill 1.2 with easier setup, improved documentation, and several improvements. We also happily welcomed our first external contribution from @yanhao-li and a lot of research on extensibility from @IllyaMoskvin!
Breaking changes have been kept to a minimum and we've provided configuration variables for backward compatibility.
Reminder: Twill's versioning scheme maintains the following convention: paradigm.major.minor
, exactly like Laravel. Fun fact: this is called Romantic Versioning! When referencing Twill from your application, you should always use a version constraint such as 1.2.*
, since major releases of Twill do include breaking changes.
- Support for Laravel 5.7 (40210129, f3156836)
- Package auto-discovery for Laravel >= 5.5 (1642477)
- Documentation sources (VuePress project running at twill.io/docs)
- Updated documentation sections:
- Architecture concepts
- Local environment requirements and installation
- Configuration
- Revisions and previewing
- Dashboard
- Global search setup
- Settings sections
- Imgix sources setup
- Default CMS global search implementation (edac38ae, b234170)
- My drafts module in dashboard (70d89aa1)
- Option to enable the activity log when dashboard is disabled (3eb4b2a)
- Support for browser field in repeaters (f1f68bc)
- CMS users optional fields (title, description) (a75cb00b)
- Revision restoration (e87a71bd, eb9718ab, 937bbd24)
- Previewing repeaters in blocks (ffde802b, 8d9f656a, a6136cf1, e0f3e70c)
- Cropped thumbnail rendering CORS issue (f9f6896e)
- Prevent undefined formFieldValue in input and wysiwyg fields (5211a447)
- Uploader autoretry (342a79cf)
- CMS users permissions (publishers can't edit other users, admins can create new users) (1dd825c)
- CMS users profile image cropping parameters (b9e22a6a)
- Irrelevant error during Twill setup (94589134)
- Media library console errors on dashboard (e5f959a)
- Installation process and compatibility with existing applications (0ab27de, c6353e7)
- Previews and block editor developer experience (48a7fd8)
- Blocks customization (221a03ed, 145b35b2, a10a3d6f)
- Dashboard activities labels (15e098dc)
- Update npm deps (e1a4117c)
- CRUD module generator output (bd84f41)
- CMS users and their password reset tokens are now stored in
twill_users
andtwill_password_resets
tables by default, with options to provide custom table names inconfig/twill.php
for backward compatibility (twill.users_table
andtwill.password_resets_table
) (c6353e7) - Twill's exception handler is bound to all controllers, with an option to opt-out for extensibility (
twill.bind_exception_handler
) (43f27de) - Change default column in repository's listAll helper function to
title
(fromname
) (024be645) - Configuration enables dashboard, search and buckets features by default (a02c59c). You can disable them in the
enabled
configuration array of yourconfig/twill.php
file.
- Option to the browser field to disable sorting (228babb)
- Option to the select form field to enable search (9f49c11)
- Helper CMS image function that takes the first available attached image (3d573dc)
- Block editor custom validation rule (57cceae)
- Allow passing extra data when rendering blocks (e9a5f4d)
- Save button inside the full screen content editor (615c168)
- Configuration based CMS dashboard (81e8dfa, b1d17b3, 25f9419, 0ced2cd, 6753027, 4b125aa, b6cef76, c7a0bba)
- UI warnings when deleting from the media library, listings, and blocks from the block editor (ff8cd77)
- Select options escaping (7180e63)
- Form error when content revisions have no user anymore (2483120)
- Support older Debugbar version for Laravel <5.5 (2efc9ff)
- Slugs management on non translated models in a translated app (5c30e40)
- Babel transpilation targeted browsers (13b502a)
- Refactored nested listing (9454cdf, 3b86512, 4b4ba95, 2358a1f)
- Refactored cropping logic (79ef4fc, 310fc78)
- Cleanup and linting (ee65800, d0df756, 2d77eb7, 08d94fd, d8636bc, 5813a82, b6111a2, d495b39, 65fc025)
- Show thumbnail if available in buckets and browsers (e751272, 4f0ac41)
- Preview iframe rendering issue on Chrome (b25f457)
- Relationships sync hydration: allow hydrating a custom relationship name (f9aa631)
- Bucket screen can now live under the third level of CMS navigation (9069bb8)
- Renamed from CMS Toolkit to Twill (a30a33e, eea3abc, d395066, 93da8e2, f409597)
- Media field: fix canvas based cropped thumbnail (make sure it is working on Chrome and Firefox, still fallbacking to the original thumbnail on Safari because of lack of support for tainted canvas with CORS)
- Case insensitive search when using Postgres (47a64c1)
- Buckets: custom routes save button URL (1febe6c)
- Media field cropped thumbnail: fix Safari error (missing support for tainted canvas with CORS) (!68)
- Media field cropped thumbnail: prevent CORS errors entirely (!68)
- Cropper component refactor (!68)
- First hint of renaming introducing Twill credit in footer (b84a5f6c)
- Media field : crop is now using smart crop to detect the best crop by default (58141925)
- Media field : refresh the thumbnail of media field on the fly based on the first crop (58141925)
- Drop laravel-mix requirement on host projects (!66)
This is to avoid conflicts with arbitrary npm setups in hosts projects
(like a project running on Webpack 4, which is not compatible with Laravel Mix as of April 2018).
Provided NPM scripts have been modified to use a simple copy command.
This means the CMS build is fully independent from the project build.
It also gives up a slight performance boost in HMR mode when developing.
- Media field cropped information (2f802d8)
- Ability to disable sorting on the "title" listing column (03b65a8)
- Content editor: non draggable list of blocks in Firefox (!65)
- Media Library: switching types quickly is creating wrong listing (!64)
- Media library: bulk tagging (60c6fe9, c6ab250, 51dfd3d, 9be8227)
- Updated flatpicker and cropper deps to more recent versions (!63)
- Support for files input in forms, blocks and repeaters (!61)
- Ability to invalidate specific paths on Cloudfront (!60)
- New block icon (text-2col) (!59)
- Ignore blocks in database if config for type is not available (0a4f528)
- Refactor and hook up files library with the new single media library tab system (!61)
- Ability to configure allowed file extensions for images and files
- Ability to configure the file service (defaults to Disk)
- Ability to add custom types (documentation TODO)
- Merge Cloudfront config with host application's services config (!60)
- Move AWS sdk version and region to services configuration file (!60)
- Improve global error management and session expired UX (dd3390b)
- Fix block icons position (!59)
- Code highlighting module in WYSIWYG form field (
code-block
in toolbarOptions) (!56) - @pushonce(stack:key) and @endpushonce Blade directives to push to a Blade stack, but only once (by suffixing the stack name with an arbitrary unique key) (9830ef0c)
- Support direct S3 upload to non-default (us-east-1) S3 regions (!58)
- Block editor option to render childs in previews (64756f0)
- Frontend build configuration slimming down non-vendor admin assets by around 40% (auto-vendorize imports from node-modules) (!57)
- Refactor external js/css loader into a reusable util (d177d0ec)
- Module generator hasRevisions option (3fcf7f0)
- Misc responsive fixes for small screen (!55):
- Cropper modal update
- Media library : grid is showing 2 images on the same row on mobile
- Dropdown : resize based on available space
- Overlay header : adjust infos showing up on smaller screens
- Listing and search results : dont show thumbnails on smaller screens
- Module repository filter ignoring null scopes (1de874e)
- Eventual duplicate index name from migration helpers (!54)
- Listing filters overflow after opening (18577c1)
- Responsive: navigation, datepickers, modals, notifications, accordeons, dropdowns, filters (!52)
- Login: footer position (!52)
- Datepickers with no time option: fix value update in vuex store (!53)
- Error pages for error 419 and error 429 (page expired and too many requests) (!48)
- Focus states, active states, accessibility (!50)
- Previewer responsiveness (!50)
- Pagination reload (no reload if same page and constraint page number input) (!50)
- Missing brackets to build the index name in related table migration helper (!51)
- Color picker hue selector jumps (!49)
- NPM warning because of missing config in package.json
- Full-screen block editor with left side editing and right side drag and drop-able previews
- Blocks can now be created as regular forms using @formField Blade directives
- Vue.js blocks components generator: php artisan twill:blocks
- Form layout helpers: collapsed fields, columns, inline checkboxes and radios, connected fields
- Listings status filters (published/mine/draft/trash)
- Per CMS user listings options saved in local storage (items per page, displayed columns)
- Bulk editing in listings (publish/feature/delete/restore)
- Display/hide columns in listings
- Support for nested listings (to use in combination with a nested set)
- Support for blocks and revisions features in module stub and generator
- Publication management: add public/private and publication timeframe options
- Ability to create and edit content in a modal when a full form page is not necessary
- Custom email template
- Color picker form field
- Bulk delete and multiple selection with shift in media library
- Replace image in media form field
- Context based image alternative text and caption
- Restore soft deleted models
- Suggested frontend controller for show and preview routes with its associated router macro (Route::moduleShowWithPreview)
- Allow custom buckets routes prefixes, default to "featured" prefix
- Support starred items in buckets
- Preview in selected language
- Preview model hydration support for multi-select, browsers and repeaters
- More image helpers
- Provide a way to transform index items collection
- Provide a hook to add custom data per index item
- Allows querying module's model through its repository
- Contributions guidelines
- Simplified form views
- Unified form fields options
- Inline form fields validation messages
- Blocks are now their own Eloquent model and a polymorphic relationship instead of being a dead json column in each module
- Media in the media library can't be deleted in they are attached to a module or block
- Use consistant syntax for config keys
- Use database transactions in module repository operations
- Support slugs with non latin languages
- Slugs management when restoring a soft deleted model
- UI responsiveness
- Documentation
- Redesign of every single part of the admin ui
- Admin frontend assets sources are now part of this repository (in frontend/) and consists of multiple Vue.js apps compiled using Laravel Mix
- Laravel and Vue communicates using Vuex store hydration at page load and ajax requests
- Admin assets need to be compiled by the project using this library in order to include its own blocks
- Block editor changed from SirTrevor to custom Vue.js components
- WYSIWYG editor changed from Medium Editor JS to Quill.js
- Modules don't need an index Blade view anymore, all listings options are defined in the controller
- Repeaters for inline one-to-many relationships are now created as blocks
- Settings feature (831c3de, d2f76dd)
- Add a ratio selector on image fields (64edd52)
- Add optional open live site link to global nav (4ede5a2)
- Add a preview/open action to listings (a9a2821)
- Allow disabling delete in module listing (df7cf5b)
- Add a copy preview link to clipboard feature (dirty js, will clean up during redesign) (f50c03a)
- Add a way to prevent publication in listing by checking a canPublish property on the model item (347cc6a)
- Add new setting to block editor config: iframe width (defaults to 66) (5dc0461)
- Add a new links only config for medium editor fields in blocks (2eb64b5)
- Allow hints in blocks input fields (21b677f)
- Add placeholder in block text fields for simple repeater blocks based on numbers (e5042fd)
- Add a button to preview module landing with drafts (2957584)
- Add a scopes parameters to apply where conditions on forSlug helper (d6d10bb)
- Add 403 error page (9aa40d5)
- Log block errors (f9d8778)
- Prevent initializing already initialiazed medium editor in blocks (1742a17)
- Fix module show and preview routes (extra /) (b01c1f6)
- Fix preview links (0618bc6)
- Make sure module previews are only accessible to read only users, not disabled ones. (d92d07b)
- Fix slug input (3b25ef0)
- Allow custom publish field name in forms (043107c)
- Improve uploader drop-zone style to align with images grid (cfd32a9)
- Wording on image attachment button: use add everywhere for consistency with blocks (e6d6918)
- Hide filters dropdowns while loading select2 styles (f2eeabe)
- Hide block editor ugly json showing in textarea before Sir Trevor loads (df2193e, adf651d)
- Improve block editor UX (show title while loading, stay on edit view if validation errors) (98b8af0)
- Change cms user publish status wording (d8177be)
- Allow raw html string as index column (useful for classic model accessor instead of presenter usage) (2c057af)
- Soft delete slugs on delete and allow reusing deleted ones (b48b563)
- Do not force plain text pasting in block editor medium fields (a01e42f)
- Allow empty or "/" module preview route prefix for catch-all route (1dda40d)
- Wording on attachment: replace detach by remove (769d18d)
- Update CMS builds from UI Toolkit (c61fd17)
- Update composer.lock (6a567c9)
- Open preview in a new tab (f48fa99)
- Revisions and links wording (4bd3e29)
- Implement revisions with preview and side by side comparison (55ebdae, e35e824, 805e6b2, c51c99c, 04d1910, 303875d, e3fb70c, 28daed4, 21dd9dd, b18276c, a31b889)
- Add feature permission for publishers and admins (84e2ae0)
- Allow custom logo partial for the CMS header (435e65e)
- Add a way to add a message on top of CRUD listings (4afefe0, c9ad242)
- Add a variable to disable secondary navigation in views (a5ee316)
- Add options to the checkbox form field to enable connected actions (5dbf3c1)
- Add a way to disable feature using a canFeature attribute in models. Defaults to true. (a63aeb1)
- Add setters to the SEO object to keep defaults if passed is empty (79f9747)
- Easy way to add links in browser fields (c0d66b3, 33540d3)
- Allow raw url in CMS navigation (6e6ac31)
- Add an option to prevent related content deletion (b3016ab)
- Add an option to show the CMS users links in the top right navbar (febd212)
- Add a repository method to find first or create (0799840)
- Add a new default config with anchor for the medium editor form field (0eea90b)
- Add a scope to order with a raw string on translations (6281f1d)
- Add a scope to order by a translated field (694d8c9)
- Let's share a published scope in the parent model (c5e83e5)
- Add a way to delete existing belongsToMany repeater elements (when not used along with a multiselect) (422a924)
- Add an option to show templates on the frontend domain and protect templates from unauthenticated eyes in production (1bf3fc7)
- Add a simple way to reuse the default blocks with custom views (36ea67f)
- Add blocks css to block editor configuration (0aa829f)
- Add a new default quote block with rich editing capabilities (4f3ecad)
- Fix has slug behavior when using translations with a single locale (d574b33)
- Add global css fixes to the block editor form field (4f50df9)
- Force translations index name to be shorter (76bd481)
- Fix admin host lookup in exception handler and allow view override (b49c081)
- Fix characters limits display (missing space) (642129a)
- Don't show delete column header in browsers module if delete is not allowed (5fd4830)
- Fix fields in repeater (TODO: test on other projects) (c0277a7)
- Quickly fix the Laravel 5.4.22 security fix to accomodate for our convention of not specifying the scheme in APP_URL (d541983)
- Security update: force admin url on password reset routes. (271b4bb)
- Don't load blocks css if config say we use iframes (5ce6f1a)
- Fix medium editor link only button (ce368a7)
- Fix debug config (2728b7e)
- Improve hints display on medium textarea fields (e619967)
- Improve search and filters in browser (7380e6c)
- Retain params on listing pagination (bb41603)
- Allow custom frontend view path for errors views (e8f3822)
- CMS listing titles first letter uppercase (0f2893b)
- Fields hints improvements (238f65f)
- Browser field improvements (1be5a0d)
- Support custom button title prefix on repeaters (3debd56)
- Prevent errors and provide more ways to grab images dimensions in the Imgix service (5d9e0ca)
- Disable scrollbars on the modal frame (24e325e)
- Hide scrollbars in blocks previews (a35c919)
- Use a tinier button for repeaters (2715efb)
- Cleanup (c2875df, 6a118c2)
- Cleanup module controllers by adding default empty arrays for index and form datas (09d31eb)
- Open live site in new tab (c8543b1)
- Switch extra_css and extra_js to Blade stacks (4741806)
- Prepended scope better be prepended (83f45c6)
- Disable CMS users image by default (143f41b)
- Make parent model abstract (eed6d21)
- Remove default button block (had no renderer) (fd7b537)
- Force capitalize model first letter in getModelRepository internal helper (f7901ac)
- Don't search for tags in search, we have a filter for it (efc05ad)
- Repository searchIn helper now bundle or where queries together to avoid conflicts with other scopes (df0973b)
- Update style of the iframe for previewing the block editor (180c69d)
- Allow calling module controller form method from child controllers (ba95fba)
- Small wording updates (ed03107)
- Use the new date picker (a15830b)
- Update base blocks and text field builder (cf8fc7b)
- Implement block editor previews using iframe to prevent styles conflicts (5303259)
- Add automatic buckets from configuration (ece23a9, 72b7c6c, 98118cd, 32b011f)
- Add getItemBySlug helper function to retrieve a resource from a repository (a663cd4)
- Add required label to media and file form field (737585c)
- Add belongs_to param to the browser form field to enable single selection on browser fields (b59e129)
- Add an option to ignore fields when saving, to enable partial forms for a module (51917ac)
- Add an imageObjects method to the HasMedias trait to retrieve a collection of Image associated (06a6899)
- Allow https on S3 library (81982b3, 2b6b2de)
- Fix the URL of the back link when a validation error occurred (9f6d568)
- Fix browser module view resolution when using a custom module name (882bd8b)
- Force mediables ordering by id for medias form field with multiple images (8d0a3b7)
- Turn flash message into a js notification (e2ecb13 )
- Media form field failover in case of media params changes (new crop name for example) (8a074cd)
- Move Imgix specific params to Imgix image service implementation (b4c1aed )
- Functional block editor with default blocks (b53da8fe, 6bae67a, 1ad7cfc, 24f144ad, e884f14c, d838d04, 3714396e)
- Repeater form field (105c3f22a)
- Toggle columns in module listings (6f29f20)
- Tagging support for all models (e001d5e)
- Toolkit module views resolution (7afcf044)
- Browser insert partial (fea42b7, 84db3a6b, e7c220f)
- Translations and slugs migration helpers (786fb06)
- Password reset routes and welcome email sending policy (f04abe21)
- Slugs params for single locale setup and custom model accessor (ecfba9924, 9788a23a)
- Paginator (custom view based since L5.3) (3d8ec24)
- Laravel 5.4 support (2c5634cb, 4a129364)
- Date picker, allow custom options (f18bbf18)
- Resource browser: Add an option to allow a module name independent from the relationship (26368c7)
- Resource browser: Add option to pass parameters to browser from the view calling the browser (af3e06ab)
- Filters style on index view (now uses custom select style) (948df42, adcbd628, d4af4b89)
- Install/setup/module commands (dd19da3, f2ec13dc, acc2a662, b38a5f07)
- Documentation (using @joyce's feedback, thanks a lot!) (ac41d07ec)
- Differentiate Medium editor and rich text area (3125e5e)
- Form lang switcher is now included and hidden by default (892a1da9b)
- Added an ACL param to the uploader (2298ff40)
- Update assets command now call vendor:publish on the CMS Toolkit (f75eb38)
- Laravel 5.4 support (a3f7ca3, 44ccf77, a7121e2, 59301db)
- Frontend assets configuration (5bc0dfc, 281a394, 423a524, cd30daa, f1280b2, ff6f280)
- Browser for related content (bc0fba0, 595f146, e1811a3, 3dd25be)
- Nested modules (3835a75, 798118a, 9bbb77e, df06492, 48a8949, ad39dd6, c1f059f, 4fb42ab, e0bf2f6)
- Hidden form field (0d9d44b)
- Fix uploads on environments where config cache is enabled (178f65f)
- Prevent browser back button to get back to an authenticated page after logout (0cf4248)
- Fix date_picker fieldname (d877fa9)
- Fix checkbox partial name (40e1bca)
- Lists is deprecated (e7efee1)
- Fix resourceView blade directive (3babbcc)
- Fix non translated slugs
- Documentation (43e8cdb)
- Config merging (be425df)
- Pluralization (4e6caf5, 3d66250)
- Remove the need to set perPage for Sortable modules (3abf48a)
- Syntaxic sugar to add like where clause in controllers filters (c032539)
- Checkbox form partial (d8e98f3)
- Documentation (d4ef4e3, 2d289bf, 067d036, a732c4d, 21b5dfe, fa1d26a, 632ebb0, f981056, b2f38b4, a5466d2, 888897d)
- Installation (14b4507, b2dcbae, f35a730, 37232d3, ca26e7b, 366c9a2, 6b41db2, 6d65801, 96dc178, 59aef13, 4f113f8, 67d64e2, 9c89233, 6b5ed46, 576dc16, ebbeb9e, 25b5d27, f313f07)
- Module generator (7870d02, 868bb26, 380e214)
- User management (a43edfd, 315e95b, 8932206, 7abf5ef)
- Module views (7ea66d6, f866e19, e03aab6, 4841087)
- Rename Sorts traits to HasPosition for consistency (c09c531)
- Initial release