Folders
With this release, only entities and snippets have folders - templates, javascript, and stylesheets are no longer managed with folders. Furthermore, entities and snippets can only have a single folder - or none at all.
Folders are also now treated as "parents" of entities and snippets. An entity or snippet can only be published while the parent folder is published, and trashing a parent folder will also trash all objects inside that folder - including sub-folders and any objects inside those sub-folders.
This change serves several purposes:
- It alleviates some confusion where we previously treated folders as "labels". Some Marketpath CMS users found the ability to place an object in multiple folders at the same time confusing. The new paradigm is more intuitive and is a better fit with what users are already used to in other systems.
- It allows the system to be more efficient. By making this a simple parent-child relationship there is less overhead involved in managing and maintaining the link between folders and objects.
- Virtually no sites had actually taken advantage of the ability to place an object in multiple folders. It was a userless feature requiring wasted development capital to maintain. This was an example of a feature that sounded good on paper but provided no actual value.
- Now that objects can only have one parent folder, it makes it possible to use folders more effectively for other purposes - such as in defining URLs or specifying advanced permissions. These features are not implemented yet but they may be one day now that this change has been made.
Paths
Templates, javascript, and stylesheets now utilize a "Path" instead of a "Folder". This change serves several purposes:
- Simplified folder management - since folders now only contain two object types they are easier to maintain.
- Separation of concerns - development "paths" and content "folders" are often used in different ways and almost never need to be the same. Separating them entirely keeps both interfaces cleaner and more purpose-specific.
- Management Efficiency - since the "path" is not an object, users can simply type whatever "path" they want. As long as it is a valid format it doesn't matter if it exists or not, or if it is published or not - it is valid and will work on the live site.
- Query speed - since we do not have to look up multiple objects in order to "reconstruct" the path, querying for templates, javascript, and stylesheets by path is faster and more efficient than it was by folder.
- Staging for the future - because the path does not reference an actual object, this change sets us up for future development efforts that will make site development easier. We do not want to say too much about this now, but there are some pretty cool features that will now be easier to build. Keep your eyes peeled for more on this in a future release!
Before this change, these development objects required a unique name. Now they are only required to be unique per path. You want to create a partial template named "settings", but are unsure if someone else has also created a partial template with the same name? Just give it a unique path and carry on coding!
With this new capability also comes new best practices. When developing templates to share with others, you should place your templates under a descriptive path that clearly identifies their source (aka: you).
Also before this change, templates and stylesheets were included by name only (eg: {% include "Template Name" %} or @import "Stylesheet Name";). Now they should be referenced by their relative or absolute path. Any template or stylesheet include that starts with "/" will be treated as an absolute path. All others will be treated as a relate path. You may also traverse up the path using the common "../" convention (eg: if the current template is in "/agency/scheme/pages", including "../../common/pagination" will reference the template at "/agency/common/pagination").
Other Management Features
-
Improved back-end validation for numerous objects - including objects created or updated during import operations
- Improved UX while switching between sites - if the users is viewing a "grid-view-like" dialog before switching, display the same dialog for the new site after switching
- Improved UX when selecting "Manage Site" from Site Details dialog
- Created shortcut to new agency, account, and site dialogs: /m#!/new-agency, /m#!/new-account, /m#!/new-site
- Modified new agency workflow with improved language and additional fields (year founded, total employees, and D-U-N-S Number)
- Updated the "Forgot Password" page to include a message about the reset link expiring in 1 hour
- Dramatically improved performance while querying database for object lists
- Added additional details to invoice payment logs, and improved edge-case handling for certain billing circumstances
- Hide the "Folders" sidebar when browsing folder content directly
- Mildly improved performance of delete, purge, and unpublish operations
- Updated the unpublish workflows for improved objects status accuracy between the CMS and Live environements
- Changed the way we compare aspect ratios to determine if image ratio should be "locked" when opened for editing in CKEditor
- Hide the thumbnail toggle for image lists with more than 10 items
- Minor improvements to how grid-view filters are remembered between dialogs
- Behind-the-scenes process improvements for SSL Certificates
Other Developer Features
- Several live form improvements:
- Improved handling of checkbox lists in form submissions
- Simplified the javascript form configuration and moved some common code to the javascript library instead
- Added a form message container to forms so that if the form submission fails we have a way to display an error message, and if the form submission succeeds but we do not have a redirect URL we have a way to display a success message
- Changed the default submit button text from "Click Me" to "Submit"
- Added a version number to the form javascript file to prevent form issues related to outdated javascript files
- Force checkbox fields to have a value - either true or false - by defaulting the "DefaultValue" to false if not set
- Added filenames to javascript and stylesheets in preview (note: filename will only be present for objects edited after this release)
- Improved error handling when we are unable to include a template - now the full template path + name is displayed
- Removed "Status" filter from custom template and datastore fields, as well as from export and import definitions, since that is not a filter that should be specified during site development
- Allow including and extending templates by variable as well as by name with the {% include %} and {% extends %} tags
Bugfixes
- All regular object filters are now available and respected when defining datastore and template fields
- Fixed "undefined" browser title error when deleting the Internal Name of an entity
- When fetching a page, document, or image fails while displaying a url field, set the type to 'custom' and maintain the original URL value
- Fixed a bug with folders that allowed more than 1 restricted entity type
- You can now add sub-folders to any folder, regardless of whether or not the parent folder has any type restrictions
- When creating datastore items from the datastore items dialog, automatically assign the new item to whatever datastore the parent dialog is filtered by. Also do the same with template, blog, calendar, etc... fields
- Allow site settings to be "unset", even when the site setting has a default value
- Added browse button back to the folders dialog
- Removed ability to read objects from other sites if you know or can guess their GUID
- Fixed bug with creating PDF versions of invoices
- Fixed setting the folder on newly uploaded documents and images from the upload-file dialog
- When a trash, untrash, purge, or delete operation failed (eg: the user clicked a "Cancel" button), the UI would still treat it as if it had succeeded
- Updated dialog title when selecting from "All Content" from "Select a Content" to "Select Content"
- Fixed an issue with exporting items by filter. Also fixed a related uncaught bug with trashing existing items during import
- Do not attempt to auto-publish documents and images that are created in unpublished folders
- Editing form field labels automatically updates the Field Name - preventing the "Field Name is required" error on save
- Fixed styling of select-sitedomain field when the site only has one domain and it is too long for the space available
- Display thumbnails for svg images