Caveat π₯
These are the release notes of the upcoming release (pull requests merged to master).
- βΉοΈ this document is updated automatically by a bot (pr’s to categorize section)
- βΉοΈ this document will be roughly updated manually once a week (put PRs + description to the right section)
- π₯ We don’t guarantee stable APIs. They can still change until the official release
- π₯ Integration against the upcoming release (currently
master
branch) is at your own risk
Attention: If you skipped one or more releases, please also check the release-notes of the skipped ones.
Webinar
- Feature Webinar Recording: TODO
- Feature Webinar Documentation: TODO
- Dev Webinar Recording: TODO
- Dev Webinar Slides: TODO
- Release Newsletter Subscription: TODO
System Requirements
Suggested
Name | Version |
---|---|
Node | 16 |
NPM | 7 |
Postgres | 14 |
Elasticsearch | 7 |
Redis | 6 |
Livingdocs Server Docker Image | livingdocs/server-base:16 |
Livingdocs Editor Docker Image | livingdocs/editor-base:16 |
Browser Support | Edge >= 80, Firefox >= 74, Chrome >= 80, Safari >= 13.1, iOS Safari >= 13.4, Opera >= 67 |
Minimal
Name | Version |
---|---|
Node | 14 |
NPM | 7 |
Postgres | 11 (Deprecated Postgres 11) |
Elasticsearch | 6.x (Deprecated) |
Redis | 5 |
Livingdocs Server Docker Image | livingdocs/server-base:14.3 |
Livingdocs Editor Docker Image | livingdocs/editor-base:14.3 |
Browser Support | Edge >= 80, Firefox >= 74, Chrome >= 80, Safari >= 13.1, iOS Safari >= 13.4, Opera >= 67 |
Highlights
Publish Control
TODO@beni: Description
- Documentation TODO
- Basic Document History
- Scheduled Unpublish
- Document Inbox Assignment
- Homepage
- Design Improvements
- Sidepanel: Show Tasks if any running
Table Dashboards
Table dashboards are a new flexible type of dashboards where individual columns can be configured.
The following functionality has been added in this release:
- Document creation from a table dashboard
- Show publish state and allow quick publish under certain conditions
- Display and inline editing for
li-string-list
metadata properties - First step towards using table dashboard as default for articles, pages, and data records
- There are reasonable defaults for filters and dashboard columns depending on document type
- Can be enabled, by setting
documents.useLegacyDashboards
tofalse
in the editor config - Not enabled by default yet because some features are still missing and will be added in the next release (see below)
The following functionality has been added in release-2021-03:
- Basic configuration of table dashboards (main menu entry, filters, column layout)
- Display and inline editing for these metadata properties:
li-text
,li-boolean
,li-category
,li-document-reference
- Default column component that displays document thumbnail and title
- Custom components can be configured to render the content of a table cell
Still missing features for fully replacing legacy dashboards that will be added in the next release:
- Search tooltip for document id matches
- Document drag & drop
References:
- Documentation
- Default Table Dashboards PR
- Table Dashboard in document selection dialog PR
- Load documents from postgres by default PR
- Allow for main cell configuration PR
- Add support for li-string-list PR
- Publish state and quick publish PR
Desknet Integration
The Desk-Net integration has been extended to provide a preview of scheduled stories within a side panel in the Livingdocs editor. At the moment the side panel is for information only. A user can change the date to see the scheduled articles in the configured platforms or categories. However, the ability to create teasers by dragging articles from the side panel will be added soon.
References:
- Documentation
- Server PR
- Editor PR: Desk-Net Schedule Side Panel
- Editor PR: Metadata Plugin li-desknet-platforms
Document Inbox Extensions
Media Library Entries can now sent to a document inbox and put into a document via drag + drop.
- References
Breaking Changes π₯
Remove callbacks for Server Hooks π₯
All callback-based server hooks have been removed (throw an error on registration). Please visit the server hooks documentation to find examples of how to implement server hooks based on a promise.
Publish Hooks
- π₯ remove
preparePublishHook
/preparePublishHookCb
(throw err on registration) - π₯ remove
postPublishHook
/postPublishHookCb
(throw err on registration) - π₯ remove
unpublishHook
/unpublishHookCb
(throw err on registration)
List Hooks
- π₯ remove
listUpdateHook
/listUpdateHookCb
(throw err on registration) - π₯ remove support for ‘getExternalList’ of server hook ‘registerListHooks’ (throws err on registration) // fyi: has no effect since 1 year
Render Hooks
- π₯ remove
beforeRenderHook
/beforeRenderCb
(throw err on registration) - π₯ remove callback for
registerRenderHooks
(throws err on registration)
Metadata Plugins: Add configSchema and uiSchema Validation π₯
We added 2 properties configSchema
and uiSchema
to a metadata plugin where one can define a schema validation. If you want to know more about the motivation and a fallback (metadataPluginsToIgnoreForConfigValidation
), you get some insights here.
- π₯ Add strict validation for
li-enum
- π₯ Add strict validation for
li-text
- π₯ Add strict validation for
li-reference
- π₯ Add strict validation for
li-document-reference
References:
Remove Knex Support π₯
π₯ Remove
knex
client fromliServer.db.connection
. Please useliServer.db.sql
if you really need to write db queries. For customers using our migration cli with a custom migrations path:livingdocs-server migrate up --path=./custom/migrations
:π₯ Drop knex and
Migration
class support in the migration library. Please write the migrations using sql or use a function:module.exports = { up: ` SELECT version(); ` }
module.exports = { async up ({db, trx}) { // do regular queries and execute them in the transaction await db.sql`SELECT version()`.transacting(trx) // or use `trx.sql` to do the same await trx.sql`SELECT version()` } }
References:
Remove unpublishHook / add postUnpublishHook π₯
- π₯ Remove the
unpublishHook
inregisterPublicationHooks
andregisterPublicationServerHooks
- π Introduce the
postUnpublishHook
Please migrate your unpublishHookAsync
hooks to postUnpublishHookAsync
. The new hook is now executed outside transactions.
const documentsApi = liServer.features.api('li-documents')
documentsApi.registerPublicationHooks({
projectHandle: 'my-project',
channelHandle: 'web',
- async unpublishHookAsync ({documentVersion}) {
-
- }
+ async postUnpublishHookAsync ({documentVersion}) {
+
+ }
})
References:
Remove Channel Config v1 (Project Config) π₯
project config v1 (channel config v1) π₯
βββπ₯π₯π₯ remove any support of project config v1. All your project configs must use the project config v2 format
channelApi
- π₯
channelApi.setHomepage
returnsundefined
(return value before was channel-config-v1) - π₯
channelApi.transformToConfigurableChannel
returnsundefined
(return value before was channel-config-v1) - π₯
channelApi.createConfigurableChannel
returnschannel
withchannel.configV2
instead ofchannel.config
(channel-config-v1) - see below - π₯ remove
channelApi.deleteChannel
(no replacement for this function) - π₯ remove
channelApi.getChannelConfigByConfigHandleSync
(channelConfig v1) - usechannelConfigApi.read.getFullConfig
(channelConfig v2) instead
Remove channel.config (channel-config v1) property π₯
Before this change when you load a channel e.g. const channel = await channelApi.getDefaultChannel(...)
you had a property channel.config
with a channel-config v1. This property is not available anymore for all the API’s below (If you need the channel config, you can load it via channelConfigApi.read.getFullConfig(...)
.
Affected API’s
- π₯
channelApi.getChannelsByProject
- π₯
channelApi.getDefaultChannel
- π₯
channelApi.createChannel
- π₯
channelApi.getChannelByName
- π₯
channelApi.getChannel
- π₯
channelApi.createConfigurableChannel
channelApi.getContentTypeConfig π₯
π₯ remove channelApi.getContentTypeConfig
// old
const contentTypeConfig = channelApi.getContentTypeConfig(...)
// new
const channelConfigApi = server.features.api('li-channel-configs')
const channelConfig = await channelConfigApi.read.getFullConfig({projectId, channelId})
const contentTypeConfig = channelConfig.contentTypesByHandle[contentType]
channelApi.getAllContentTypeConfigs π₯
π₯ remove channelApi.getAllContentTypeConfigs
// old
const contentTypeConfigs = channelApi.getAllContentTypeConfigs(...)
// new
const channelConfigApi = server.features.api('li-channel-configs')
const channelConfig = await channelConfigApi.read.getFullConfig({projectId, channelId})
const contentTypeConfig = channelConfig.contentTypes
channelApi.getChannelCopyConfigs π₯
π₯ remove channelApi.getChannelCopyConfigs
// old
const contentTypeConfigs = channelApi.getChannelCopyConfigs(...)
// new
const channelConfigApi = server.features.api('li-channel-configs')
const channelConfig = await channelConfigApi.read.getFullConfig({projectId, channelId})
const copyConfigs = channelConfig.settings.copy
channelApi.getChannelConfig π₯
π₯ remove channelApi.getChannelConfig
// old
const contentTypeConfig = channelApi.getChannelConfig(...)
// new
const channelConfigApi = server.features.api('li-channel-configs')
const channelConfig = await channelConfigApi.read.getFullConfig({projectId, channelId})
channelConfigApi
- π₯ remove
channelConfigApi.write.convertConfigVersion
(no replacement) - π₯ remove
channelConfigApi.read.getStaticFormat
(channelConfig v1) - usechannelConfigApi.read.getFullConfig
(channelConfig v2) instead
documentAPI
- π₯
documentApi.setHomepage
returnsundefined
(return value before was channel-config-v1)
livingdocs-server CLI
- π₯ remove task
livingdocs-server parse-channel-config-v1-to-v2
(no replacement)
References:
Remove metadata plugin form fallback ‘useAngularBasedFormRendering’ π₯
π₯ Opt-in to the Angular based form rendering (editor config metadata.useAngularBasedFormRendering
) is not possible anymore.
References:
Remove Q drop handler π₯
The drag and drop handling for the Q toolbox (by NZZ) for Q before March 2017 is removed since it’s not in use anymore.
References:
Link Design Update π₯
CSS classes renamed
.ld-link
is now called.li-link
.li-link
has the definitions assigned that used to be assigned to.li-link.li-link--default
.ld-link--pill
is now called.li-pill
.ld-link--bar
is now called.li-application-menu-item
CSS classes deleted (including the renamed ones)
.ld-link-au-naturel
,.li-link-group
,.li-link-group__item
,.ld-link--default
,.ld-link--remove-hover
,.ld-link--inherit
,.ld-link--green
,.ld-link--red
,.ld-link--bright
,.ld-link--gray
,.ld-link--action
,.ld-link--bar
,.ld-link--pill
,.ld-link--separated-pill
,.ld-link--breadcrumb-pill
,.ld-link--slim
,.ld-link--pre-spacer
,api-client-item__action
Required Actions
You are highly encouraged to update your markup if you should be using any of the deleted or renamed classes. In order to ease that process, there is a file you can @import
in your custom SCSS to get support for the mentioned classes and variables:
In the SCSS file you have configured as CUSTOM_STYLE_PATH_BEFORE
or CUSTOM_STYLE_PATH_AFTER
add this line at the top:
@import "~styles/backwards-compatibiliy/release-2022-05.scss";
This will define the removed classes within your SCSS file tree. Your custom UI will most probably look just fine. From there on you can refactor your code and remove the @import "~styles/backwards-compatibiliy/release-2022-05.scss";
after you are done. We will keep this file around for some time, but it will eventually get removed. If you have any questions about this, don’t hesitate to contact us.
References: Editor PR
Deprecations
Deprecate metadata plugin li-media-language
Deprecate metadata plugin li-media-language
, use li-metadata-translations
instead (same config).
References:
Metadata Services
Metadata Services are deprecated.
- core plugins: Use a
DataSource
or adataProvider
instead. - plugins: Use a
DataSource
,dataProvider
or embed the service logic directly into your Vue component.
// Example
{
handle: 'municipalities',
type: 'municipalities',
ui: {
component: 'liMetaSelectForm',
service: 'municipalities', // <------------------ DEPRECATED
},
config: { /* ... */ }
}
References:
Untitle Document Label π₯
π₯ Remove editorConfig app.untitledDocumentLabel
. There is no replacement for this config. If nothing is set, the title will be automatically set to ‘Untitled’
References:
APIs π
Other Changes
Design
Features
- Metadata:
- Devices on Profile Page
- Render paramsSchema with li-metadata-form-component
- Admins can create empty projects via UI
- Retresco: Add live analysis option
- Filter: Add reference filter support
- Webhooks: Support project-secrets for webhooks config
- Woodwing: Support project-secrets for Woodwing config
Improvements
- Editor
- Server
- Import
- Metadata:
Bugfixes
- Editor
- Drag and Drop: Only cancel drags in the editor that also originated in the editor
- Allow Angular fallback behaviour for metadata component rendering
- Show Subscript icon in text formatting toolbar
- Replace non breaking spaces with normal spaces when pasting on an editable
- Hugo: Add origins to document directive data for uploaded media (image, video)
- Toolbar: Show linked documents in the formatting toolbar even if href is empty
- Cropping: ‘Reset to automatic’ button on image crop feature works when only one crop is configured
- Drag + Drop: Insert component doesn’t select everything (in Safari)
- Add support for video in component directives
- Show active upload button in upload center when EXIF extraction provides new data
- Text Formatting Toolbar
- Server
- Media:
- Handle undefined preview src’s when replacing images
- Use directiveMappings for Hugo upload
- Return hugoPicture in editing API for new and old Media
- Combine baseFilters on search for multiple mediaTypes
- Don’t allow switching between language tabs while metadata is being saved
- Don’t insert image/video component if not allowed from drop
Patches
Here is a list of all patches after the release has been announced.
Livingdocs Server Patches
- v179.3.12: fix(import): use project config design when not passing infos to the import
- v179.3.11: chore: add tests for
findProjects()
- v179.3.10: fix(import): unpublish document by externalId
- v179.3.9: fix(publicApi): allow to pass id/checksum/flags.unpublish only via /api/v1/import/documents
- v179.3.8: fix(project-config): load an old designConfig with correct designVersion for an embedded design
- v179.3.7: fix(channel-config): fix transformToPointer to not throw during property deconstruction
- v179.3.6: fix(metadata): add support for config.hideFromForm in metadata plugins
- v179.3.5: fix: incorporate PR feedback
- v179.3.4: fix(metadata): make plugins compatible with project settings again
- v179.3.3: fix: incorporate PR feeback
- v179.3.2: fix: allow formatting of log levels as strings
- v??.?.?: text
Livingdocs Editor Patches
v80.10.19: fix(main-navigation): Allow loading when user has no project
v80.10.18: fix(softLock): Soft Lock not disabled by entering publish screen
v80.10.17: fix: don’t initialize delivery links on content type initialization
v80.10.16: fix(import): also show unpublished state
v80.10.15: fix(quoteIcons): Grey and blue
v80.10.14: fix(softLock): Now correctly spaced
v80.10.13: chore(desknet): Add platforms metadata tests
v80.10.12: fix(metadata): Use documentType in labels instead of articles
v80.10.11: fix(editing toolbar): move app-menu to the top row for narrow screens
v80.10.10: fix(document): consider future metadata based publication date a schedule only for published documents
v80.10.9: fix(softLock): Button inline
v80.10.8: fix(translation manager): Use correct locale for checking if there is a new asset
v80.10.7: fix: update vue-loader from 15.9.7 to 15.9.8
v80.10.6: fix: move @intlify/vue-i18n-loader from devDependencies to dependencies
v80.10.5: fix(relative time): i18n
v??.?.?: text
Icon Legend
- Breaking changes: π₯
- Feature: π
- Bugfix: πͺ²
- Chore: π§