Webinar
- Feature Webinar Recording | PW: 4mD&%sFf
- Feature Webinar Documentation
- Dev Webinar Recording | PW: 4EW7.+jh
- Dev Webinar Slides
- Release Newsletter Subscription
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
Livingdocs is introducing a new Publish Flow. We call it «Publish Control» and will combine and standardize all things around publishing, scheduling publications and distribution features (lists, inboxes) in a central place. Since this affecting the key feature of publishing content, the timing of rolling out the new features can be completely controlled by you.
We encourage you to enable the «Publish Control» Feature on your test/staging environments to see, test and understand the new possibilities. Please reach out with any feedback you have. If the existing feature set already covers your requirements, you are encouraged to roll out the change to your newsroom when feasible. We believe the new publish flow is significantly more clear to users.
We will maintain both, the existing «Prepare Publication» as well as the new «Publish Control» flows at least until September 2022 Release. Please reach out to your Customer Solutions manager with feedback and your possible schedule for switching the publish flow. We like to phase out the «Prepare Publication» flow and eventually enforce the «Publish Control» flow.
The following capabilities are part of «Publish Control» with the May Release:
- All the things on the «Prepare Publish» Screen are distributed to either the Publish Control Panel or the new Metadata Screen, both are reachable from the Document Editing Toolbar.
- Immediate publish / unpublish of documents
- Scheduled publish / unpublish of documents
The following capabilities will follow with the July / September Releases:
- Embargo mangement, documents with an embargo defined cannot get published
- marking publications as significant (to show your readers, when an existing article got a significant update)
- management of a date (with user edit possibilities) to show as the publication date to your readers
Consult the Guide on «Publish Control» to learn how to configure this feature.
- Guide
- Basic Document History
- Scheduled Unpublish
- Document Inbox Assignment
- 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:
Metadata Plugins: Better feedback on metadata plugin registration 🔥
🍬 When registering a downstream metadata plugin beginning with li-
you get a warning that you should use your own prefix.
🔥 When registering a metadata plugin twice, you get now an error message (before, the second plugin was ignored, which lead to confusion).
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
postUnpublishHookAsync
- 🎁 Introduce the
preUnpublishHookAsync
Please migrate your unpublishHookAsync
hooks to postUnpublishHookAsync
or preUnpublishHookAsync
. 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:
Removed support for defaultContent in Design Config v1 🔥
🔥 Because we changed interally the approach how to create a new document, we removed support for designV1.defaultContent
and designV1.layouts[].defaultContent
. Please move the declaration of defaultContent
into the Project Config contentType.defaultContent
.
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
- Comyan: Support project-secrets for Comyan 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.42: fix(import): Does not affect ’touched’ documents
- v179.3.41: fix: bump framework to version 23.1.14
- v179.3.40: fix: add checks for
undefined
when getting notification channels - v179.3.39: fix(multiple references): parsing/validation now correct
- v179.3.38: fix(desknet): Don’t display documents from other projects in schedule
- v179.3.36: fix(media-library): Fix media library index to include the id first as we query by
media_type_id, id
, in which case the index can be used - v179.3.35: fix(comyan): use proxy for all requests
- v179.3.34: fix(include services): allow baseFilters and displayFilters in paramsSchema ui.config
- v179.3.33: fix(image-processing): Add format to GIF metadata extraction
- v179.3.32: fix(comyan): fix error log
- v179.3.31: fix(referenceMigration): Supports all list configs
- v179.3.30: fix(print): Use previously hardcoded fields as fallback
- v179.3.29: fix(hugo): Add
assetPath
hugo config - v179.3.28: fix: do not download image when google vision is disabled
- v179.3.27: fix: fix access control hook on document creation
- v179.3.26: refactor: remove unnecessary params spreading
- v179.3.25: fix(cut and paste): Does not affect undo
- v179.3.24: fix(framework): Bumped to 23.1.12
- v179.3.23: chore(comyan): adapt tests
- v179.3.22: fix: still allow to set deprecated metadata property ui.service for li-enum and li-text
- v179.3.21: fix: rename deprecated property schema to storageSchema for li-media-language
- v179.3.20: fix: incorporate feedback
- v179.3.19: fix(print): Expose Desk-Net metadata in print export
- v179.3.18: fix(project-config): replace pointer error message also on a deeper value
- v179.3.17: fix: desknet integration api updates correctly to desk-net
- v179.3.16: fix(document validation): component length validation now working
Livingdocs Editor Patches
- v80.10.80: fix(history): Prevent app from crashing when toggling history
- v80.10.79: fix(media-library): Restore upload center placeholders
- v80.10.78: chore(drone): Add
shrinkwrap
command in downstream test script, remove NZZ since they userelease-2022-07
already - v80.10.77: chore: improve comment
- v80.10.76: fix(metadata): don’t error in any case when metadata properties are updated
- v80.10.75: fix(metadata-mapper): always emit event when updating metadata
- v80.10.74: fix(metadata): show required errors when metadata form is opened from publish panel error
- v80.10.73: chore: pin version for vue and vue-template-compiler
- v80.10.72: fix: don’t trigger click event for disabled buttons
- v80.10.71: fix(dashboards): don’t jump to top of result list on load-more
- v80.10.70: fix(add member): Test fixed
- v80.10.69: fix: remove non breaking space
- v80.10.68: fix(text-formatting): Handle custom formatting attributes as optional
- v80.10.67: fix(char counter): correctly show char counter when deleting a compnent with children
- v80.10.66: fix(component properties): correctly set the configured string value instead of a boolean for option properties
- v80.10.65: fix(publish control): don’t allow publish/publish schedule until draft is saved
- v80.10.64: fix(properties): Update UI on change
- v80.10.63: fix(dashboards): show the correct content type selection on custom dashboards
- v80.10.62: fix(metadata): Avoid metadata reset while collaborative editing
- v80.10.61: fix(dashboards): ensure create button without when contentType filters are defined, also for custom dashboards
- v80.10.60: fix(includes): ensure selected values are visible in paramsSchema form by updating the local params state
- v80.10.59: fix: option component properties with string value
- v80.10.58: fix(deps): update dependency moment from 2.29.3 to 2.29.4 [security]
- v80.10.57: fix(MetadataForm closes): With faulty component link
- v80.10.56: fix(scroll in readonly): Fixed for metadata screen
- v80.10.55: fix(dashboards): query and filter caches are not shared anymore between different unrelated document selection dialogs
- v80.10.54: fix: only update remotely changed metadata properties
- v80.10.53: fix(hugo): Use configured hugo assetPath
- v80.10.52: fix(liDateRangeFilter): documentPropertyName config supported
- v80.10.51: fix(cacheIdentifier): now defined
- v80.10.50: fix(editor): improve UI behavior when toggling sidepanels
- v80.10.49: fix(cut and paste): Does not affect undo
- v80.10.48: fix(framework): Bumped to 23.1.12
- v80.10.47: fix(metadata): ensure the UI updates after an async selection service return
- v80.10.46: fix(metadata): ensure the UI updates after an async selection service returns
- v80.10.45: chore(comyan): easier access control
- v80.10.44: fix: improve reactivity for live changes by other users
- v80.10.43: fix(dashboards): show create document on table dashboards
- v80.10.42: fix(allow no multiselection): behaviour for multiselect configurable
- v80.10.41: fix(dependencies): update vulnerable version of karma
- v80.10.40: fix(isPublished): Pre publish control metadata plugins have correct published state
- v80.10.39: fix(deletedComments): Only resolved threads removed with component
- v80.10.38: fix(comments): Comments without components no longer break
- v80.10.37: fix(softLock): Soft lock object can be empty
- v80.10.36: fix(noComments): Allow component deletion without comments
Icon Legend
- Breaking changes: 🔥
- Feature: 🎁
- Bugfix: 🪲
- Chore: 🔧