Skip to content
Permalink
main
Switch branches/tags
Go to file
@brandonkelly
Latest commit 4bff254 Jan 18, 2022 History
9 contributors

Users who have contributed to this file

7190 lines (6142 sloc) 610 KB

Release Notes for Craft CMS 3.x

3.7.29 - 2022-01-18

Added

  • resave/* commands now support bulk-setting an attribute/custom field value via new --set, --to, and --if-empty options. (#10356)
  • Added craft\fieldlayoutelements\BaseField::statusId().
  • Added craft\helpers\App::parseEnv() and parseBooleanEnv(), replacing their Craft class counterparts. (#10319)

Changed

  • The Users index page now updates the URL based on the selected source. (#10336)
  • Live Preview no longer reloads the iframe when the device type is changed. (#10353)
  • admins, all, and new are now reserved user group handles.
  • The content in the resourcepaths table is now excluded from database backups by default.
  • User caches are now invalidated after login attempts. (#10313)
  • Assets fields’ “Upload files” buttons now have aria-describedby attributes when appropriate.
  • Color fields’ hex inputs now have aria-label attributes.
  • Field status messages are now included in their aria-describedby attributes.
  • User queries will no longer exclude suspended users when status('pending') is passed. (#10361)
  • Template autosuggest fields now include suggestions for templates in custom site template roots. (#10372)

Deprecated

  • Deprecated Craft::parseEnv(). craft\helpers\App::parseEnv() should be used instead.
  • Deprecated Craft::parseBooleanEnv(). craft\helpers\App::parseBooleanEnv() should be used instead.

Fixed

  • Fixed a bug where admin tables were displaying titles incorrectly.
  • Fixed a bug where aria-describedby attributes were getting namespaced incorrectly when they referenced multiple IDs.
  • Fixed a bug where “View” links on Edit Entry pages weren’t getting updated when the entry’s preview target URLs changed. (#10257)
  • Fixed a bug where craft\base\ApplicationTrait::getIsMultiSite() would return false on the front end, if there was only one enabled site, but additional disabled sites.
  • Fixed a bug where craft\base\Element::getSite() would throw an exception on the front end, if the element belonged to a disabled site.
  • Fixed a bug where craft\services\Sites::getEditableSiteIds() would exclude disabled sites on the front end.
  • Fixed a bug where validation errors referenced by aria-describedby attributes weren’t getting read out by VoiceOver. (#10355)
  • Fixed a bug where element queries’ withQueries properties were ignored. (#10359)
  • Fixed a bug where fatal PHP errors were not logged to stderr when the CRAFT_STREAM_LOG PHP constant was set to true. (#10366)
  • Fixed a bug where Dropdown fields with invalid data would not always display a blank option. (#10365)

Security

  • Fixed an XSS vulnerability.

3.7.28 - 2022-01-05

Changed

  • Updated Yii to 2.0.44.

Fixed

  • Fixed a Composer error that could occur if composer.craftcms.com was missing an expected package/version, but Packagist knew about it. (#10311)
  • Fixed a PHP error that could occur when querying for Matrix blocks. (#10315)
  • Fixed a bug where Single sections’ drafts would get deleted when their section settings were updated. (#10307)
  • Fixed an error that could occur on the Dashboard if there were any Quick Post widgets that included a Title field. (#10314)

3.7.27.2 - 2022-01-06

Fixed

  • Fixed an error that could occur when updating to Craft 3.7.28/Yii 2.0.44 from the control panel.

3.7.27.1 - 2022-01-04

Fixed

  • Fixed a PHP error that would occur when creating a new user. (#10308)

3.7.27 - 2022-01-04

Added

  • Added the setSchemaOnConnect database connection setting. (#10273)
  • Added craft\errors\InvalidHtmlTagException.
  • Added craft\helpers\Html::encodeInvalidTags().
  • Added craft\models\FieldLayout::getCustomFieldElements().
  • Added craft\services\Fields::getLayoutsByIds().
  • Added craft\web\twig\variables\Image::getContents(), getDataUrl(), getMimeType(), and getPath(). (#10268)

Changed

  • Improved the performance of the control panel, for installs with a large number of entry types.
  • A warning is now logged when a password-reset email could not be sent, if preventUserEnumeration is enabled.
  • The install/check, install/craft, and setup/db-creds commands now explicitly check if Craft is installed in the default schema on Postgres.
  • The setup/db-creds command now uses existing environment variable values for its default prompt values, if available.
  • The setup/db-creds command no longer prompts for the database schema on Postgres, unless setSchemaOnConnect is enabled. Instead it will determine the appropriate schema to use based on SHOW search_path. (#10273)
  • The web-based installation wizard no longer shows a field for the database schema on Postgres. (#10273)
  • Dashboard widgets’ data-colspan attributes are now updated when their colspan changes. (#10286)
  • craft\base\ApplicationTrait::getIsInstalled() will now explicitly check if Craft is installed in the default schema on Postgres, when true is passed.
  • craft\helpers\Html::parseTag() now throws an InvalidHtmlTagException exception when an invalid tag is encountered. (Catching InvalidArgumentExceptions will still work.)
  • craft\services\Routes::getProjectConfigRoutes() now returns a numerically-indexed array of URL rule arrays, with pattern keys that define the URI patterns.
  • craft\services\Users::getUserPreferences() and getUserPreference() no longer accept null passed to the first argument.

Deprecated

  • Deprecated craft\elements\User::mergePreferences().

Fixed

  • Fixed a bug where the details pane could jump down when scrolling on desktop browsers that are less than 974 pixels wide.
  • Fixed a bug where soft-deleted Matrix blocks nested within Neo blocks could become duplicated when restored from a prior revision. (#10256)
  • Fixed a bug where Color fields’ HSL values could be incorrect. (#10261)
  • Fixed a bug where <video>, <embed>, and <iframe> tags within field instructions could be wider than the field’s container. (#10264)
  • Fixed an error that occurred if the first control panel-defined route had a numeric URI pattern. (#10251)
  • Fixed an error that could occur if a section didn’t have any entry types. (#10272)
  • Fixed a bug where craft\services\Config::setDotEnvVar() wasn’t escaping backslashes when modifying the value of an existing environment variable. (#10274)
  • Fixed a bug where Live Preview could fail to load if opened while changes were being autosaved. (#10280)
  • Fixed a bug where the control panel layout could break if any field instructions/tips/warnings included an HTML tag that wasn’t closed properly. Such tags are now encoded so they appear as plain text. (#10290)
  • Fixed a bug where disabled plugins could cause duplicate database queries.
  • Fixed a bug where multiple calls to craft\services\Users::getUserPreferences() could cause duplicate database queries.

Security

  • Fixed a bug where it was possible to identify valid usernames/user emails via password-reset forms when preventUserEnumeration was enabled. (#6000)

3.7.26 - 2021-12-15

Added

  • Added avif as a web-safe image format. (#10222)
  • Added avif to the allowed asset file extensions.
  • Added craft\fields\data\ColorData::getHsl(), getH(), getHue(), getL(), getLightness(), getS(), and getSaturation(). (#10235)
  • Added craft\services\Images::getSupportsAvif().

Changed

  • Reverted a 3.7.24 change where URL fields started encoding query string params. (#10193)
  • User verification and password-reset URLs for users with control panel access are no longer based on the front-end URL, when generated within the control panel. (#10224)
  • Element queries’ status arguments can now begin with not to return all elements except those with a given status or statuses. (#9541)
  • The previewTokenDuration config setting now defaults to the same value as defaultTokenDuration. (#2394)
  • Craft no longer requires the Portable UTF-8 library directly. (#10252)

Fixed

  • Fixed a bug where Neo blocks could lose their content if Preparse resaved a provisional draft as it was being created.
  • Fixed a bug where craft\services\Fields::getLayoutByType() could return an outdated field layout, if it had been updated in the same request. (#10237)
  • Fixed a SQL error that could occur when querying for users via GraphQL.
  • Fixed an error that could occur when loading elements, if any custom fields were selected in the query before the element’s field layout ID. (#10205)
  • Fixed an error that could occur when searching for elements in the control panel. (#10238)
  • Fixed a bug where craft\db\ActiveRecord was JSON-encoding database expression objects. (#10239)
  • Fixed a bug where entry editor slideouts weren’t warning of losing unsaved changes after the entry type was changed. (#10243)
  • Fixed a bug where Matrix fields weren’t getting reverted properly when reverting an entry’s content to a prior revision, if they were nested within a Neo or Super Table field. (#10253)

3.7.25.1 - 2021-12-07

Added

  • Added craft\helpers\ElementHelper::rootSource().

Fixed

  • Fixed an error that could occur on element indexes.
  • Fixed a bug where it wasn’t possible to sort nested element sources by custom fields. (#10226)

3.7.25 - 2021-12-07

Changed

  • Improved the accessibility of the “Default Asset Location” and “Asset Location” Assets field settings.
  • Element indexes now keep track of recent sort selections and factor them into the new element order. (#10203)
  • The “View” button and “View” menu options on Edit Entry pages now use <a> tags. (#10220)
  • A describedBy variable is now available for input blocks rendered when embedding the _includes/forms/field control panel template.
  • craft\services\Tokens::createToken() and createPreviewToken() now have $token arguments, which accept pre-generated tokens.

Fixed

  • Fixed an error that could occur if the field() macro in the _includes/forms control panel template was called withoun an input argument. (#10208)
  • Fixed a bug where the migrate/fresh command was erasing all migration history and attempting to reapply migrations. (#10209)
  • Fixed a JavaScript error that occurred when pressing Return on an autosuggest input when no option was selected.
  • Fixed a bug where Edit Category pages could have two sets of “Preview” and “View” buttons. (#10215)
  • Fixed a bug where boolean menus weren’t showing the “No” option as selected when the value was false.

3.7.24 - 2021-12-02

Added

  • Added the parseBooleanEnv() Twig function.
  • Added craft\base\FieldTrait::$describedBy, which custom fields should reference when setting their input’s aria-describedby attribute. (#10183)
  • Added craft\behaviors\EnvAttributeParserBehavior::getUnparsedAttribute().
  • Added craft\fieldlayoutelements\BaseField::errorsId().
  • Added craft\fieldlayoutelements\BaseField::instructions().
  • Added craft\fieldlayoutelements\BaseField::instructionsId().
  • Added craft\fieldlayoutelements\BaseField::tipId().
  • Added craft\fieldlayoutelements\BaseField::warningId().
  • Added craft\helpers\UrlHelper::encodeParams().
  • Added craft\i18n\Formatter::willBeMisrepresented().
  • Added craft\services\Config::setBooleanDotEnvVar().
  • Added craft\services\Security::isSensitive().
  • Added craft\web\twig\variables\Cp::field().

Changed

  • Improved the color contrast of UI controls throughout the control panel. (#10169)
  • Improved the accessibility of element select fields for screen readers. (#10169)
  • Improved built-in input descriptions for screen readers. (#10183)
  • URL fields now allow query strings to be appended to email addresses (e.g. hello@example.com?subject=Check+this+out…). (#10193)
  • {% deprecated %} tags now log proper Craft deprecation warnings rather than triggering an E_USER_DEPRECATED error. (#10181)
  • Editable tables’ template columns now support suggestEnvVars and suggestAliases settings on the column definition. (#10143)
  • Editable tables now support an autosuggest column type, which support suggestEnvVars and suggestAliases settings on the column definition. (#10143)
  • The cp.assets.edit.meta, cp.categories.edit.meta, and cp.entries.edit.meta template hooks are now located after the native meta fields, rather than before. (#10172)
  • craft\helpers\Cp::fieldHtml() now supports headingPrefix and headingSuffix config keys.

Fixed

  • Fixed an error that could occur when PHP’s set_time_limit() function was disabled. (#10152)
  • Fixed a bug where the _includes/forms/autosuggest template wasn’t respecting suggestEnvVars if suggestions was already defined.
  • Fixed a bug where Table fields could have an incorrect GraphQL input type definition. (#10173)
  • Fixed a bug where structure element query params weren’t working if the passed-in element was missing its structure data. (#10122)
  • Fixed a bug where craft\base\Element::getChildren() and getDescendants() could return results for elements without an ID.
  • Fixed an error that occurred when opening the Timeline view in the Debug Toolbar. (#10176)
  • Fixed a bug where Number fields’ Default Value, Min Value, and Max Value settings could show values formatted in the wrong locale, leading to an error on save. (#10184)
  • Fixed an error that could occur when creating a Table field. (#10186)
  • Fixed a bug where Matrix blocks within drafts could lose track of their canonical blocks when they were updated upstream, resulting in duplicated blocks. (#10130)
  • Fixed a bug where disabled site handles referenced in config/routes.php were being treated as URL patterns. (#10197)

Security

  • Fixed a bug where sensitive-sounding environment variables’ values could be included in validation errors.
  • The “Sendmail Command” email setting no longer allows arbitrary values. Now it can only be set to a known sendmail command, an environment variable, or its current value.

3.7.23 - 2021-11-26

Added

  • Added craft\console\Controller::table().
  • Added craft\helpers\Console::table().

Changed

  • Reduced the amount of time it took for the GraphiQL IDE to initialize.
  • The plugin/install, plugin/uninstall, plugin/enable, and plugin/disable commands’ handle arguments are no longer required for interactive shells. When not passed, a plugin handle can be chosen from a list of applicable plugins. (#10158)
  • Select fields that include environment variable options now show a tip about that when an environment variable isn’t already selected.
  • Hyperlinks within tips are now always underlined.
  • Updated Garnish to 0.1.48.

Fixed

  • Fixed a bug where GraphiQL Explorer wasn’t working. (#10153)
  • Fixed a bug where the last control panel breadcrumb could be collapsed under a “More…” menu when there was enough room to display it.
  • Fixed a bug where the “Create a new child category” action on the Categories index page resulted in a 404. (#10148)
  • Fixed a bug where it wasn’t possible to save an image transform when the Image Format setting was set to “Auto”. (#10150)
  • Fixed an error that could occur if any asset bundles’ js or css values were set to arrays. (#10154)
  • Fixed a bug where structure data wasn’t always present when duplicating a multi-site elements. (#10165)

3.7.22 - 2021-11-23

Added

  • Added the booleanMenu, booleanMenuField, selectize, and selectizeField macros to the _includes/forms.html control panel template. (#8866)
  • Added Craft::parseBooleanEnv().
  • Added craft\base\ApplicationTrait::getWebpack().
  • Added craft\services\Webpack.
  • Added craft\web\twig\variables\Cp::getBooleanEnvOptions().
  • Added craft\web\twig\variables\Cp::getEnvOptions().

Changed

  • The “System Status” and “Time Zone” general settings can now be set to environment variables. (#9855)
  • The “Use authentication” and “Encryption Method” SMTP mailer type settings can now be set to an environment variable. (#8989)
  • The timeZone and timeZoneField control panel form macros now support an includeEnvVars setting.

Fixed

  • Fixed a bug where the entry-revisions/save-draft action wasn’t respecting the provisional param when creating a new entry and draft. (#10105)
  • Fixed an error that occurred when saving an element, if any custom field handles conflicted with magic properties on element queries. (#10099)
  • Fixed a bug where relational field thumbnails weren’t always loading for fields that weren’t on the initial tab.
  • Fixed a bug where previewing disabled Structure section entries or categories would return a 404 response. (#10121)
  • Fixed a bug where ancestor/sibling/descendant queries were yielding no results when previewing a draft or revision. (#10122)
  • Fixed a bug where Matrix fields weren’t getting reverted properly when reverting an entry’s content to a prior revision. (#10106)

3.7.21 - 2021-11-16

Added

  • Added craft\behaviors\CustomFieldBehavior::$canSetProperties.
  • Added craft\services\Fields::getFieldVersion().
  • Added craft\validators\DateCompareValidator.

Changed

  • Improved the accessibility of several field types. (#10085)
  • Entries now validate that their post date comes before their expiry date, if they have one. (#10074)
  • Entry post dates now default to the day before their expiry date, if they have one. (#10074)
  • Video assets’ dimensions are no longer suppressed, if they were set by a plugin or module. (#9038)
  • The GraphiQL IDE no longer updates the URL automatically as the query is modified. The query is now deep-linkable via a new “Share query” button. (#10064)
  • canSetProperties and hasMethods are now reserved field handles.
  • Improved the performance of entry queries. (#10095)
  • craft\base\Element::__set() now detects whether a custom field value is being set, and if so, passes the value through setFieldValue(). (#7726)
  • Updated GraphiQL to 1.4.7.

Fixed

  • Fixed a bug where craft\base\FieldTrait::$required wasn’t getting set before custom fields’ getInputHtml() methods were called.
  • Fixed a bug where entry drafts and revisions were missing their structure info when previewed. (#10056)
  • Fixed a bug where “Customize” buttons on element index pages didn’t have a pointer cursor. (#10067)
  • Fixed a bug where Edit Entry pages would warn about losing unsaved changes if the page was unloaded immediately after the entry type was changed. (#10076)
  • Fixed a bug where Craft wasn’t able to resolve dynamic control panel resource requests if Craft was installed in a subdirectory.
  • Fixed an error that occurred when attempting to create a new entry and draft via the entry-revisions/save-draft action. (#10089)
  • Fixed a bug where entries’ descendants’ URIs weren’t always getting updated after a parent’s URI changed. (#10094)

3.7.20 - 2021-11-06

Changed

  • Non-admin users with permission to administrate other users can now require password resets for other users. (#10057)
  • The Plugin Store will now prevent installation of plugins that require a greater PHP version than what’s allowed by the environment.

Fixed

  • Fixed a bug where focus rings weren’t visible on Safari. (#10058)
  • Fixed a 403 error that occurred when executing pending migrations from the control panel while logged out. (#9990)

3.7.19.1 - 2021-11-04

Changed

  • craft\elements\Entry::setAuthor() now sets the entry’s $authorId property.

Fixed

  • Fixed a bug where Edit Entry pages weren’t preselecting the entry’s parent, if it didn’t exist on the primary site. (#10050)

3.7.19 - 2021-11-02

{tip} After updating, run the following command for each Structure section, to prune unneeded structure data for drafts and revisions.

php craft utils/repair/section-structure <sectionHandle>

Added

  • Added craft\services\Structures::remove().

Changed

  • Entry drafts and revisions are no longer placed within the section’s structure (with the exception of unpublished drafts, and provisional drafts which have been assigned a new parent entry). (#9977, #9999)
  • The utils/repair/section-structure command now prunes unneeded structure data for drafts and revisions.
  • The utils/repair/section-structure command now appends entries to the structure root if they don’t have any supported sites in common with their parent.
  • craft\base\Elementinterface::getModifiedFields() and isFieldModified() now have $anySite attributes.
  • craft\services\Elements::duplicateElement() no longer places derivative elements in the structure.

Fixed

  • Fixed an error that occurred when updating to Craft 3.7.17+ from the control panel. (#9990)
  • Fixed a bug where Structure section entries would forget who their parent entry was, if it was an unpublished draft.
  • Fixed a bug where Structure sections’ structure data wasn’t getting soft-deleted when the section type was changed.
  • Fixed a bug where provisional drafts weren’t given a position within the structure when converting a Channel section to a Structure.
  • Fixed a bug where isset() checks on renamed config settings were always returning false.
  • Fixed an error that could occur when deleting image transforms. (#9957)
  • Fixed a bug where some Matrix sub-field changes could be discarded when applying a draft. (#10034)
  • Fixed an incompatibility with the Overflow plugin. (#10044)
  • Fixed a bug where Categories fields weren’t eager-loading their relations in the structure-defined order. (#10042)

Security

  • Fixed an XSS vulnerability.

3.7.18.2 - 2021-10-27

Fixed

  • Fixed an error that could occur if the CRAFT_STREAM_LOG PHP constant was set to true.
  • Fixed a bug where the “Save and continue editing” action and its Ctrl/Command + S keybord shortcut weren’t working for entry drafts, if the autosaveDrafts config setting was disabled. (#10029)

3.7.18.1 - 2021-10-27

Fixed

  • Fixed a bug where GraphQL mutations to create new entries were returning null. (#10016)
  • Fixed a couple focus ring styling issues. (#10017, #10018)

3.7.18 - 2021-10-26

Added

  • Added craft\console\ErrorHandler. (#10006)

Changed

  • Craft no longer writes out informational log messages when it’s not installed yet or an update is pending, if Dev Mode is disabled.
  • Dropdown fields now prepend a blank option to their menu when the current value is invalid. (#9989)
  • Some control panel POST requests no longer disable database replica connections. (#9996)
  • Updated Axios to 0.21.4.
  • Updated jQuery UI to 1.13.0.

Fixed

  • Fixed a bug where craft\helpers\Html::parseTagAttributes() was ignoring tag attribute values if there were any whitespace characters surrounding the = character. (#9997)
  • Fixed a bug where craft\helpers\Html::parseTagAttributes() was including trailing tabs, newlines, and other non-space whitespace characters in the parsed values of unquoted attributes. (#9997)
  • Fixed an error that could occur if the log component was configured with a custom log target and flushInterval set to 1.
  • Fixed a bug where plugin/* commands weren’t always handling failures properly. (#9984)
  • Fixed a bug where entry title changes could be overlooked when merging upstream changes into a draft. (#9966)
  • Fixed a bug where it wasn’t possible to query for draft or revision creators via GraphQL. (craftcms/gatsby-source-craft#56)
  • Fixed a bug where Super Table blocks could go missing when a draft was created, if their block type ID matched another Matrix/Super Table/Neo block’s ID on the same page.

3.7.17.2 - 2021-10-21

Changed

  • Craft::dd() no longer defaults to including syntax highlighting in its output for console requests. (#9972)

Fixed

  • Fixed a PHP error that could occur when uploading assets on some environments. (#9995)
  • Fixed a PHP error that occurred when exporting elements on PHP 7.2 or 7.3. (#9958)
  • Fixed a JavaScript error that occurred in Safari. (#9976)

3.7.17.1 - 2021-10-20

Fixed

  • Fixed an error that could occur when creating database backups on Windows. (#9978)
  • Fixed a bug where it wasn’t possible to upload assets if the storage/ folder was symlinked. (#9980)

3.7.17 - 2021-10-19

Added

  • Added the provisional argument for the remaining draft mutations via GraphQL. (#9946)
  • Added the notes and name arguments to the create draft mutation via GraphQL.
  • Added the is countable Twig test.
  • Added the is object Twig test.
  • Added craft\helpers\ElementHelper::isCanonical().
  • Added craft\helpers\ElementHelper::isDerivative().
  • Added craft\services\Path::getSystemPaths().

Changed

  • Improved the accessibility of overflowing breadcrumbs and the “My account” menu. (#9945)
  • Logs now include the raw request body in place of the $_POST array, if the $_POST array is empty. (#9941)
  • It’s now possible to modify Entries fields to relate entry drafts. (#9963)
  • It’s now possible to set Matrix block queries’ field and owner params via config arrays. (#9968)
  • The _includes/forms/text.html control panel template now supports an orientation config value, which defines the dir input attribute.
  • Craft no longer logs a warning when the request path attempts to break out of the templates/ folder. (#9929)
  • Updated Composer to 2.1.9.
  • Updated Garnish to 0.1.47.

Fixed

  • Fixed a bug where it wasn’t possible to create or publish a provisional draft via GraphQL. (#9946)
  • Fixed a bug where entry drafts weren’t getting propagated to other sites automatically after a section’s Propagation Method setting was changed. (#9944)
  • Fixed a bug where element indexes weren’t immediately showing changes after an element was restored.
  • Fixed a bug where user indexes weren’t immediately showing changes to users’ activation/suspension states. (#9947)
  • Fixed an element query performance issue. (#9806)
  • Fixed a bug where front-end action requests could resolve to disabled sites.
  • Fixed a bug where Assets fields weren’t respecting their dynamic folder path settings for unpublished drafts. (#9619)
  • Fixed a bug where deprecation warnings weren’t getting logged if craft\services\Deprecator::$logTarget was set to 'logs'.
  • Fixed a bug where escaped quotes (\") in element export data were causing CSV cell values to end prematurely. (#9958)
  • Fixed a bug where HTML entities within nested field values weren’t getting encoded for Matrix block previews. (#9964)
  • Fixed an error that could occur on element edit pages if there weren’t any alternate form actions. (#9969)
  • Fixed a bug where it wasn’t possible to upload an asset via a data URL if its MIME type contained a period. (#9632)
  • Fixed a bug where the characters-left indicator was right-aligned for RTL Plain Text fields, for users with an LTR formatting locale. (#9967)
  • Fixed a bug where craft\web\ErrorHandler::EVENT_BEFORE_HANDLE_EXCEPTION wasn’t getting triggered for requests that accepted a JSON response. (#9973)

Security

  • Assets fields now require temporary files to reside in temporary folders or somewhere within the project root, excluding system directories.
  • Fixed a potential RCE vulnerability.

3.7.16 - 2021-10-06

Added

  • Added craft\elements\Asset::getUrlsBySize(). (#9931)

Fixed

  • Fixed a bug where the top-level “Enabled” lightswitch on Edit Entry pages wasn’t getting updated when adding a new site to an entry. (#9935)
  • Fixed a bug where entry indexes weren’t showing changes to unpublished drafts until a published entry was saved. (#9940)

3.7.15 - 2021-10-05

Added

  • Added the graphql/create-token command. (#9930)
  • Added the graphql/list-schemas command.
  • Added the users/impersonate command. (#9919)
  • Added the provisional argument for draft mutations via GraphQL.
  • Added the is array Twig test.
  • Added the is callable Twig test.
  • Added the is float Twig test.
  • Added the is integer Twig test.
  • Added the is numeric Twig test.
  • Added the is resource Twig test.
  • Added the is scalar Twig test.
  • Added the is string Twig test.
  • Added craft\base\ElementTrait::$isNewForSite.
  • Added craft\mutex\DbMutexTrait.

Changed

  • Mutex locks which are “released” during a database transaction are no longer actually released for other requests until the transaction is complete.
  • Username inputs now disable auto-capitalization on iOS devices.
  • Date and time fields now use native date and time input types on mobile. (#9903)
  • Improved the performance of eager-loading entry authors. (#9907)
  • Simultaneous entry-save requests are now executed once at a time.
  • Matrix block queries now factor in nested fields based on the type/typeId param, if set. (#9921)
  • The graphql/dump-schema and graphql/print-schema commands now support a --schema argument.
  • The users/delete and users/set-password commands now support passing a user ID.
  • craft\fields\Matrix::getBlockTypeFields() now has a $typeIds argument.

Deprecated

  • Deprecated craft\helpers\UrlHelper::baseRequestUrl(). Craft::getAlias('@web') should be used instead.
  • Deprecated craft\mutex\PrefixedMutexTrait. DbMutexTrait should be used instead.

Fixed

  • Fixed a bug where the “Duplicate (with descendants)” element action would only partially duplicate multi-level structures. (#9889)
  • Fixed a bug where it wasn’t possible to mutate a provisional draft via GraphQL. (#9892)
  • Fixed a bug where it wasn’t possible to mutate a draft via GraphQL without passing all required custom fields. (#9893)
  • Fixed an error that could occur when merging upstream changes into a draft, if the canonical entry had been enabled for a new site and contained new Matrix blocks. (#9895)
  • Fixed a bug where sections’ Default Status settings weren’t being respected when adding a new site to an entry. (#9896)
  • Fixed a bug where the utils/repair/section-structure command was removing provisional drafts from the structure. (#9868)
  • Fixed a bug where the control panel header elements could become squished. (#9902)
  • Fixed a bug where collapsed structure elements weren’t getting included in exports. (#9913)
  • Fixed a bug where Matrix blocks weren’t getting propagated to sites that were added to a draft, when its changes were applied to the canonical entry. (#9910)
  • Fixed a bug where it wasn’t possible to revert Matrix blocks that had been soft-deleted. (#9928)
  • Fixed a styling conflict with Craft Commerce.
  • Fixed a bug where craft\services\AssetTransforms::getLocalImageSource() was trying to delete non-existent transform source files. (#9884)
  • Fixed a bug where craft\services\Fields::getLayoutByType() wasn’t setting the type property when a field layout didn’t exist yet for the element type. (#9918)

Security

  • Generated front-end URLs now begin with the @web alias value if the current site doesn’t have a base URL.
  • Password inputs now hide the password when their form is submitted.

3.7.14 - 2021-09-28

Added

  • Added craft\base\Element::EVENT_PREP_QUERY_FOR_TABLE_ATTRIBUTE. (#9862)
  • Added craft\base\ElementInterface::getIsFresh().
  • Added craft\base\ElementInterface::setIsFresh().
  • Added craft\cache\ElementQueryTagDependency.
  • Added craft\elements\db\ElementQuery::getCacheTags().
  • Added craft\events\ElementIndexTableAttributeEvent.
  • Added craft\events\SearchEvent::$elementQuery.
  • Added craft\events\SearchEvent::getElementIds().
  • Added craft\events\SearchEvent::setElementIds().
  • Added craft\services\Search::searchElements().
  • Added the fullPane setting to Vue admin tables, which can be set to false if the table is not the only UI component in its content pane.

Changed

  • Enhanced the visibility of global navigation badges.
  • Enhanced the visibility of focused menu options.
  • Improved the performance of element query search params. (#9867)
  • Element queries’ cache() methods now create a cache dependency based on the element queries’ cache tags by default.
  • Element index queries are now cached.
  • The migrate/all command now includes plugins whose schema versions have changed, even if they don’t have any new migrations. (#9860)
  • It’s now possible to pass an array of Matrix block IDs into a Matrix field’s element query param. (#9875)
  • Improved GraphQL performance. (#9830)

Deprecated

  • Deprecated craft\base\Element::getHasFreshContent(). getIsFresh() should be used instead.
  • Deprecated craft\services\Search::filterElementIdsByQuery().

Fixed

  • Fixed the control panel heading order for more intuitive navigation by screen reader users.
  • Fixed an uncaught error that could occur when saving a draft. (#9841)
  • Fixed an error that occurred when mutating an entry via GraphQL, if it belonged to any disabled sites. (#9842)
  • Fixed a bug where some field types wouldn’t use their configured default values on new entries, fields that weren’t included in the primary entry type. (#9852)
  • Fixed a bug where some action menus didn’t have a label for screen readers.
  • Fixed a bug where craft\web\Response::redirect() no longer supported passing an array to the $url argument. (#9857)
  • Fixed a bug where duplicated entries that were created via an “Applying new propagation method” job weren’t getting positioned correctly based on the original entries’ structure. (#9782)
  • Fixed a bug where unpublished drafts could disappear after clicking “Create entry” if the URI could not be made unique. (#9873)
  • Fixed an error that could occur when processing relatedTo* GraphQL arguments in some cases.
  • Fixed an error that could occur when an entry’s Title Format referenced a custom field with author in its handle. (#9891)

Security

  • Fixed a potential CSV injection vulnerability.

3.7.13 - 2021-09-14

Added

  • Added the up command, which calls migrate/all and project-config/apply, wrapped in a mutex lock.
  • Added craft\services\Plugins::updatePluginVersionInfo().

Changed

  • Matrix fields are now fully highlighted when changed, rather than just the specific sub-field. (#9814)
  • When a draft is saved, Craft now automatically reloads other browser tabs that are opened to the same Edit Entry page.
  • Emoji characters are now stripped from search keywords. (#9813)
  • Control panel pages now send Content-Security-Policy: frame-ancestors 'self' headers.
  • Edit Entry pages now reveal some exception messages when drafts are unable to save.
  • Control panel pages now have a “Skip to content” link before the navigation, for screen readers. (#9832)
  • Live Preview now maintains the window’s original scroll position when closed. (#9828)
  • craft\console\Controller::run() now passes the --interactive, --color, and --silentExitOnException options to the sub-command.

Deprecated

  • Deprecated craft\services\Updates::setNewPluginInfo(). craft\services\Plugins::updatePluginVersionInfo() should be used instead.

Fixed

  • Fixed an incompatibility with SEOmatic. (#9811)
  • Fixed a bug where the backup, install/plugin, restore, and setup commands weren’t passing the --interactive, --color, and --silentExitOnException options to their sub-commands.
  • Fixed a bug where drafts were getting autosaved when the site status toggles were expanded, if the entry was disabled for the current site but enabled for other sites.
  • Fixed a bug where it was possible for two provisional drafts to exist for the same entry and user.
  • Fixed an error that could occur if a log target was configured with a low flush interval. (#9818)
  • Fixed an error that could occur on the Settings → General page if the system project config array was missing any values. (#7350)
  • Fixed a bug where Edit Entry pages weren’t redirecting to the Current revision after reverting an entry to a prior revision. (#9821)
  • Fixed a bug where Assets fields were suppressing some exceptions while rendering the subpath, which weren’t related to template rendering. (#9824)
  • Fixed an error that could occur when setting an integer value on an active record attribute for a MEDIUMTEXT or LONGTEXT column. (#9825)
  • Fixed a bug where it wasn’t possible to pinch-zoom the control panel on Android devices. (#9833)

3.7.12 - 2021-09-08

Added

  • Added craft\helpers\ElementHelper::isOutdated().
  • Added craft\services\Elements::EVENT_BEFORE_UPDATE_SEARCH_INDEX. (#9801)

Changed

  • Improved the performance of applying drafts. (#9802)
  • Improved the performance of element queries. (#9806)
  • Live Preview is once again supported by entries when the autosaveDrafts config setting is disabled.
  • Checkboxes, Dropdown, Multi-select, and Radio Buttons fields now include the selected options’ labels in their search keywords. (#9799)
  • It’s now possible for field types to disable delta name registration for nested custom fields by calling Craft::$app->view->setIsDeltaRegistrationActive(false); before rendering them.
  • craft\events\ElementEvent now extends craft\events\CancelableEvent.
  • craft\models\FieldLayout::createForm() now accepts a registerDeltas key in its $config argument, which can be set to true or false to enable/disable delta name registration for any custom fields in the form.
  • craft\services\Elements::duplicateElement() now has a $placeInStructure argument.
  • The Craft.t() JS method now supports translation messages with select parameters.

Deprecated

  • Deprecated craft\behaviors\DraftBehavior::getIsOutdated().

Fixed

  • Fixed an error that occurred when merging upstream Matrix field changes into a draft, if the draft didn’t exist in all the same sites as its canonical entry. (#9774)
  • Fixed a bug where duplicated entries that were created via an “Applying new propagation method” job weren’t getting positioned correctly based on the original entries’ structure. (#9782)
  • Fixed a bug where craft\fieldlayoutelements\CustomField::formHtml() was always enabling delta name registration, unless the form was static.
  • Fixed an exception that could occur if an invalid alias was passed to the svg() Twig function.
  • Fixed a bug where Edit Category pages weren’t remembering changes or showing validation errors in the event that a category couldn’t be saved. (#9796)
  • Fixed a bug where the migrate/all command wasn’t running Craft and plugin migrations if the schema versions hadn’t changed.
  • Fixed a bug where Craft was indexing search keywords for block elements that belonged to entry revisions. (#9801)
  • Fixed a bug where craft\services\Elements::mergeCanonicalChanges() was doing more work than it needed to. (#9802)
  • Fixed a bug where it wasn’t possible to paste into a Number field on Windows. (#9803)

3.7.11 - 2021-08-31

Added

  • Added the canonicalUid field to entries queried via GraphQL.
  • Added craft\base\ElementInterface::getCanonicalUid(). (#9757)

Changed

  • Edit Entry pages now show a “Save draft” button for users without the “Publish live changes” permission. (#9750)
  • Users without the “Delete entries” permission can now delete their own unpublished drafts.
  • All entries now have a canonicalId field when queried via GraphQL now; not just drafts.
  • craft\services\Matrix::validateBlockType() no longer has a $validateUniques argument.
  • Improved the performance of entry queries for installs with several hundred thousand entries or more.
  • Visible password inputs now prevent the browser from auto-capitalizing the input text.

Deprecated

  • Deprecated craft\records\MatrixBlockType::$validateUniques.

Fixed

  • Fixed an error that could occur when saving Matrix fields, if the Type Linked Field and Expanded Singles plugins were both installed. (#9749)
  • Fixed a bug where craft\helpers\Queue::push() wasn’t returning the job ID. (#9764)
  • Fixed a bug where code editors powered by Monaco Editor were showing focus rings on the text cursor. (#9772)

3.7.10 - 2021-08-19

Changed

  • It’s now possible to hook into the delete process of a Vue admin table row.
  • Dynamically-served control panel resources no longer get cache headers, and no longer validate that the URI hash matches. (#9738)

Fixed

  • Fixed a bug where Tokenfield inputs weren’t getting sized correctly when the window was resized, if rendered within a field that used a fieldset. (#9734)
  • Fixed a bug where row headings that included a status were getting bold text in Vue admin tables. (#9704)
  • Fix a bug where GraphQL queries could fail if they included Date fields with empty values.
  • Fixed an error that could occur when installing Craft using whe web-based install wizard, if a database connection couldn’t be established. (#9740)

3.7.9 - 2021-08-17

Added

  • Added the utils/prune-provisional-drafts command, which prunes provisional drafts for entries that have more than one per user.
  • Added craft\helpers\App::supportsIdn().

Changed

  • Custom fields’ search keywords are now indexed for entry drafts.
  • Email fields now allow IDNA ASCII characters in the domain name, on servers with the Intl extension. (#9698)
  • Revved asset URLs now use a v query string param. (#9716)
  • Element sources’ badge counts are now kept up-to-date when performing bulk element actions. (#9728)
  • Date fields that are set to show the time zone now set their values to the selected time zone by default when queried via GraphQL, to be consistent with the PHP and Twig APIs. (#9719)
  • The utils/prune-revisions command now has a --dry-run flag.
  • The utils/prune-revisions command will now output how many excess revisions it could actually load for each entry, if it differed from the original estimate.
  • Updated Yii to 2.0.43.

Deprecated

  • Deprecated craft\helper\App::isNitro(). (#9709)

Fixed

  • Fixed a bug where custom fields’ search keywords weren’t getting indexed for newly-created entries. (#9699)
  • Fixed a bug where user email addresses would validate if they had IDNA ASCII characters in the local part, even though Swiftmailer doesn’t allow it. (#9096)
  • Fixed a bug where Date fields weren’t handling array values with datetime keys properly. (#9708)
  • Fixed a bug where Edit Asset pages for top-level assets had an extra breadcrumb. (#9720)
  • Fixed a bug where the “New category” button on the Categories index page would link to a 404 when a non-primary site was selected. (#9722)
  • Fixed a bug where changing the site from an Edit Category page would go to a 404 when editing a new, unsaved category.
  • Fixed a bug where deep-linking to a volume’s subfolder that contained any non-ASCII characters would return a 404. (#9723)
  • Fixed a bug where the Assets index page wasn’t updating the URL when selecting a subfolder that had been renamed on the same page load.
  • Fixed a bug where the CLI installer would always save a PRIMARY_SITE_URL environment variable to the .env file, even if the initial site’s base URL was already set to an alias or environment variable. (#9724)
  • Fixed an UnsupportedSiteException error that could occur on Edit Entry pages for provisional drafts, if any upstream Matrix blocks needed to be merged in, whose Matrix field’s Propagation Method was set to something besides “Save blocks to all sites the owner element is saved in”. (#9664)
  • Fixed a bug where replacing an asset’s file from an Edit Asset page would seem to not take effect until the page was refreshed. (#9700)
  • Fixed a bug where upstream translatable field changes weren’t always getting merged into entry drafts properly. (#9729)

3.7.8 - 2021-08-06

Added

  • It’s now possible to bypass console warnings about running Craft as the root/super user by defining a CRAFT_ALLOW_SUPERUSER environment variable. (#7955)
  • Added craft\web\Request::setIsActionRequest().
  • Added craft\web\twig\CpExtension.
  • Added craft\web\twig\GlobalsExtension.

Changed

  • Craft’s global Twig variables (e.g. craft) can now be autocompleted within Twig templates when using PhpStorm with the Symfony Support plugin.

Fixed

  • Fixed a bug where the site menu on Edit Category pages wasn’t working properly. (#9658)
  • Fixed a bug where the “Save and add another” action on Edit Category pages wasn’t retaining the currently-selected site or parent category selection. (#9677)
  • Fixed a bug where the “Discard changes” button on Edit Entry pages wasn’t retaining the currently-selected site. (#9663)
  • Fixed an error that occurred when attempting to change a global set’s handle, if its former handle was a reserved word.
  • Fixed a bug where it wasn’t possible to search for Matrix blocks by a specific sub-field’s handle using the search param. (#9679)
  • Fix a JavaScript error that occurred after moving a subfolder on the Assets index page. (#9686)
  • Fixed an infinite loop that could occur when handing a front-end set-password request, if there was a validation error on the submitted password. (#9684)
  • Fixed a bug where entries could lose other sites’ content when being saved from an unpublished draft, if their section’s Propagation Method was set to “Let each entry choose which sites it should be saved to”. (#9680)
  • Fixed a bug where entries that were created via the “Save as a new entry” action on an Edit Entry page didn’t include all content changes made in the original entries’ provisional draft. (#9681)
  • Fixed a bug where code blocks in field instructions could bleed into the subsequent field. (#9683)

3.7.7 - 2021-07-29

Added

  • Added the canonicalId GraphQL field for entries.

Deprecated

  • Deprecated the sourceId and sourceUid GraphQL fields for entries. canonicalId should be used instead.

Fixed

  • Fixed an error that could occur when creating a new entry, if the section’s Entry URI Format contained {canonicalId}. (#6080)
  • Fixed a bug where craft\helpers\Db::isTextualColumnType() was always returning false.
  • Fixed a bug where :empty: element query conditions weren’t working correctly for empty string values on Postgres. (#9641)
  • Fixed an error that occurred if an entry’s getSupportedSites() method was called on a front-end, non-action request. (#9649)
  • Fixed a SQL error that could occur when running the “Find and Replace” utility. (#9651)
  • Fixed a bug where Date fields that were set to only show the time input weren’t saving new values properly. (#9650)
  • Fixed a bug where craft\services\Fields::$oldFieldColumnPrefix wasn’t getting set properly when deleting a Matrix block type.
  • Fixed a bug where Matrix sub-fields were getting new content columns whenever their block type’s handle was changed, when the existing columns should have been renamed.

3.7.6 - 2021-07-27

Added

  • Added the provisionalDrafts argument for entry GraphQL queries.

Fixed

  • Fixed a bug where global set queries could contain fields that were supposed to be hidden.
  • Fixed a bug where craft\helpers\DateTimeHelper::toDateTime() was interpreting year-only values as timestamps. (#9642)
  • Fixed a bug where blank Email field values were getting stored as empty strings rather than NULL. (#9641)
  • Fixed a bug where it wasn’t possible to clear out some entry field values, if their values were blank to begin with. (#9643)

3.7.5 - 2021-07-23

Added

  • Added craft\base\ElementTrait::$firstSave. (#9638)
  • Added craft\base\FieldInterface::getOrientation().
  • Added craft\helpers\FieldHelper.

Changed

  • Field orientations are now based on the primary site’s language for single-site installs. (#9616)
  • Matrix block type handles are now limited to 47 characters. (#9636)

Fixed

  • Fixed a bug where Live Preview stopped working when the device type was changed, for preview targets that had auto-refresh disabled. (#9610)
  • Fixed a 403 error that occurred when attempting to discard changes on an entry. (#9602)
  • Fixed a bug where opening the image editor would cause the page to scroll to the top. (#9612)
  • Fixed a bug where provisional drafts weren’t displaying a notice when upstream changes had been merged into them. (#9615)
  • Fixed a bug where entry titles were set to null before getting regenerated via their Title Format for new drafts.
  • Fixed SQL errors that could occur when updating Craft 3.7. (#9624, #9625)
  • Fixed a bug where craft\web\Request::getRawCookies() was returning hashed cookie values.
  • Fixed a PHP error that could occur when saving a site, if there were any event handlers on craft\services\Sites::EVENT_BEFORE_SAVE_SITE.
  • Fixed an error that could occur when deleting a route from the control panel if there were any event handlers on craft\services\Routes::EVENT_AFTER_DELETE_ROUTE.
  • Fixed a bug where existing fields’ maximum handle lengths were nine characters less than they needed to be.
  • Fixed a bug where Craft would send a X-Robots-Tag: none header on front-end Login pages. (#9621)
  • Fixed a bug where the “Singles” entry source showed the Author column by default. (#9627)
  • Fixed a bug where the control panel header could remain “stuck” after closing Live Preview in Firefox. (#9630)
  • Fixed a JavaScript error that could occur on Edit Entry pages. (#9631)
  • Fixed a bug where assets weren’t always getting moved out of the Temporary Uploads volume when saving an entry. (#9619)
  • Fixed a bug where it wasn’t possible to upload an asset via a data URL if its MIME type contained a dash. (#9632)

3.7.4 - 2021-07-19

Added

  • Added craft\helpers\ElementHelper::shouldTrackChanges().

Changed

  • Improved the performance of delta form submissions. (#9605)

Fixed

  • Fixed a bug where temporary volume folders couldn’t be created for console requests. (#9597)
  • Fixed a bug where craft\base\Field::copyValue() wasn’t passing the source element to $this->serializeValue(). (sebastian-lenz/craft-linkfield#161)
  • Fixed a bug where entries were only tracking modified attributes for the site the changes were made on.
  • Fixed a bug where entries were only tracking modified relation fields for the site changes were made on. (#9596)
  • Fixed a bug where images within rich text fields’ static previews could bleed out of their container element. (#9603)
  • Fixed a bug where passing an empty value to relatedTo() and andRelatedTo() would yield no results on an element query. (#9599)
  • Fixed a bug where existing Matrix/Neo/Super Table blocks could lose their content when creating a provisional draft, if additional block changes were queued up before the draft was fully created. (#9601)

3.7.3.2 - 2021-07-18

Fixed

  • Fixed a bug where Edit Entry pages weren’t submitting changes to fields if they had been changed back to their original value they had on page load. (#9575)

3.7.3.1 - 2021-07-17

Changed

  • Improved the performance of Edit Entry pages. (#9575)

Fixed

  • Fixed styling issues in the control panel. (#9590, #9592)
  • Fixed a bug where entry drafts could label fields as being modified on the canonical entry, even when they weren’t.

3.7.3 - 2021-07-16

Added

  • Added the sendContentLengthHeader config setting.

Changed

  • Template requests no longer respond with a Content-Length header, unless the sendContentLengthHeader config setting is enabled. (#8070)
  • Edit Asset pages are now located at assets/edit/<id>-<filename> rather than assets/<volume>/<id>-<filename>.
  • edit is now a reserved volume handle.
  • Number fields no longer allow non-numeric input. (#9586)

Fixed

  • Fixed a bug where object templates didn’t support string interpolation within normal Twig tags. (#9138)
  • Fixed an error that could occur after applying project config changes.
  • Fixed a bug where assets’ control panel URLs were getting routed to the Assets index page. (#9583)
  • Fixed a visual bug where field status indicators were overlapping the prior field in the same row. (#9585)

3.7.2 - 2021-07-15

Fixed

  • Fixed a SQL error that could occur when updating to Craft 3.7. (#9574)
  • Fixed a bug where Edit Entries pages were displaying a “Delete draft” action for provisional drafts.
  • Fixed a 404 error that occurred when linking to a volume’s subfolder on the Assets index page, if the subfolder contained a dash. (#9579)
  • Fixed a bug where Craft was logging errors and warnings to stdout when Dev Mode was disabled, if the CRAFT_STREAM_LOG PHP constant was set. (#9572)

3.7.1 - 2021-07-14

Added

  • Added the transformSvgs config setting. (#9557)

Changed

  • Console requests no longer force Dev Mode to be enabled. (#5256)

Fixed

  • Fixed deprecation warnings that occurred on some edit pages. (#9556)
  • Fixed an error that occurred when updating from Craft 3.6.7 or earlier.
  • Fixed a bug where progress bar labels weren’t always removed correctly.
  • Fixed a bug where it wasn’t possible to filter by status on the Categories index page. (#9555)
  • Fixed a bug where Edit Category pages didn’t have a “Save and add another” action.
  • Fixed a bug where moving an asset with an invalid file extension would be treated as if there was a conflicting asset in the destination directory. (#9147)
  • Fixed a bug where multiple tab bars could appear on Edit Entry pages, if the Entry Type had been changed multiple times. (#9562)
  • Fixed a bug where some control panel icons had unhelpful <title> tags and other cruft. (#9563)
  • Fixed a bug where the “Create a draft” button on Edit Entry pages wasn’t working properly for users that didn’t have permission to publish changes to the entry. (#9570)
  • Fixed a bug where Edit Entry pages could show a provisional draft immediately after saving published changes to the entry, if the save was initiated at the same time that the provisional draft was getting created. (#9568)
  • Fixed a bug where entry slugs weren’t getting auto-generated on first save, if their title was generated based on a custom Title Format. (#9561)

3.7.0 - 2021-07-13

{tip} Read through the Upgrading to Craft 3.7 guide before updating.

Added

  • The control panel now displays new feature announcements. (#8056)
  • Added the “Always show focus rings” user preference. (#7790)
  • The Entries index page now has “Create a new entry before” and “Create a new entry after” actions for entries within Structure sections. (#870)
  • The Entries index page now has a “Delete for site” action for entries whose section’s Propagation Method is set to “Let each entry choose which sites it should be saved to”. (#9119)
  • Edit Entry pages now treat unpublished drafts similarly to published entries, rather than drafts. (#7899)
  • Edit Entry pages no longer appear to create a draft when the Current revision is edited within Live Preview. Unsaved changes are now stored within a “provisional draft”, which is mostly hidden from the author. (#7899)
  • Category groups now have a “Default Category Placement” setting, which determines where new categories should be placed within the structure by default. (#7759)
  • Structure sections now have a “Default Entry Placement” setting, which determines where new entries should be placed within the structure by default. (#7759)
  • The Assets index page now remembers the selected subfolder between page loads. (#9546)
  • It’s now possible to deep-link to a specific subfolder on the Assets index page.
  • Edit Asset pages now redirect back to the subfolder the asset is located in on save.
  • It’s now possible to reorder global sets. (#8052)
  • Date fields now have a “Show Time Zone” setting, allowing authors to choose which time zone the date is set to, rather than using the system time zone.
  • Matrix fields can now be set to custom propagation methods, based on a propagation key template. (#7610)
  • Added a “Refresh” button to Live Preview, for preview targets whose “Auto-refresh” (formerly “Refresh”) setting is disabled.
  • Added the users/create and users/delete commands. (#8014)
  • Added the siteSettingsId element query and GraphQL API query parameter for all elements.
  • Added the preferSites GraphQL API query argument for all elements. (#8006)
  • Added the ancestors, descendants, drafts, draftCreator, revisions, currentRevision, and revisionCreator fields to entry GraphQL queries. (#7950)
  • Added the httpProxy config setting, which can be used instead of setting the proxy Guzzle request option. (#9105)
  • Added the previewTokenDuration config setting. (#2394)
  • Added the revAssetUrls config setting. (#7847)
  • Added the setGraphqlDatesToSystemTimeZone config setting. (#8016)
  • Added the useUnbufferedConnections database connection setting, which can be set to true when using MySQL to cause batched queries to be executed over separate, unbuffered database connections when using MySQL. (#7338)
  • Added the “Validate custom fields on public registration” user setting. (#4229)
  • Added the |removeClass Twig filter.
  • Added craft\base\ApplicationTrait::getAnnouncements().
  • Added craft\base\ConfigurableComponent::EVENT_DEFINE_SETTINGS_ATTRIBUTES. (#8004)
  • Added craft\base\Element::EVENT_DEFINE_IS_DELETABLE.
  • Added craft\base\Element::EVENT_DEFINE_IS_EDITABLE. (#8023)
  • Added craft\base\Element::EVENT_DEFINE_METADATA.
  • Added craft\base\Element::EVENT_DEFINE_META_FIELDS_HTML.
  • Added craft\base\Element::EVENT_DEFINE_SIDEBAR_HTML.
  • Added craft\base\Element::cpEditUrl(), which should be overridden rather than getCpEditUrl().
  • Added craft\base\Element::hasFieldLayout().
  • Added craft\base\Element::isDeletable().
  • Added craft\base\Element::isEditable().
  • Added craft\base\Element::metaFieldsHtml().
  • Added craft\base\Element::metadata().
  • Added craft\base\Element::slugFieldHtml().
  • Added craft\base\ElementInterface::getCanonical().
  • Added craft\base\ElementInterface::getCanonicalId().
  • Added craft\base\ElementInterface::getIsCanonical().
  • Added craft\base\ElementInterface::getIsDerivative().
  • Added craft\base\ElementInterface::getMetadata().
  • Added craft\base\ElementInterface::getModifiedAttributes().
  • Added craft\base\ElementInterface::getModifiedFields().
  • Added craft\base\ElementInterface::getOutdatedAttributes().
  • Added craft\base\ElementInterface::getOutdatedFields().
  • Added craft\base\ElementInterface::getParentUri(). (#7932)
  • Added craft\base\ElementInterface::getSidebarHtml().
  • Added craft\base\ElementInterface::isAttributeModified().
  • Added craft\base\ElementInterface::isAttributeOutdated().
  • Added craft\base\ElementInterface::isFieldModified().
  • Added craft\base\ElementInterface::isFieldOutdated().
  • Added craft\base\ElementInterface::mergeCanonicalChanges().
  • Added craft\base\ElementInterface::setCanonical().
  • Added craft\base\ElementInterface::setCanonicalId().
  • Added craft\base\ElementTrait::$dateLastMerged.
  • Added craft\base\ElementTrait::$isProvisionalDraft.
  • Added craft\base\ElementTrait::$mergingCanonicalChanges.
  • Added craft\base\ElementTrait::$updatingFromDerivative.
  • Added craft\base\FieldInterface::copyValue().
  • Added craft\base\FieldInterface::getStatus().
  • Added craft\base\FieldTrait::$columnSuffix.
  • Added craft\console\ControllerTrait::checkRootUser().
  • Added craft\console\ControllerTrait::createAttributeValidator(). (#8066)
  • Added craft\console\controllers\ResaveController::resaveElements().
  • Added craft\elements\User::EVENT_DEFINE_FRIENDLY_NAME. (#8027)
  • Added craft\elements\User::EVENT_DEFINE_NAME. (#8027)
  • Added craft\elements\User::setFriendlyName().
  • Added craft\elements\User::setName().
  • Added craft\elements\db\ElementQuery::provisionalDrafts().
  • Added craft\events\DefineHtmlEvent.
  • Added craft\events\DefineMetadataEvent.
  • Added craft\events\DefineValueEvent.
  • Added craft\events\DraftEvent::$provisional.
  • Added craft\fields\Matrix::$propagationKeyFormat.
  • Added craft\fields\Matrix::PROPAGATION_METHOD_CUSTOM.
  • Added craft\helpers\Cp::autosuggestFieldHtml().
  • Added craft\helpers\Cp::dateTimeFieldHtml().
  • Added craft\helpers\Cp::editElementTitles().
  • Added craft\helpers\Cp::elementSelectFieldHtml().
  • Added craft\helpers\Cp::metadataHtml().
  • Added craft\helpers\Db::batch() and each(), which can be used instead of craft\db\Query::batch() and each(), to execute batched SQL queries over a new, unbuffered database connection (if using MySQL and useUnbufferedConnections is true). (#7338)
  • Added craft\helpers\ElementHelper::fieldColumn().
  • Added craft\helpers\ElementHelper::fieldColumnFromField().
  • Added craft\helpers\ElementHelper::isDraft().
  • Added craft\helpers\ElementHelper::isRevision().
  • Added craft\helpers\Html::parseTagAttribute().
  • Added craft\helpers\Html::widont().
  • Added craft\mail\Message::$error. (#8091)
  • Added craft\models\CategoryGroup::$defaultPlacement.
  • Added craft\models\CategoryGroup::DEFAULT_PLACEMENT_BEGINNING.
  • Added craft\models\CategoryGroup::DEFAULT_PLACEMENT_END.
  • Added craft\models\FieldLayout::$reservedFieldHandles.
  • Added craft\models\Section::$defaultPlacement.
  • Added craft\models\Section::DEFAULT_PLACEMENT_BEGINNING.
  • Added craft\models\Section::DEFAULT_PLACEMENT_END.
  • Added craft\models\SiteGroup::getName().
  • Added craft\models\SiteGroup::setName().
  • Added craft\services\Announcements.
  • Added craft\services\Elements::EVENT_AFTER_MERGE_CANONICAL_CHANGES.
  • Added craft\services\Elements::EVENT_BEFORE_MERGE_CANONICAL_CHANGES.
  • Added craft\services\Elements::mergeCanonicalChanges().
  • Added craft\services\Elements::updateCanonicalElement().
  • Added craft\services\Matrix::mergeCanonicalChanges().
  • Added craft\services\Tokens::createPreviewToken().
  • Added craft\web\Request::checkIfActionRequest().
  • Added craft\web\View::clearCssBuffer().
  • Added craft\web\View::clearScriptBuffer().
  • Added craft\web\View::getInitialDeltaValues().
  • Added craft\web\View::startCssBuffer().
  • Added craft\web\View::startScriptBuffer().
  • Added craft\web\twig\variables\Cp::getTimeZoneOptions().
  • Added the timeZone and timeZoneField macros to the _includes/forms.html control panel template.
  • Added the Craft.Slideout JavaScript class.
  • Added the Craft.Tabs JavaScript class.
  • Added the Craft.group() JavaScript method.
  • Added the Craft.setFocusWithin() JavaScript method.
  • Added the Craft.trapFocusWithin() JavaScript method.

Changed

  • Changes from an entry’s Current revision are now automatically merged into drafts upon visiting drafts’ edit pages.
  • When changes from an entry’s Current revision are merged into a draft, Matrix field changes are now merged on a per-block basis. (#5503, #7710)
  • Inline element editors now use slideouts rather than HUDs, and include the element’s fully-rendered field layout (including tabs and custom UI elements), meta fields (Slug, Post Date, etc.) and metadata, plus a link to open the element’s dedicated edit page in a new browser tab. (#8017)
  • The “Publish draft” button has been relabelled to “Apply draft”.
  • Entries now retain their original IDs when created from an unpublished draft. (#9104)
  • Matrix blocks now retain their original IDs and UIDs when a draft is published. (#7710)
  • Improved the styling of field status indicators.
  • Field status indicators now appear immediately after a field’s value is changed and saved successfully to a draft.
  • Improved the design and accessibility of tabs in the control panel. (#7299)
  • Asset, category, and entry indexes now use “Asset”, “Category”, and “Entry” header column headings by default, rather than “Title”.
  • Improved the UI of the Time Zone input in Settings → General.
  • It’s now possible to toggle site-specific category statuses from the Edit Category page. (#7636)
  • Tag field layouts now include the Title field, allowing its placement and label to be customized.
  • Tag field layouts can now contain multiple tabs and UI elements.
  • Custom fields with a custom translation method are no longer labelled as translatable if the translation key is an empty string. (#7647)
  • Category and tag groups no longer validate if their field layout contains a field called group. (#2797)
  • Entry types no longer validate if their field layout contains a field called author, section, or type. (#2797)
  • Volumes no longer validate if their field layout contains a field called folder or volume. (#2797)
  • The user field layout no longer validates if it contains a field called groups or photo. (#2797)
  • The resave/entries command now has a --provisional-drafts option.
  • resave/* commands now have a --queue option. (#8040)
  • Entries no longer support Live Preview if the autosaveDrafts config setting is disabled.
  • Most text areas in the control panel will now submit the closest form when Ctrl/Command + Return is pressed. (#7999)
  • The defaultCpLanguage config setting no longer affects console requests. (#7747)
  • The {% cache %} tag now stores any JavaScript or CSS code registered with {% js %}, {% script %}, and {% css %} tags. (#7758)
  • The date() Twig function now supports arrays with date and/or time keys. (#7681)
  • Date query params now support passing in times relative to now (e.g. >= now). (#9117)
  • Object templates (such as redirect params and URI Format settings) now support string interpolation. (#9138)
  • Custom field column names now include a random string, preventing column name conflicts when deploying multiple project config changes at once. (#6922)
  • Custom fields can now store data across multiple columns in the content table.
  • Channel and Structure sections’ initial entry types are now named “Default” by default. (#7078)
  • Entries can now be eager-loaded with revisions.
  • Console commands now show a confirmation prompt when executed as the root user. (#7955)
  • Project config component UID/name mappings are now stored in the project config itself, making them portable across environments. (#7709)
  • Validation errors in the control panel are now parsed for Markdown syntax. (#8008)
  • Renamed the enableGraphQlCaching config setting to enableGraphqlCaching. (The old name still works but is deprecated.)
  • Admin tables can now include linked buttons in the toolbar.
  • Admin tables can now include single action buttons.
  • Admin tables now support separators in menu button lists.
  • Site group names can now be set to environment variables. (#8044)
  • Template requests now respond with a Content-Length header. (#8070)
  • Exceptions thrown by queue jobs are now logged. (#8060)
  • craft\base\Element::getCpEditUrl() now includes a draftId/revisionId query string param in the returned URL if the element is a draft or revision. (#7832)
  • craft\base\FieldInterface::getContentColumnType() can now return an array, if the field stores content across multiple columns.
  • craft\helpers\Cp::elementHtml() now has a $single argument.
  • craft\helpers\DateTimeHelper::toDateTime() now supports passing in 'now'. (#9117)
  • craft\services\AssetTransforms::normalizeTransform() now accepts transform configs arrays that specify a base transform which should be extended, via a transform key set to the stored transform’s handle. (#7892)
  • craft\services\Drafts::EVENT_AFTER_APPLY_DRAFT is no longer deprecated.
  • craft\services\Drafts::EVENT_BEFORE_APPLY_DRAFT is no longer deprecated.
  • craft\services\Drafts::applyDraft() is no longer deprecated.
  • craft\services\Users::saveLayout() now has a $runValidation argument, which is true by default.
  • craft\web\View::clearJsBuffer() now has a $combine argument.
  • craft\web\View::namespaceInputs() now accepts a callback function for the first argument, which simplifies the process of setting and resetting the registered namespace before and after generating the to-be-namespaced HTML.
  • Updated Garnish to 0.1.46.

Deprecated

  • Deprecated craft\base\Element::ATTR_STATUS_CONFLICTED.
  • Deprecated craft\base\Element::getFieldStatus().
  • Deprecated craft\base\Element::getSourceId(). getCanonicalId() should be used instead.
  • Deprecated craft\base\Element::getSourceUid(). getCanonical()->uid should be used instead.
  • Deprecated craft\base\VolumeInterface::folderExists(). directoryExists() should be used instead.
  • Deprecated craft\behaviors\BaseRevisionBehavior::$sourceId. craft\base\ElementInterface::getCanonicalId() should be used instead.
  • Deprecated craft\behaviors\DraftBehavior::$dateLastMerged. craft\base\ElementTrait::$dateLastMerged should be used instead.
  • Deprecated craft\behaviors\DraftBehavior::$mergingChanges. craft\base\ElementTrait::$mergingCanonicalChanges should be used instead.
  • Deprecated craft\behaviors\DraftBehavior::$trackChanges.
  • Deprecated craft\behaviors\DraftBehavior::getOutdatedAttributes(). craft\base\ElementInterface::getOutdatedAttributes() should be used instead.
  • Deprecated craft\behaviors\DraftBehavior::getOutdatedFields(). craft\base\ElementInterface::getOutdatedFields() should be used instead.
  • Deprecated craft\behaviors\DraftBehavior::isAttributeModified(). craft\base\ElementInterface::isAttributeModified() should be used instead.
  • Deprecated craft\behaviors\DraftBehavior::isAttributeOutdated(). craft\base\ElementInterface::isAttributeOutdated() should be used instead.
  • Deprecated craft\behaviors\DraftBehavior::isFieldModified(). craft\base\ElementInterface::isFieldModified() should be used instead.
  • Deprecated craft\behaviors\DraftBehavior::isFieldOutdated(). craft\base\ElementInterface::isFieldOutdated() should be used instead.
  • Deprecated craft\console\controllers\ResaveController::saveElements(). resaveElements() should be used instead.
  • Deprecated craft\elements\Asset::KIND_FLASH.
  • Deprecated craft\services\Content::getContentRow().
  • Deprecated craft\services\Content::populateElementContent().
  • Deprecated craft\services\Drafts::EVENT_AFTER_MERGE_SOURCE_CHANGES.
  • Deprecated craft\services\Drafts::EVENT_AFTER_PUBLISH_DRAFT. EVENT_AFTER_APPLY_DRAFT should be used instead.
  • Deprecated craft\services\Drafts::EVENT_BEFORE_MERGE_SOURCE_CHANGES.
  • Deprecated craft\services\Drafts::EVENT_BEFORE_PUBLISH_DRAFT. EVENT_BEFORE_APPLY_DRAFT should be used instead.
  • Deprecated craft\services\Drafts::mergeSourceChanges().
  • Deprecated craft\services\Drafts::publishDraft(). applyDraft() should be used instead.
  • Deprecated craft\web\View::getInitialDeltaValue().

Removed

  • Removed support for the “Flash” file kind. (#7626)

Fixed

  • Fixed a bug where Craft would place the beginBody() tag incorrectly if a template’s <body> tag had attribute values that included > characters. (#7779)
  • Fixed a bug where updated attributes and fields weren’t getting tracked when publishing a draft or reverting an entry to a revision.
  • Fixed a bug where it wasn’t easily possible to submit forms to controller actions from Live Preview pages. (#7885)
  • Fixed a bug where it was possible to choose a different parent entry when editing a draft, even though the change wouldn’t stick when publishing the draft.
  • Fixed a bug where changing an entry’s parent wouldn’t update any of its drafts.
  • Fixed a SQL error that occurred when deleting a volume folder that had subfolders nested more than 15 levels deep. (#8073)
  • Fixed a SQL error that occurred when hard-deleting a volume that had subfolders nested more than 15 levels deep. (#8073)
  • Fixed a bug where exported CSV files weren’t being imported with an UTF-8 encoding by Excel. (#8067)
  • Fixed a bug where Dropdown fields weren’t always saving properly within element editor slideouts, if left unchanged. (#8090)
  • Fixed a bug where value normalizers for GraphQL mutations would not be executed in nested field. (#9139)

Security

  • The default allowedFileExtensions config setting value no longer includes xml.

3.6.18 - 2021-07-13

Added

  • Added craft\web\Response::redirect().
  • Added craft\gql\handlers\Site.

Changed

  • Increased the margin around the image editor on small viewports. (#9143)

Fixed

  • Fixed a button styling issue in Safari. (#8076)
  • Fixed an error that occurred when running the db/restore command, if the info table was missing its row. (#7028)
  • Fixed an error that occurred when uninstalling a plugin via the plugin/uninstall command with --force, if the plugin didn’t have a row in the plugins table.
  • Fixed a bug where element thumbnails weren’t always getting lazy-loaded properly. (#6621)
  • Fixed a bug where control panel requests weren’t always redirecting to the control panel when they were supposed to. (#9081)
  • Fixed a bug where control panel URLs were getting empty hashes appended to them in Firefox, adding an extra element to the browser’s session history. (#9118)
  • Fixed a bug where it was impossible to use "*" as a value for the siteId argument when using the GraphQL API. (#9098)
  • Fixed a bug where dynamically-served control panel resources weren’t getting proper cache headers. (#9140)
  • Fixed a bug where dynamically-served control panel resources weren’t 404ing if the file hashes didn’t match. (#9140)
  • Fixed a bug where currency options weren’t sorted alphabetically within Number field settings. (#9141)
  • Fixed a bug where craft\helpers\Db::isNumericColumnType() was always returning false.

3.6.17 - 2021-06-15

Changed

  • Mobile viewports no longer zoom into inputs on focus automatically.

Fixed

  • Fixed a bug where missing plugin notices for Google Cloud Storage were linking to Amazon S3 instead. (#8012)
  • Fixed a bug where Number fields’ Default Value, Min Value, and Max Value settings were getting formatted with decimal values when the Intl extension wasn’t installed, causing validation errors when saving the field. (#8007)
  • Fixed a type coercion related bug when passing an empty string as a dimension to Asset transforms. (#8025)
  • Fixed a bug where nested element sources weren’t showing source-specific sort options. (#8026)
  • Fixed a bug where volumes would lose their sort position when edited. (#8033)
  • Fixed a bug where unpublished drafts were getting ignored when lazy-loading additional entries in Structure sections.
  • Fixed a PHP error that occurred when indexing search keywords for a Table field with a Date or Time column. (#8061)

3.6.16 - 2021-06-01

Added

  • Added craft\helpers\Db::supportsTimeZones().

Changed

  • The control panel sidebar no longer shows delayed queue jobs until they’re actually executing. (#7998)

Fixed

  • Fixed a bug where eager-loading entries’ authors wasn’t including pending and suspended authors. (#7963)
  • Fixed a bug where not all element types’ GraphQL queries supported a status argument. (craftcms/gatsby-source-craft#35)
  • Fixed JavaScript errors that could occur in the control panel.
  • Fixed a bug where the System Messages utility was showing default messages in the user’s preferred language, even if that wasn’t one of the sites’ languages. (#7992)
  • Fixed a bug where Table fields were getting duplicate search keywords, making it difficult to perform exact match searching on their values. (#7984)
  • Fixed a bug where Structure section entries and categories would show “Create a new child” and “Delete (with descendants)” actions even if the structure was limited to a single level. (#7988)

3.6.15 - 2021-05-18

Added

  • Added craft\services\Updates::getIsUpdatePending(). (#7946)

Changed

  • The allowedFileExtensions config setting now includes dotx and dotm files by default. (#7935)
  • Craft now recognizes dotx files. (#7935)
  • Updated Garnish to 0.1.44. (#7940)

Fixed

  • Fixed an error that occurred when running tests that use craft\test\fixtures\FieldLayoutFixture.
  • Fixed a SQL error that occurred when calling craft\records\Site::getGroup(). (#7914)
  • Fixed a bug where search terms that contained camelCased attribute names could yield no results. (#7927)
  • Fixed a bug where the browser would jump back to the top of the page when scrolling passed a Redactor field with a fixed toolbar. (#7888)
  • Fixed a bug where the My Drafts widget wasn’t showing drafts for entries that didn’t exist in the primary site. (#7942)
  • Fixed a JavaScript error that occurred when switching an entry’s type from one that had multiple tabs to one with only one. (#7943)
  • Fixed a bug where nested GraphQL arguments could be parsed incorrectly. (#7534)
  • Fixed a bug where public GraphQL schemas could be unavailable on environments that didn’t allow admin changes. (#7925)