Current
Maintained
release-2022-11
November 2022 Release

Attention: If you skipped one or more releases, please also check the release-notes of the skipped ones.

Webinar

System Requirements

Suggested

Name Version
Node 18
NPM 8
Postgres 15
Elasticsearch
OpenSearch
8.x
v2.3.0
Redis 7
Livingdocs Server Docker Image livingdocs/server-base:18
Livingdocs Editor Docker Image livingdocs/editor-base:18
Browser Support Edge >= 80, Firefox >= 74, Chrome >= 80, Safari >= 13.1, iOS Safari >= 13.4, Opera >= 67

Minimal

Name Version
Node 14.17.0
NPM 7
Postgres 12
Elasticsearch
OpenSearch
7.x
1
Redis 5 (Deprecated)
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

Focal Point Cropping

Automatic crops are a great way to define multiple crops of an image, but automatic crops could cut off the important subject in the image. There is where focal point cropping comes into the game by letting users choose where in the image the main subject is and all automatic crops will make sure it is visible in the frame.

Push Messages

A new metadata plugin which does all the User Interface and database work required to send Push Messages, but gives you the control over what and how to send.

  • Send Push Messages directly from Table Dashboards
  • Dynamic message format based on Params Schema
  • Implement your own push function to send messages anywhere

Public API - Open API Specification

The Livingdocs Public API can be tested and consumed with an OpenAPI v3 specification file.

Thanks to the OpenAPI specification, it’s possible to quickly test the API using Swagger UI. And import the full collection of existing API endpoints into Insomnia or Postman.

System Metadata

Livingdocs supports configurable metadata since a long time. In this release, we’re introducing “System Metadata” properties, which have different versioning behavior and don’t affect the draft state. This is useful for metadata properties that are not part of the content, but are used for internal purposes. Typically System Metadata Properties are used for behavioral extensions of the Livingdocs system, like Proofreading tasks or Push Notifications and other extensions. At the moment this is an internal feature and only specific properties use this functionality.

Document Lists Sync (Autorefresh)

Collaboratively managing Document Lists became much easier. Livingdocs now synchronises all changes so any user always sees the latest version of a Document List. Therefore, no more conflicting changes resulting in error messages and tedious reloads will occur.

Cut and paste Components

Cutting and pasting components makes reordering components within a long document much easier. Cutting components moves them into the Clipboard from where they can be dragged to their new position.

Metadata Plugin li-document-references

To replace the existing li-reference-list metadata plugin with it’s more modern variant, li-document-references is introduced. It allows a more flexible configuration for the dashboard in use to search documents by the means of the useDashboard config as you know it from li-document-reference.

Roles for Read and Write Instances

We introduce roles to define the type of server

  • read (all server have read access by default)
  • write (stores data)
  • worker (executes jobs like indexing)

Reindexing CLI task improvements

Elasticsearch Indexing CLI (livingdocs-server elasticsearch-index) got some improvements:

  • add --ids=1,2,3,4 argument to index specific document id’s
  • add --ids-file=file-with-ids.txt argument to index specific document id’s passed by a file
  • add --since=2022-10-11 argument to index changes since a specific iso date
  • add --until=1h argument to index changes until a relative time or iso date
  • add --wait flag to wait for index completion. The processing still only takes place in other processes, not in the cli process.

Breaking Changes 🔥

Migrate the Postgres Database 🔥

It’s a simple/fast migration with no expected data losses.

# run `livingdocs-server migrate up` to update to the newest database scheme
# migration 182-add-started_at-index-on-users_occupations.js
#   add index on user_occupations.started_at
# migration 183-add-user_id-index-on-users_occupations.js
#   add index on user_occupations.user_id
livingdocs-server migrate up

Fix firstPublicationDate to documents table (Post Deployment) 🔥

If you have unpublished a document while running release-2022-07 or release-2022-09 then you may have inaccurate values for the document.systemdata.firstPublicationDate. Below is a comparison of the change in the four most recent versions:

First publish: release-2022-07 and release-2022-09: Set firstPublicationDate release-2022-05 and release-2022-11: Set firstPublicationDate

Republish while published: release-2022-07 and release-2022-09: Keep firstPublicationDate release-2022-05 and release-2022-11: Keep firstPublicationDate

Unpublish: release-2022-07 and release-2022-09: Remove firstPublicationDate release-2022-05 and release-2022-11: Keep firstPublicationDate

Republish after unpublish: release-2022-07 and release-2022-09: Set firstPublicationDate release-2022-05 and release-2022-11: Keep firstPublicationDate

Essentially the old behaviour and the new “fixed” behaviour is to set firstPublicationDate once and never modify it. This property will still exist even when the document is unpublished. For release-2022-07 and release-2022-09 the difference in behaviour was that the firstPublicationDate would be cleared on unpublish and set again at the next publish.

If you would like to correct the firstPublicationDate property for all of your articles you can run:

node ./node_modules/@livingdocs/server/db/manual-migrations/009-fix-first-publication-date.js

This script performs the following actions:

  1. Check that first_publication_id has been set (same as the script 007-populate-first-publication-data.js)
  2. Move firstPublicationDate from data to data.publishControl
  3. Remove data.firstPublicationDate
  4. If firstPublicationDate is not set then use the value from the first publication
  5. If firstPublicationDate is set then use the value from the first publication when the first publication is older

It is highly recommended that you run this script because it is performing a data migration as well as fixing the values.

References: Server PR

Drop Elasticsearch v6 🔥

Drop support for Elasticsearch v6. Please upgrade to Elasticsearch v8 or OpenSearch v2.3.0.

Separation of Revision Metadata and System Metadata 🔥

We introduce “System Metadata” for data which only needs to be stored per document and need no history like the existing Revision Metadata. Typically System Metadata are used for handling state on a document like proofreading, language settings, integration settings and a lot more.

  • 🔥 Metadata object spread not supported Object spread using {...documentVersion.metadata} is not supported anymore for documentWriteModel.metadata and documentVersion.metadata. Please use {...documentVersion.metadata.toJSON()} instead. This has the side effect in the tests that expect(metadata).to.deep.equal({title: 'foo'}) doesn’t work anymore. Either call .toJSON() on the object or use a clone function that clones all the enumerable properties instead of just own properties.
  • 🔥 Content types removed from a project config not served in public api The public API now only serves configured content types. Before it also served documents of removed content types, which resulted in inconsistencies when a certain set of metadata was expected.
  • 🔥 Unconfigured metadata properties are not exposed anymore on documentVersion.metadata documentVersion.metadata now only includes configured metadata properties. Before the changes in here it contained all metadata properties, also ones that got removed from the metadata configuration of the project config. Therefore JSON.stringify(document.metadata) now only renders configured properties.
  • 🔥 Move preparePublish hooks after metadata plugin onPreparePublish hooks During the migration to the preparePublish hooks, the order accidentally changed. Before, the prePublish hooks were run after the metadata plugin onPublish hooks. In this change, we’re reverting that to execute the metadata plugin onPreparePublish hooks before the preparePublish hooks. This has the effect that required metadata are always present in the preparePublish hooks, unlike before where they still could be missing.

References:

Break metadata plugin li-desknet-integration | li-transcoding-state 🔥

  • 🔥 ui.component option for li-transcoding-state metadata plugin has been removed (it uses a default component)
  • 🔥 ui.component option for li-desknet-integration metadata plugin has been removed (it uses a default component)

References:

IndexingApi background indexing job 🔥

Remove indexingApi.addPublicationBackgroundIndexingJobsByIds. Please use indexIndexingApi.addBackgroundIndexingJobsByIds that supports also cluster parameters.

- indexIndexingApi.addPublicationBackgroundIndexingJobsByIds({
-   context: {projectId: 1},
-   ids
- })
+ indexIndexingApi.addBackgroundIndexingJobsByIds({
+   handle: 'custom-index-handle',
+   context: {projectId: 1},
+   ids
+ })

Remove Regex support in Delivery 🔥

Remove any regular expressions from pathPattern configs and update them according to our examples.

Remove li-desknet-platforms metadata plugin 🔥

The metadata plugin li-desknet-platforms has been replaced by li-desknet-schedule, which has a different storage schema and additional config options.

  • 🔥 Remove li-desknet-platforms metadata plugin

Required Actions

If you have been using the li-desknet-platforms metadata plugin you will need to change to the li-desknet-schedule plugin and migrate the data to the new format. The metadata storage schema has changed from:

[
  {
    platformId: 1,
    categoryId: 2
  }
]

to:

{
  platforms: [
    {
      platformId: 1,
      categoryId: 2
    }
  ]
}

If you would like to migrate the data from “li-desknet-platforms” to “li-desknet-schedule” then you will need to write a migration script which moves the current metadata value to the platforms property of the new metadata value object:

module.exports = {
  async migrateAsync ({metadata}) {
    // skip the revision from being migrated when deskNetPlatforms is not set
    if (!metadata.desknetPlatforms) return

    metadata.desknetSchedule = {platforms: metadata.desknetPlatforms}
    metadata.desknetPlatforms = undefined
    return {metadata}
  }
}

Standardise the alt text and directive prefilling 🔥

🔥 Change the processing order of altTextPrefilling and componentDirectivesPrefilling so that the result is more understandable.

If multiple prefill configs are provided for the same directive in componentDirectivesPrefilling, then the first match found will be used instead of continuing and overwriting other previously successful matches. Additionally, there is no longer a priority given to translatable metadata fields, so the order of the componentDirectivesPrefilling and altTextPrefilling configs should be more predictable - the first match in the array will always be used.

Required Actions If you have multiple prefill configs for a single directive in componentDirectivesPrefilling then you should change the order so that the highest priority configs are first in the array.

Deprecations

Systemdata

💣 Normalize documentWriteModel.systemdata and documentVersion.systemdata. Old properties are defined as getters and emit deprecation warnings (LIDEP018), new properties are enumerable on the object.

  • systemdata.project_id > systemdata.projectId
  • systemdata.channel_id > systemdata.channelId
  • systemdata.document_id > systemdata.documentId
  • systemdata.revision_id > systemdata.revisionId
  • systemdata.remote_id > systemdata.remoteId
  • systemdata.content_type > systemdata.contentType
  • systemdata.document_type > systemdata.documentType
  • systemdata.designDescriptor > systemdata.design
  • systemdata.publication_id > systemdata.publicationId
  • systemdata.publication_date > systemdata.lastPublicationDate
  • systemdata.first_publication_date > systemdata.firstPublicationDate

HTTP Server Config

To make the HTTP Config more consistent we moved the settings to another server config property.

// from
server: {
  host: 'localhost',
  port: 9090,
  max_json_request_size: '500kb',
  gzip: false,
  trust_proxy: 'loopback,uniquelocal,172.17.0.0/24'
},

// to
httpServer: {
  //   defaults, you can omit those
  host: '::', // this is the http listen config. if you declare 'localhost', it won't be possible to access it outside the host.
  port: 9090,
  maxRequestBodySize: '500kb',
  useGzipCompression: false,
  xForwardedForTrustIps: 'loopback,uniquelocal,172.17.0.0/24',

  //   optionally define unix socket path or ssl certificates
  //   path: '/path/to/unix/socket',
  //   https: {key, cert},
},

Metadata Plugin Config Validation

  • Deprecate support for metadataPluginsToIgnoreForConfigValidation

  • Server PR

APIs 🎁

Public API

Other Changes

Security

Design

Features

Improvements

Bugfixes

Patches

Here is a list of all patches after the release has been announced.

Livingdocs Server Patches

  • v200.3.23: fix(li-push-messages): check if document is published
  • v200.3.22: fix(indexing): Handle missing metadata while indexing
  • v200.3.21: chore: Adopt elasticsearch version
  • v200.3.20: fix(elasticsearch): Always use v7 of the elasticsearch client. v8 changed the api and we can’t use it in the release
  • v200.3.19: chore(documents): Adopt firstPublicationDate behavior in tests that were recently added on master
  • v200.3.18: fix(fastify): Update fastify to 4.10.2, to patch a security vulnerability
  • v200.3.17: fix(webhooks): Restrict webhook handle length
  • v200.3.16: fix(print): Add params to print export
  • v200.3.15: fix(errors): Remove isPublicAPI from req properties
  • v200.3.14: fix(redis): Set sentinel username and password if credentials are set
  • v200.3.13: fix(lists): Create list endpoint required lists:publish permission, changed to lists:manage to match permission description
  • v200.3.12: fix(includes): Fix paramsSchema config.published handling
  • v200.3.11: fix(unPublishNow): Workflow improved/implemented
  • v200.3.10: fix(li-media-language): Remove support for li-media-language
  • v200.3.9: fix(desknet): Check value changed before publication status sync
  • v200.3.8: fix(desknet): Don’t try to save null values for metadata properties
  • v200.3.7: fix(includes): load drafts in preview
  • v200.3.6: fix(indexing): Correctly apply updatedAt filter during indexing of media library entries
  • v200.3.5: fix(desknet): get all desknet entries in search
  • v??.?.?: text

Livingdocs Editor Patches

  • v85.15.31: fix(li-push-messages): only show push button on published documents

  • v85.15.30: fix: escape error messages on login screen

  • v85.15.29: fix(table dashboard): don’t show the empty state while loading a search result but the old result until the new one is ready

  • v85.15.28: fix(media library): allow li-document-reference additionalInfo besides li-reference

  • v85.15.27: fix(dashboards): Handle published: false in legacy dashboards

  • v85.15.26: chore(publish-control): fix E2E tests

  • v85.15.25: refactor: optimize code for internal vs external link handling

  • v85.15.24: fix: correctly compute minHeight with an incomplete config

  • v85.15.23: fix(list cards): Rocket

  • v85.15.22: fix: update framework v24.6.2

  • v85.15.21: fix(dashboards): task boards have no cts

  • v85.15.20: fix(toolbar): Restore action button group labels

  • v85.15.19: fix(conflictUI): Discard and Apply buttons correctly positioned

  • v85.15.18: fix: wrap article metadata view in closable panel

  • v85.15.17: fix: prevent refreshing table dashboard when loading more elements

  • v85.15.16: fix: prevent endless calling of finalDashboardConfig by moving it from a computed property to the creation lifecycle

  • v85.15.15: fix(metadata): ensure teaser card in li-document-references doesn’t overflow

  • v85.15.14: fix(li-tree): reset search results properly

  • v85.15.13: fix(metadata): correct metadata.ui.service deprecation notice

  • v85.15.12: fix(issue-management): improve UX

  • v85.15.11: fix(resetFilterButton): Correctly styled

  • v85.15.10: fix(webpack): Remove deprecated file-loader and extract-loader

  • v85.15.9: fix(unpublishNow): Calls correct server endpoint

  • v85.15.8: fix(li-media-language): Remove all code references to li-media-language, metadata plugin no longer supported.

  • v85.15.7: chore(li-tree): implement code review feedback

  • v85.15.6: chore(li-tree): implement code review feedback

  • v85.15.5: fix(li-tree): do not remove link/reference when updatinglabel name

  • v85.15.4: fix(publish): Back returns to custom dashboard after create

  • v85.15.3: test(focal-point): add focal point in image metadata tests

  • v??.?.?: text


    Icon Legend

    • Breaking changes: 🔥
    • Feature: 🎁
    • Bugfix: 🪲
    • Chore: 🔧