Skip to content

Latest commit

 

History

History
1540 lines (1168 loc) · 139 KB

CHANGELOG.md

File metadata and controls

1540 lines (1168 loc) · 139 KB

Changelog

All notable changes to twill will be documented in this file.

UNRELEASED

Added

  • Artisan command twill:make:singleton to generate single-record modules #1178
  • Option --hasNesting to generate self-nested modules #1140 #1222
  • TwicPics image service #1217
  • Turkish language support #1134
  • Support for translated permalinks in the title editor #1092
  • Support for capsule service providers #1212

Fixed

  • 🚨 Fix CSRF vulnerability in logout method #1240 29041f07
  • Support attribute casting on model and translations with JSON field groups #1151
  • Support dynamic repeater titles with JSON repeaters #1171
  • Fix admin HTTP exception views detection #1213
  • Prevent conflicts with built-in Vue component names #1164
  • Add fallback to capsule model in permalink base #1216
  • Add doctrine/dbal 3.0 support #1226
  • Ensure capsule autoloading when config is cached #1242
  • Fix edit link feature regression in Quill WYSIWYG #1270
  • Remove references to deprecated Symfony class #1269
  • Prevent undefined route errors in IconsController #1268

Improved

  • Update routes mapping order to allow overrides #1133
  • Handle many-to-many relations in index columns #1174
  • Add capsule_repository_prefix configuration #1209
  • Support custom port in dev_mode_url configuration #1163
  • Support additional table actions in module listing #1202
  • Show red input count only if above 90% capacity #1237
  • Update nested module count pluralisation #1251
  • Update german translations #1235
  • Update docblock annotations #1167
  • Update documentation #1165 #1244 #1236

Chores

  • Update npm dependencies in documentation 377e5e0

2.5.2 (2021-09-16)

Fixed

  • 🚨 Fix XSS security vulnerability #1157 2dd77b15
  • Hydrate related browsers on preview #1130
  • Use configured namespace when generating model class in repository 80e1b590
  • Translation key typo on the dashboard c630d0d1

Improved

  • Call view:clear when updating assets with twill:update c5b96010
  • Add security policy file 55b2dfd63

2.5.1 (2021-09-02)

Fixed

  • Twill custom error views and ability to extend its exceptions handler 312b44c16d2e

2.5.0 (2021-09-01)

Added

  • Block editor updates
    • Ability to use multiple block_editor fields #918
    • Dynamic block/repeater titles #1096
    • Update content editor sidebar layout and add new icons #1072
    • Update default button variant for inner repeaters #1073
  • Form fields updates
  • Capsules updates
    • Autoloading system for Capsules cec70d03
    • Translations files for Capsules 8f06ea53
  • General updates
    • SVG support with Glide #985
    • Configurable admin routes prefix 5e5b5a81
    • Allow configuring password broker and enable throttle b421561a
    • Ukrainian language c2c08603
    • Watch for custom blocks & components in development #1107
    • Allow setting dev_assets_path from .env 814ade6b

Fixed

  • Prevent submitting a form before saving an input into the store #1030
  • Prevent multiple submit events in add/create modals 3dfb0c8f cb38ba53 40248552
  • Fix incorrect position of link edit options in wysiwyg editor when height limit is set f8276462
  • Ensure pasting content in quill do not make editor scroll to the top 07f7aa0051302a15
  • Safari form submit issue in Filter component 29a1f227 91390ac2
  • Support revisions preview and restore with belongsTo browsers #984 #1085
  • Toggle media library unused checkbox on clear only if active d73ff3eb
  • Order files by fileable id d7df01bf
  • Register capsules routes before Twill internal routes c1acb981
  • Issues when extending Twill's exceptions handler itca7a650e
  • Support multi-country locales on Translatable c5b341d4 5d9c9953
  • Fix Exception Handler broken for Laravel 8 569ce2e6 ce58aae5 76890ffa

Improved

Chores

2.4.0 (2021-06-15)

Added

  • Add support for browsers using HasRelated behavior 580faa47
  • Allow dev_mode to be set in .env 95874a1a
  • Add custom subject to notifications f137b213

Fixed

Improved

2.3.1 (2021-06-05)

Fixed

  • Media library upload regressions (hotfix) #959

2.3.0 (2021-06-03)

Added

  • 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 #922 0a153c29 7dbfaef6
  • Support for custom title key in related browsers #942

Fixed

  • 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

Improved

  • 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

Chores

  • Update rebase GitHub Actions version to support forks with branches of the same name e08ee215

2.2.1 (2021-05-18)

Fixed

  • Capsules without translations: move HasCapsules trait to the base model 8b730e81
  • Laravel configuration caching: set the capsules list config as an array 2b5b07a5

Improved

  • Update documentation to reflect Laravel 8 support c01c426d
  • Fix wording and add proper method description e1293551

2.2.0 (2021-05-14)

Added

  • 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

Fixed

  • 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

Improved

  • Documentation
    • Updated block editor documentation 9df76dd4
    • Documentation for custom vue component da6557f2
    • Documentation with some examples for the MultiBrowser feature 66c12808 36cb3f48
    • Added some missing optional $cropName and $media params for various image methods #762 8188f864
  • 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
    • Add czech translations 71c976dd
    • Add Turkish localization support for flatpickr and vue-timeago packages d725a7d4
    • fixed a typo in the German language 29eb3a9c
    • Make parts of settings & dashboard translatable 843c1da2
    • Russian language update f87d99f2
    • Add some missing Polish language strings 30fe3593
  • 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

Chores

  • 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
  • Community updates
    • Add Contributor Covenant c16572d7
    • Add GitHub templates (issues and PRs) 864d7cf4
  • Security
    • Fix npm dependencies vulnerabilities
    • Fix npm dependencies vulnerabilities in docs

2.1.1 (2020-07-20)

Fixed

  • Fix block editor group parameter update 121b0166
    • Both group and groups can be used and receive a string or an array
  • 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

2.1.0 (2020-07-15)

Added

  • 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 the views/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 to app)
      • 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 block
        • php 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 available
        • php artisan twill:make:module, equivalent to the now deprecated twill:module which will be removed in Twill 3.0.
  • 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.
  • 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

Fixed

  • 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

Improved

Chore

2.0.1 (2020-03-10)

Fixed

  • Fix fields not rendering after switching locales (#572) 4ea1943b
  • Fix duplicate action on Laravel 7 a30922b1

Improved

Chore

2.0.0 (2020-03-06)

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.

Changed

Semantic versioning

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 as 2.0.0, even if it is not a paradigm shift at all.

Laravel versions support

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.

#389/#456/#561

Blocks and frontend build workflow

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 the twill.block_editor.custom_vue_blocks_resource_path new configurable path (with defaults to assets/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 your config/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 to twill-manifest.json
  • public_directory, which defaults to assets/admin, like in previous versions, and can now be controlled through the TWILL_ASSETS_DIR environment variable
  • dev_mode, which defaults to false
  • dev_mode_url, which defaults to http://localhost:8080 and can be controlled through the TWILL_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

Database migrations loading strategy

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

Database migrations changes

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.

b3fd5819

Translation models

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

Added

Smarter CLI

cli

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.

c73154f2/a9de8155

Automated testing

enter image description here

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/#53394362dc5/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

OAuth login

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

JSON fields groups

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

Azure uploads

A new endpoint_type to support Azure storage of all uploads, exactly like when working with S3.

#424/2129c084/#443/d81a5b94/b7a89f38/4bf2e133

Free layout

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

Automated browsers and repeaters

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

Destroy records in the trash

It is finally possible to destroy and bulk destroy records in the trash!

1b0f0070/578da43d/a8addc71

Duplicate records

Records can now be duplicated from the listing page.

bb706c26/a4e2d870/068b6f2c/8e39f165/a32100e9/bcce64fd

i18n

i18n

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

Subdomain routing

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.

a4bdf225/5f2d642b/ffdbe75a

Tiptap WYSIWYG

tiptap 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

And more...

  • 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 Buckets3a83a069/c4c22bee
  • Add new icons c762ea21
  • #397 Support Glide Presets 6afbbf5b
  • #521 Added support for nested repeaters in block 0470afda
  • #526 Implement updateRepeater() for morphMany relations 26a0d2de
  • #528 Added an extra prop to repeater field to override the name 0ce0c4cc
  • #551 Display and apply default filters in listings 77eb7f23
  • #562 Add new fieldNote option to browser, medias and files fields aa7a1c5d

Fixed

  • #371 Fix maps implementation when printing values from an array. e6a6ac2d
  • #380 Bug fix with undefined route name when blocks-editor is disabled eaacdbcc
  • #381 Add check on translatable input store to prevent duplicate field objects 2544d059
  • #385 Fix create superadmin user Artisan command 2425ea37
  • #390 Fix ignoring current email in UserRequest 9a6a1c10
  • #395 Fixed TTY issue for twill build command #236 90141c36
  • #402 When hydrating an old revision, include the ID so relationship methods don't fail 62914c81
  • #418 Fix join() syntax 57fbdaf1
  • #421 Display error when the blocks dir is not found fed7b92f
  • #423 Fix missing /js/blocks dir on twill:blocks command 47440423
  • #425 Fix published being sent as string on json 1cafa780
  • #427 Fix google2fa settings not being enabled 702e31a3
  • #429 Fix some deprecated helpers 2f1e3489
  • #431 fixed an http & https issue from APP URL abb1509f
  • #446 Fixed 'delete' => true not working in indexOptions, refs #289 81a32414
  • #449 Fix « Handle Repeater » feature compatibility with Laravel 5.6 7b0a275f
  • #459 Wysiwyg - Counter limit (fix counter limit in Textfield) 01151e54
  • #460 Wysiwyg - Make sure quill is ready when checking content length 392f29c0
  • #461 Forms with no Content fieldset : fix sticky publisher module and fix sticky nav sections 9a87a2b7
  • #469 Check the index exists before trying to save browsers in blocks d1c99948
  • #475 Fix the admin url of an element in the browser listing 44ad2182
  • #481 Fix typo in docs for nested module 764d9fc2
  • #484 Fix join() syntax in MediaLibrary/Glide.php 40288a9f
  • #485 Fix/destroy sub module ce5d88a0
  • #506 add required namespaces for Arr and Str in views and blade macros ff811087
  • #509 Fix inconsistent use of integer and bigInteger on MariaDB 10.3 c36252de
  • #523 Fixed a bug causing select field not accepting default to be false d1ca7681
  • #536 Exception handler should return json response on ajax call dec4714a
  • #539 Fix getSlug() function when locale fallback is activated c48ca396
  • 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

Improved

  • #386 Refactor calling trait methods from repository 7e45019e
  • #387 Refactor getLanguageLabelFromLocaleCode to use php intl's "Locale::getDisplayLanguage" e85ff145
  • #396 Added Logo and Badges to README 3bb38272
  • #398 Responsive filters b95820f4
  • #404 Change the way of maintaining Twill version number d4ba16a3
  • #430 Move logic to model e1ac4abf
  • #442 Implement a Sortable function closer to the one offered by Translatable. e46b2318
  • #445 Replace bcrypt() with Hash::make in CreateSuperAdmin command 00711ede
  • #450 Add style for subscript into wysiwyg 8e00ed1e
  • #500 Extend slug character support fe888ffe
  • #534 Slug characters extended 42071f08
  • #537 Refactored HandleRepeaters trait 136e7123
  • #538 Refactored HandleBrowsers trait 61a1e810
  • 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

Chore

1.2.2 (2019-08-21)

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.

Added

  • 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)

Fixed

  • 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)

Improved

  • 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 an articles 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)

Chore

  • Update composer dependencies (e1dfc11e)
  • Update npm dependencies (06184c0b)
  • Update docs to VuePress 1.0 (72217206)

1.2.1 2019-03-15

Added

  • 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)

Fixed

  • 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

Improved

  • 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

1.2.0 2018-09-24

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.

Added

  • 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)

Fixed

  • 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)

Improved

  • 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)

Changed

  • CMS users and their password reset tokens are now stored in twill_users and twill_password_resets tables by default, with options to provide custom table names in config/twill.php for backward compatibility (twill.users_table and twill.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 (from name) (024be645)
  • Configuration enables dashboard, search and buckets features by default (a02c59c). You can disable them in the enabled configuration array of your config/twill.php file.

1.1.0 2018-07-05

Added

  • 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)

Fixed

  • 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)

Improved

  • 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)

Changed

  • Renamed from CMS Toolkit to Twill (a30a33e, eea3abc, d395066, 93da8e2, f409597)

1.0.13 2018-04-20

Fixed

  • 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)

1.0.12 2018-04-19

Improved

  • Case insensitive search when using Postgres (47a64c1)

Fixed

  • Buckets: custom routes save button URL (1febe6c)

1.0.11 2018-04-17

Fixed

  • Media field cropped thumbnail: fix Safari error (missing support for tainted canvas with CORS) (!68)

Improved

  • Media field cropped thumbnail: prevent CORS errors entirely (!68)
  • Cropper component refactor (!68)

Changed

  • First hint of renaming introducing Twill credit in footer (b84a5f6c)

1.0.10 2018-04-12

Improved

  • 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)

1.0.9 2018-04-10

Improved

  • 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)

1.0.8 2018-04-05

Added

  • Ability to disable sorting on the "title" listing column (03b65a8)

Fixed

  • 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)

Changed

  • Updated flatpicker and cropper deps to more recent versions (!63)

1.0.7 2018-04-03

Added

  • Support for files input in forms, blocks and repeaters (!61)
  • Ability to invalidate specific paths on Cloudfront (!60)
  • New block icon (text-2col) (!59)

Fixed

  • Ignore blocks in database if config for type is not available (0a4f528)

Improved

  • 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)

1.0.6 2018-03-28

Added

  • 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)

Fixed

  • Support direct S3 upload to non-default (us-east-1) S3 regions (!58)
  • Block editor option to render childs in previews (64756f0)

Improved

  • 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)

1.0.5 2018-03-22

Fixed

  • Module generator hasRevisions option (3fcf7f0)

Improved

  • 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

1.0.4 2018-03-21

Fixed

  • Module repository filter ignoring null scopes (1de874e)

1.0.3 2018-03-21

Fixed

  • Eventual duplicate index name from migration helpers (!54)
  • Listing filters overflow after opening (18577c1)

1.0.2 - 2018-03-21

Improved

  • Responsive: navigation, datepickers, modals, notifications, accordeons, dropdowns, filters (!52)
  • Login: footer position (!52)

Fixed

  • Datepickers with no time option: fix value update in vuex store (!53)

1.0.1 - 2018-03-20

Added

  • Error pages for error 419 and error 429 (page expired and too many requests) (!48)

Improved

  • Focus states, active states, accessibility (!50)
  • Previewer responsiveness (!50)
  • Pagination reload (no reload if same page and constraint page number input) (!50)

Fixed

  • 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

1.0.0 - 2018-03-19

Added

  • 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

Improved

  • 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

Changed

  • 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

0.7 - 2017-10-03

Added

  • 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)

Fixed

  • 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)

Improved

  • 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)

Changed

  • 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)

0.6 - 2017-10-03

Added

  • 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)

Fixed

  • 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)

Improved

  • 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)

Changed

  • 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)

0.5 - 2017-10-02

Added

  • 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)

Fixed

  • 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)

Improved

  • Turn flash message into a js notification (e2ecb13 )
  • Media form field failover in case of media params changes (new crop name for example) (8a074cd)

Changed

  • Move Imgix specific params to Imgix image service implementation (b4c1aed )

0.4 - 2017-03-01

Added

  • 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)

Fixed

  • 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)

Improved

  • 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)

Changed

  • 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)

0.3 - 2017-02-03

Added

  • 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)

Fixed

  • 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

Improved

  • Documentation (43e8cdb)
  • Config merging (be425df)
  • Pluralization (4e6caf5, 3d66250)

Changed

  • Remove the need to set perPage for Sortable modules (3abf48a)

0.2 - 2017-01-11

Added

  • Syntaxic sugar to add like where clause in controllers filters (c032539)
  • Checkbox form partial (d8e98f3)

Improved

  • 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)

Changed

  • Rename Sorts traits to HasPosition for consistency (c09c531)

0.1 - 2016-12-16

  • Initial release