49 KiB
4.2.0
Overview
- Disable session-based stage setting in
Versioned
(see #1578) - Deprecated
FunctionalTest::useDraftSite()
. You should use querystring args instead for setting stage.
Upgrading
App folder name
The standard 'mysite' code naming convention has changed in 4.2. Although existing sites can continue
to use 'mysite/codeto store their base project code, the recommendation and new default is to store code in
app/src`.
Additionally, we reinforce the recommendation to use psr-4 autoloading in your project to speed up class loading.
In order to upgrade a site to use app/src
folder:
- Rename the folder
mysite
toapp
andcode
tosrc
. - Update your
app/_config/mysite.yml
config to the below:
---
Name: myproject
---
SilverStripe\Core\Manifest\ModuleManifest:
project: app
- add psr-4 for your root project files and namespace. An example
composer.json
below shows how this might look:
{
"autoload": {
"psr-4": {
"TractorCow\\MyWebsite\\": "app/src/"
},
"classmap": [
"app/src/Page.php",
"app/src/PageController.php"
]
}
}
- Ensure you flush your site with
?flush=all
Note: In 5.0 the app folder will be fixed to app
and cannot be soft-coded via mysite.yml
Disable session-based stage setting
When viewing a versioned record (usually pages) in "draft" mode, SilverStripe used to record this mode in the session for further requests. This has the advantage of transparently working on XHR and API requests, as well as authenticated users navigating through other views.
These subsequent requests no longer carried an explicit stage
query parameter,
which meant the same URL might show draft or live content depending on your session state.
While most HTTP caching layers deal gracefully with this variation by disabling
any caching when a session cookie is present, there is a small chance
that draft content is exposed to unauthenticated users for the lifetime of the cache.
Due to this potential risk for information leakage,
we have decided to only rely on the stage
query parameter.
If you are consistently using the built-in SiteTree->Link()
and Controller->Link()
methods to get URLs, this change likely won't affect you.
If you are manually concatenating URLs to SilverStripe controllers
rather than through their Link()
methods (in custom PHP or JavaScript),
or have implemented your own Link()
methods on controllers exposing
versioned objects, you'll need to check your business logic.
Alternatively, you can opt-out of this security feature via YAML configuration:
SilverStripe\Versioned\Versioned:
use_session: true
Check our versioning docs for more details.
New Versioned API
The following methods have been added to [api:SilverStripe\Versioned\Versioned] class:
withVersionedMode()
Allows users to execute a closure which may internally modify the current stage, but will guarantee these changes are reverted safely on return. Helpful when temporarily performing a task in another stage or view mode.get_draft_site_secured()
/set_draft_site_secured()
Enables the explicit toggle of draft site security. By setting this to false, you can expose a draft mode to unauthenticated users. ReplacesunsecuredDraftSite
session var.get_default_reading_mode()
/set_default_reading_mode()
The default reading mode is now configurable. Any non-default reading mode must have querystring args to be visible. This will be the mode choosen for requests that do not have these args. Note that the default mode for CMS is now draft, but is live on the frontend.
A new class [api:SilverStripe\Versioned\ReadingMode] has also been added to assist with conversion of the reading mode between:
- Reading mode string
- DataQuery parameters
- Querystring parameters
Link tracking
SiteTreeLinkTracking has been split and refactored into two extensions, and now
no longer applies exclusively to HTMLContent
areas on SiteTree
objects, but now
all DataObject
classes.
SiteTreeLinkTracking
-> Tracks links between any object and SiteTree objects, generated from [sitetree_link] shortcodes in html areas.FileLinkTracking
-> Tracks links between any object and File objects, generated from [image] and [file_link] shortcodes in html areas.
Note that the ImageTracking
property has been deprecated in favour of FileTracking
,
which includes and tracks non-image files as well.
By default HasBrokenFile
and HasBrokenLink
properties are still supported, but
only for SiteTree
objects by default. Non-SiteTree objects will still have
both FileTracking
and LinkTracking
relations available for tracking
linked records.
In addition, File::BackLinkTracking()
and SiteTree::BackLinkTracking()
are now polymorphic,
and may now both contain non-SiteTree objects. Polymorphic many_many through relations are
currently experimentally supported.
User code which relies on SiteTree-only results for these properties will need to be updated to consider other types.
Additionally, the SiteTree_LinkTracking
and SiteTree_ImageTracking
tables no longer exist,
and are replaced by the SiteTreeLink
and FileLink
many_many through joining classes instead.
Code which relies on raw SQL queries to these tables will need to be updated.
SiteTreeFileExtension
is deprecated, and has it's functionality baked directly into File
dataobject.
New upgrader commands
Two new commands have been added to the SilverStripe upgrader tool: environment
and reorganise
.
environment
allows you to convert your _ss_environment.php
file to an equivalent .env
file when migrating a SilverStripe 3 project to SilverStripe 4.
reorganise
renames your mysite
and mysite/code
folders to app
and app/src
. It also warns you of any occurence of mysite
in your codebase.
cd ~/my-project-root
upgrade-code environment --write
upgrade-code reorganise --write
New GridField Action Menu
A new GridField_ActionMenu
is included by default in GridFields configured with GridFieldConfig_RecordEditor
or GridFieldConfig_RelationEditor
.
In addition to this GridFieldDeleteAction
and GridFieldEditButton
now implement GridField_ActionMenuItem
,
this means that any GridField that uses a config of or based on GridFieldConfig_RecordEditor
or GridFieldConfig_RelationEditor
will have an action menu on each item row with
the 'Delete/Unlink' and 'Edit' actions moved into it.
If you wish to opt out of having this menu and the respective actions moved into it, you can remove the GridField_ActionMenu
component from the config that is passed into your GridField.
// method 1: removing GridField_ActionMenu from a new GridField
$config = GridFieldConfig_RecordEditor::create();
$config->removeComponentsByType(GridField_ActionMenu);
$gridField = new GridField('Teams', 'Teams', $this->Teams(), $config);
// method 2: removing GridField_ActionMenu from an existing GridField
$gridField->getConfig()->removeComponentsByType(GridField_ActionMenu);
Versioned cache segmentation
SilverStripe\Core\Cache\CacheFactory
now maintains separate cache pools for each versioned stage. This prevents developers from caching draft data and then accidentally exposing it on the live stage without potentially required authorisation checks. Unless you rely on caching across stages, you don't need to change your own code for this change to take effect. Note that cache keys will be internally rewritten, causing any existing cache items to become invalid when this change is deployed.
// Before:
$cache = Injector::inst()->get(CacheInterface::class . '.myapp');
Versioned::set_stage(Versioned::DRAFT);
$cache->set('my_key', 'Some draft content. Not for public viewing yet.');
Versioned::set_stage(Versioned::LIVE);
$cache->get('my_key'); // 'Some draft content. Not for public viewing yet'
// After:
$cache = Injector::inst()->get(CacheInterface::class . '.myapp');
Versioned::set_stage(Versioned::DRAFT);
$cache->set('my_key', 'Some draft content. Not for public viewing yet.');
Versioned::set_stage(Versioned::LIVE);
$cache->get('my_key'); // null
Data that is not content sensitive can be cached across stages by simply opting out of the segmented cache with the disable-container
argument.
SilverStripe\Core\Injector\Injector:
Psr\SimpleCache\CacheInterface.myapp:
factory: SilverStripe\Core\Cache\CacheFactory
constructor:
namespace: "MyInsensitiveData"
disable-container: true
HTTP Cache Header changes
Overview
In order to support developers in making safe choices around HTTP caching,
we're using a HTTPCacheControlMiddleware
class to control if a response
should be considered public or private. This is an abstraction on the
HTTPResponse->addHeader()
lowlevel API.
This change introduces smaller but necessary changes to HTTP caching headers sent by SilverStripe. If you are relying on HTTP caching in your implementation, or use modules such as silverstripe/controllerpolicy, please review the implications of these changes below.
In short, these APIs make it easier to express your caching preferences without running the risk of overriding essential core safety measures. Most commonly, these APIs will prevent HTTP caching of draft content.
It will also prevent caching of content generated with an active session, since the system can't tell whether session data was used to vary the output. In this case, it's up to the developer to opt-in to caching, after ensuring that certain execution paths are safe despite of using sessions.
The system behaviour does not guard against accidentally caching "private" content, since there are too many variations under which output could be considered private (e.g. a custom "approval" flag on a comment object). It is up to the developer to ensure caching is used appropriately there.
By default, SilverStripe sends headers which signal to HTTP caches that the response should be considered not cacheable.
See Developer Guide: Performance > HTTP Cache Headers for details on the new API.
Disabling legacy cache headers
In order to forcibly disable all deprecated HTTP APIs you can set the below config:
SilverStripe\Control\HTTP:
ignoreDeprecatedCaching: true
This will ensure that any code paths that use the old API will not interefere with upgraded code that interferes with the new behaviour.
Example Usage
Global opt-in for page content
Enable caching for all page content (through PageController
).
<?php
-use SilverStripe\Control\HTTP;
+use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\CMS\Controllers\ContentController;
class PageController extends ContentController
{
public function init()
{
- HTTP::set_cache_age(60);
+ HTTPCacheControlMiddleware::singleton()
+ ->enableCache()
+ ->setMaxAge(60); // 1 minute
parent::init();
}
}
Note: SilverStripe will still override this preference when a session is active, a CSRF token token is present, or draft content has been requested.
Opt-out for a particular controller action
If a controller output relies on session data, cookies,
permission checks or other triggers for conditional output,
you can disable caching either on a controller level
(through init()
) or for a particular action.
<?php
-use SilverStripe\Control\HTTP;
+use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\CMS\Controllers\ContentController;
class PageController extends ContentController
{
public function myprivateaction($request)
{
- HTTP::set_cache_age(0);
+ HTTPCacheControlMiddleware::singleton()
+ ->disableCache();
return $this->myPrivateResponse();
}
}
Note: SilverStripe will still override this preference when a session is active, a CSRF token token is present, or draft content has been requested.
Global opt-in, ignoring session (advanced)
This can be helpful in situations where forms are embedded on the website. SilverStripe will still override this preference when draft content has been requested. CAUTION: This mode relies on a developer examining each execution path to ensure that no session data is used to vary output.
Use case: By default, forms include a CSRF token which starts a session with a value that's unique to the visitor, which makes the output uncacheable. But any subsequent requests by this visitor will also carry a session, leading to uncacheable output for this visitor. This is the case even if the output does not contain any forms, and does not vary for this particular visitor.
<?php
-use SilverStripe\Control\HTTP;
+use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\CMS\Controllers\ContentController;
class PageController extends ContentController
{
public function init()
{
- HTTP::set_cache_age(60);
+ HTTPCacheControlMiddleware::singleton()
+ ->enableCache($force=true) // DANGER ZONE
+ ->setMaxAge(60); // 1 minute
parent::init();
}
}
Detailed Cache-Control Changes
- Added
Cache-Control: no-store
header to default responses, to prevent intermediary HTTP proxies (e.g. CDNs) from caching unless developers opt-in - Removed
Cache-Control: no-transform
header from default responses - Removed
Vary: Cookie
as an unreliable cache buster, rely on the existingCache-Control: no-store
defaults instead - Removed
Vary: Accept
, since it's very uncommon to vary content on theAccept
headers submitted through the request, and it can significantly decrease the likelyhood of a cache hit. Note this is different fromVary: Accept-Encoding
, which is important for compression (e.g. gzip), and usually added by other layers such as Apache's mod_gzip. - Removed
Vary: X-Requested-With
since it's only applicable when varying content based on the client context, mostly for returning different XHR responses as determined throughDirector::is_ajax()
. - No longer sets
Last-Modified
date in HTTP response headers inDataObject::__construct()
. UsesETag
calculation based on response body which is more accurate, and resilient against partial and object caching which can produce staleLast-Modified
values. - Deprecated
HTTP::add_cache_headers()
. Headers are added automatically byHTTPCacheControlMiddleware
instead. - Deprecated
HTTP::set_cache_age()
. UseHTTPCacheControlMiddleware::singleton()->setMaxAge($age)
- Deprecated
HTTP.cache_ajax_requests
. UseHTTPCacheControlMiddleware::disableCache()
instead - Deprecated
HTTP.modification_date
. Handled byHTTPCacheControlMiddleware
- Deprecated
HTTP.disable_http_cache
. UseHTTPCacheControlMiddleware.defaultState
anddefaultForcingLevel
instead - Deprecated
HTTP::register_modification_date()
. UseHTTPCacheControlMiddleware::registerModificationDate()
instead - Deprecated
HTTP::register_modification_timestamp()
. UseHTTPCacheControlMiddleware::registerModificationDate()
instead - Deprecated
HTTP::register_etag()
. UseHTTPCacheControlMiddleware::ETagMiddleware()
instead
Change Log
Security
- 2018-04-23 d42bd6e File.allowed_extensions can have values removed via YAML configuration (Robbie Averill) - See ss-2018-014
- 2018-04-23 30e2d9c Allow forced redirects to HTTPS for responses with basic authentication (Robbie Averill) - See ss-2018-009
- 2018-04-10 0b7e665 Enable oembed to be disabled serverside (Damian Mooyman) - See ss-2018-003
- 2018-04-10 7c2886d Update docs for oembed (Damian Mooyman) - See ss-2018-003
- 2018-04-09 326b1ff Implement stronger oembed white/blacklist (Damian Mooyman) - See ss-2018-002
API Changes
- 2018-06-15 53dded8 Remove @internal from new 4.2 methods (Damian Mooyman)
- 2018-06-12 ec956a6 Moving tests to use transactions (Daniel Hensby)
- 2018-04-16 b1e8db1 Implement rollbackRecursive() / rollbackSingle() (Damian Mooyman)
- 2018-04-16 c8b3593 Form::makeReadonly() returns self (Damian Mooyman)
- 2018-04-06 6c616f5 Implement polymorphic sitetree link tracking (#2123) (Damian Mooyman)
- 2018-03-22 7351caf Allow non-DataExtension Extensions to decorate dataobject (Damian Mooyman)
- 2018-03-21 257ff69 Implement many_many through polymorphic (from only) (#7928) (Damian Mooyman)
- 2018-03-21 32dcc4d add withVersionedMode() to safely isolate reading mode modifications (Damian Mooyman)
- 2018-03-20 87afe84 Customise type names and operation names (#143) (Aaron Carlino)
- 2018-03-05 3a1c813 Add getContentCSS() / setContentCSS() to allow per-config customisation of content_css (Damian Mooyman)
- 2018-02-21 ced2ba1 Move CSV writing/reading to league/csv library (Daniel Hensby)
- 2018-02-07 860fa2a Add excludeAny() and tests for complicated excludes/filters (#7838) (Andrew Aitken-Fincham)
Features and Enhancements
- 2018-06-18 95bcac7 Ensure test DB is flushed on either DDL or transaction-disabled tests (Damian Mooyman)
- 2018-06-13 a88257e Add version to HTTPRequest and create raw string representation (Daniel Hensby)
- 2018-05-21 865ebb3 Improve upgrading experience. (#8025) (Damian Mooyman)
- 2018-05-20 1d34d19 Make FormAlert injectable (Robbie Averill)
- 2018-05-17 e3237f9 Add revert mutation and refactor injector transformations (#2158) (Robbie Averill)
- 2018-05-17 8ffa9dd Make Preview component injectable (#505) (Robbie Averill)
- 2018-05-11 1a57c7c Add getJoinTable to MMTL (Daniel Hensby)
- 2018-05-02 660e8bd static caching of schema types, as well as dynamic endpoint (Aaron Carlino)
- 2018-05-01 aae318e Register fieldHolder HOCs with injector (Dylan Wagstaff)
- 2018-04-27 e0b4d50 Add Loading indicator component, implement into FormBuilderLoader (#490) (Robbie Averill)
- 2018-04-26 0494be7 Ensure that popover has correct container assigned (Damian Mooyman)
- 2018-04-23 1b24bf6 Consolidate type / operation name generation (#151) (Damian Mooyman)
- 2018-04-23 f50438e Ensure that default caches are segmented based on versioned state (Damian Mooyman)
- 2018-04-19 7c3980a Refactor for more consistent use of union and inheritance types (#150) (Aaron Carlino)
- 2018-04-11 4ddee82 Allow Preview class names to be overridden, and add i18n to messages (Robbie Averill)
- 2018-04-11 c4f8af5 Add AbsoluteLink to history viewer page GraphQL query (#2142) (Robbie Averill)
- 2018-04-10 0fa15f4 Ensure invalid stage values are throws as exceptions (Damian Mooyman)
- 2018-04-09 19e45a9 Open modal default upload folder (#763) (Maxime Rainville)
- 2018-04-04 2c266c2 Allow cleanupVersionedOrphans to be disabled (Damian Mooyman)
- 2018-04-03 47bcac9 Add config var to skip confirm logout (#7977) (Andrew Aitken-Fincham)
- 2018-04-02 14af3b8 Add --inverted modifier for Badge component with pattern library examples (Robbie Averill)
- 2018-03-21 d88415b Decorate TestSession with stage params (Damian Mooyman)
- 2018-03-21 26402f3 Enable request handlers to be extended (Damian Mooyman)
- 2018-03-21 9a6d18a Set default reading mode in admin (disables stage=Stage rewrite links) (Damian Mooyman)
- 2018-03-14 f51ea4d use scss variable than hard-coded color (#460) (Chris Joe)
- 2018-03-12 8294ab3 Allow badge-pill class to be modified in Badge component (Robbie Averill)
- 2018-03-12 79db975 add status badge to uploadfield item (Christopher Joe)
- 2018-03-12 c92e5fe Ensure that publishSingle() updates local version (Damian Mooyman)
- 2018-03-08 5db03d0 Add isLiveVersion and isLatestDraftVersion to Versioned and GraphQL DataObject scaffolding (Robbie Averill)
- 2018-03-05 1a82f03 Add page GraphQL query HOC for history viewer component (Robbie Averill)
- 2018-03-05 083308f Update table border colour to lighter grey (Robbie Averill)
- 2018-02-28 4d424dd get_by_id: alternate signature to allow MyDataObject::get_by_id($id) (Damian Mooyman)
- 2018-02-28 5735bee Upgrade to Bootstrap 4.0.0-stable and change to reactstrap 5.0.0-beta (#2101) (Luke Edwards)
- 2018-02-28 62eb29e Upgrade to Bootstrap 4.0.0-stable and change to reactstrap 5.0.0-beta (#88) (Luke Edwards)
- 2018-02-27 f181ba3 Upgrade to Bootstrap 4.0.0-stable and change to reactstrap 5.0.0-beta (#737) (Luke Edwards)
- 2018-02-27 8094c26 Decouple preview from campaign admin (Damian Mooyman)
- 2018-02-27 5825958 Upgrade to Bootstrap 4.0.0-stable and change to reactstrap 5.0.0-beta (#441) (Luke Edwards)
- 2018-02-27 9474deb Add bulk insert feature for UploadField (Christopher Joe)
- 2018-02-26 85dae1b Add warning when unpublishing owned files (#739) (Aaron Carlino)
- 2018-02-26 c4e705a removed max width for content in intro screen (Christopher Joe)
- 2018-02-25 1202807 Add warning for unpublishing owned records #444 (Aaron Carlino)
- 2018-02-25 fe9f729 Add warning when unpublishing owned records (#122) (Aaron Carlino)
- 2018-02-17 a214368 Add record count to dev/build output. (Sam Minnee)
- 2018-02-15 de0b76d Fall back to SSViewer::get_themes when using themeResourceLoaders (Andrew Aitken-Fincham)
- 2018-02-12 00ff3ba Make dropdownFieldThreshold configurable on DBForeignKey (#7789) (Andrew Aitken-Fincham)
- 2018-02-09 0151449 remove File extension for backlink tracking in favour of UsedOnTable form field (Christopher Joe)
- 2018-02-08 5f0a7cc add a Usage tab showing owners of files (Christopher Joe)
- 2018-02-08 c370e3c Add a used-on table component for recorded ownerships (Christopher Joe)
- 2018-02-07 dd82820 Allow GridFieldConfig::addComponents to accept an array (#7844) (Robbie Averill)
- 2018-02-07 b084fe8 Convert page history notice to use Bootstrap 4 info alert (Robbie Averill)
- 2017-11-30 9103816 Add php 7.2 support (Daniel Hensby)
- 2017-09-26 2c121e8 approach (Daniel Hensby)
Bugfixes
- 2018-07-20 78adff9 Build Static error page from live URL (Maxime Rainville)
- 2018-07-18 74b655d tests on unset session data (Ingo Schommer)
- 2018-07-18 76ac846 Lazy session state (fixes #8267) (Ingo Schommer)
- 2018-07-14 e37b3b9 updateValidatePassword calls need to be masked from backtraces (Daniel Hensby)
- 2018-07-05 cebed77 If theres a max-age set remove no-cache and no-store (Daniel Hensby)
- 2018-07-05 2b1c55b Allow setNoCache(false) to remove no-cache directive (Daniel Hensby)
- 2018-07-05 842b39e Add must-revalidate to default state so its common on all our core states (Daniel Hensby)
- 2018-07-05 997730a Allow cache control changes to affect default state (Daniel Hensby)
- 2018-07-04 bde3121 Remove X-Requested-With from default Vary header (Sam Minnee)
- 2018-06-26 6e1c7c2 remove personal information from password reset confirmation screen (Daniel Hensby)
- 2018-06-21 793aafa Transaction depth should error if not implemented by child classes (Daniel Hensby)
- 2018-06-18 c77042a linting. (Maxime Rainville)
- 2018-06-18 b78a89a Default cache state should be
no-cache
(Daniel Hensby) - 2018-06-18 225e61d FIx manual resetDBSchema() calls breaking the database (Damian Mooyman)
- 2018-06-18 11e0a3d Ensure that build includes extra classes (Damian Mooyman)
- 2018-06-15 3fa2c05 Don't reload form session data using FormField::setSubmittedValue (#8056) (Maxime Rainville)
- 2018-06-15 74ef975 mark legacy migration test as skipped temporarily (Damian Mooyman)
- 2018-06-15 e70e46e Fix missing .graphql file category (Damian Mooyman)
- 2018-06-15 8f7893f Fix unit tests for 4.2 core regressions (Damian Mooyman)
- 2018-06-14 d52c4dd Make regression in #7839 safer (Damian Mooyman)
- 2018-06-14 acc8d48 SapphireTest can load relative fixtures in subfolders, switch "needs db" priority check order (Robbie Averill)
- 2018-06-13 9274692 core tests (Damian Mooyman)
- 2018-06-13 59ba208 HTTPTest (Damian Mooyman)
- 2018-06-13 6f32762 unit tests (Damian Mooyman)
- 2018-06-13 aa1ba0e inverted condition (Damian Mooyman)
- 2018-06-12 befd81d Bug with forms being cached (Daniel Hensby)
- 2018-06-12 7c87591 make sure we create ETags from the body, not the request (Daniel Hensby)
- 2018-06-10 d842225 Codesniffer style violations with comments (Robbie Averill)
- 2018-06-09 4e6f45c updateCMSFields example (Juan Molina)
- 2018-06-06 31ad3cd Allow buttons to opt out of display (#8113) (Aaron Carlino)
- 2018-06-05 bf07ba3 Make error messages available to extensions (Jonathon Menz)
- 2018-06-01 a9e2af6 Remove incorrect classmap for Page and PageController (Robbie Averill)
- 2018-05-31 4b3e76a missing braces (Aaron Carlino)
- 2018-05-30 d1af098 linting (Aaron Carlino)
- 2018-05-16 396ac65 es per flameohr (Aaron Carlino)
- 2018-05-15 11c85c6 Infinite render loop due to unchecked setState, incorrect binding of handleDrop() (Aaron Carlino)
- 2018-05-10 e22d1ec behat test (Aaron Carlino)
- 2018-05-10 1993454 broken delete close editor (Aaron Carlino)
- 2018-05-10 553ab92 checkbox select behat step (Aaron Carlino)
- 2018-04-30 abb1011 Expose Badge in injector registrations (Robbie Averill)
- 2018-04-30 1d3e838 phpdoc for relation method (namespace) (JorisDebonnet)
- 2018-04-20 3f5c3ec Fix graphql regressions (Damian Mooyman)
- 2018-04-19 9727052 Ensure that nested rollbacks don't reset root version (Damian Mooyman)
- 2018-04-18 4585b0b a broken link to the versioning page. (Maxime Rainville)
- 2018-04-18 a71b821 behat test (Damian Mooyman)
- 2018-04-17 57b006c Re-implement flexbox classes for preview window (Robbie Averill)
- 2018-04-16 0d40b54 FIx rollback button from not working (Damian Mooyman)
- 2018-04-16 02d7989 Ensure FormBuilder loading indicator has a minimum height of the image (Robbie Averill)
- 2018-04-14 dfa0915 Make 'id' a required prop (Raissa North)
- 2018-04-12 d21e03d branch alias (Damian Mooyman)
- 2018-04-11 51173a7 Fixture the 'app' dir instead of mysite in unit tests (Robbie Averill)
- 2018-04-11 5da708d Fixture the 'app' dir instead of mysite in unit tests (Robbie Averill)
- 2018-04-11 1041b65 Add loading indicator for FormBuilderLoader (#481) (Luke Edwards)
- 2018-04-10 80e0f4d File modified indicator missing and draft indicator incorrect style (Luke Edwards)
- 2018-04-09 79e4f9c Don't add redundant href="#" to tabs (Damian Mooyman)
- 2018-04-09 f569785 gridfield style issues with negative margins (#474) (Luke Edwards)
- 2018-04-06 be8287f Prevent failover / extensions interfering with composite field properties (#7988) (Damian Mooyman)
- 2018-04-05 e15a5af Fix gridfield being cut off on sides (Luke Edwards)
- 2018-04-04 85f4e65 Ensure extra fields have correct casting (Damian Mooyman)
- 2018-04-04 b127422 linting (Aaron Carlino)
- 2018-04-04 50ad0ad Fix double popup for unpublish and incorrect confirm (#758) (Damian Mooyman)
- 2018-03-29 ccbbcd4 Fixed bug in config merging priorities so that config values set by extensions are now least important instead of most important (Daniel Hensby)
- 2018-03-28 878dc1f Change inverse polymorphic inference to silent-empty instead of explicit error (Damian Mooyman)
- 2018-03-27 484e0a7 Ensure polymorphic ownership works (Damian Mooyman)
- 2018-03-27 9cb974c several mistakes in example code (Aaron Carlino)
- 2018-03-27 ec37e67 Don't crash on polymorphic ownership (Damian Mooyman)
- 2018-03-27 e35971b revert to live (Damian Mooyman)
- 2018-03-22 436d473 Fix regression in canViewVersioned (Damian Mooyman)
- 2018-03-21 ba94e02 FunctionalTest not setting persistent versioned mode (Damian Mooyman)
- 2018-03-20 e277f19 merge regressions (Damian Mooyman)
- 2018-03-15 8568259 id for scaffolded objects (Christopher Joe)
- 2018-03-15 b2e2a6b bugs with execution (Christopher Joe)
- 2018-03-15 61ce477 ing HTMLEditorField API documentation (3Dgoo)
- 2018-03-14 23af7ea Ensure consistent strict equality checks in version numbers (Robbie Averill)
- 2018-03-14 97f22cb ing FormAction API documentation (3Dgoo)
- 2018-03-13 b06bcc2 Fix regressions from testing cms unit tests (Damian Mooyman)
- 2018-03-13 e3e5edb "container" logic for FormBuilder and PopoverField, improves accessibility (#459) (Chris Joe)
- 2018-03-11 6f18e35 sorting issue with versioned test (Damian Mooyman)
- 2018-03-09 9bed12b Fix issue in latest_version (Damian Mooyman)
- 2018-03-08 2e43291 Fix archive date erroring if stage omitted (Damian Mooyman)
- 2018-03-08 3e698c1 remaining tests (Damian Mooyman)
- 2018-03-08 be0b274 testDeleteNestedOwnedWithoutRepublishingOwner (Damian Mooyman)
- 2018-03-08 0be2a9d Fix WasDraft not being written (Damian Mooyman)
- 2018-03-08 35cff90 missing date for deleted _Versioned rows (Damian Mooyman)
- 2018-03-08 3454600 archive / unpublish / delete creating deleted row (Damian Mooyman)
- 2018-03-08 e839d10 responsive modals (#744) (Chris Joe)
- 2018-03-08 38fbb92 responsive modals (#457) (Chris Joe)
- 2018-03-07 ff78a3b up testDeleteOwnedWithoutRepublishingOwner (Damian Mooyman)
- 2018-03-07 640c8f7 postgres issue (Damian Mooyman)
- 2018-03-06 4f8a10d invalid joins (Damian Mooyman)
- 2018-03-06 75168cf multi-select shouldn't show insert button on form (Christopher Joe)
- 2018-03-06 67fa8e9 aligns Form actions container with the rest of the "bottom bars" (Christopher Joe)
- 2018-03-06 36b6b30 up progress indicators (Damian Mooyman)
- 2018-03-05 c209aff Consolidate queued and read files for Gallery (Christopher Joe)
- 2018-03-01 49a3970 Resolve Published version field to Versioned_Version::Published() correctly (#125) (Robbie Averill)
- 2018-03-01 6523d7a ing HTMLEditorField API documentation (3Dgoo)
- 2018-03-01 c96b6dc aesthetic annoyance where deselect+select code will make the bulk actions animate unnecessarily (Christopher Joe)
- 2018-03-01 222eec8 Add missing published state filter (Robbie Averill)
- 2018-02-27 c755f77 indentation (Aaron Carlino)
- 2018-02-27 6274ccc behat failure (Aaron Carlino)
- 2018-02-27 7677c68 Remove max-width from form-fields and items (#446) (Chris Joe)
- 2018-02-27 efe5c0f fileSchema abolishing actions from previous props (Christopher Joe)
- 2018-02-21 0647dee travis (Daniel Hensby)
- 2018-02-14 d019f88 php field to fallback to the form's record and added logic to handle no record available (or not saved) (Christopher Joe)
- 2018-02-13 42fd4d6 Fix display logic for password fields (Damian Mooyman)
- 2018-02-12 6570599 Fix incorrect display logic on password field (Damian Mooyman)
- 2018-02-07 b5f68eb warning appearing when button is disabled for rollback (Christopher Joe)
- 2018-02-07 1983200 Fix installer checking wrong location for files (Damian Mooyman)
- 2018-02-02 1d17f40 travis builds (Christopher Joe)
- 2017-12-01 74a3ba5 count size of $relations (Daniel Hensby)