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

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

TODO@beni: Description

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:

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

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.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: πŸ”§