Webinar

System Requirements

Suggested

NameVersion
Node16
NPM7
Postgres14
Elasticsearch7
Redis6
Livingdocs Server Docker Imagelivingdocs/server-base:16
Livingdocs Editor Docker Imagelivingdocs/editor-base:16
Browser SupportEdge >= 80, Firefox >= 74, Chrome >= 80, Safari >= 13.1, iOS Safari >= 13.4, Opera >= 67

Minimal

NameVersion
Node14
NPM7
Postgres11 (Deprecated Postgres 11)
Elasticsearch6.x (Deprecated)
Redis5
Livingdocs Server Docker Imagelivingdocs/server-base:14.3
Livingdocs Editor Docker Imagelivingdocs/editor-base:14.3
Browser SupportEdge >= 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.

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 to false 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:

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:

Document Inbox Extensions

Media Library Entries can now sent to a document inbox and put into a document via drag + drop.

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.

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 from liServer.db.connection. Please use liServer.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 in registerPublicationHooks and registerPublicationServerHooks
  • 🎁 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 returns undefined (return value before was channel-config-v1)
  • 🔥 channelApi.transformToConfigurableChannel returns undefined (return value before was channel-config-v1)
  • 🔥 channelApi.createConfigurableChannel returns channel with channel.configV2instead of channel.config (channel-config-v1) - see below
  • 🔥 remove channelApi.deleteChannel (no replacement for this function)
  • 🔥 remove channelApi.getChannelConfigByConfigHandleSync (channelConfig v1) - use channelConfigApi.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) - use channelConfigApi.read.getFullConfig (channelConfig v2) instead

documentAPI

  • 🔥 documentApi.setHomepage returns undefined (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:

  • 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 a dataProvider 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 🎁

Revoke Asset via Public API

Other Changes

Design

Features

Improvements

Bugfixes

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 use release-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: 🔧