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

Webinar

System Requirements

Suggested

NameVersion
Node18
NPM8
Postgres15
Elasticsearch
OpenSearch
8.x
v2.3.0
Redis7
Livingdocs Server Docker Imagelivingdocs/server-base:18
Livingdocs Editor Docker Imagelivingdocs/editor-base:18
Browser SupportEdge >= 80, Firefox >= 74, Chrome >= 80, Safari >= 13.1, iOS Safari >= 13.4, Opera >= 67

Minimal

NameVersion
Node14.17.0
NPM7
Postgres12
Elasticsearch
OpenSearch
7.x
1
Redis5 (Deprecated)
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

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 schema
# 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.53: fix(documents): Fix metadataEntity typo
  • v200.3.52: fix(indexing): Fix --ids=1,2,3 indexing for the drafts index
  • v200.3.51: chore: Disable drone nzz tests, they are on a newer version
  • v200.3.50: fix: fix data migration memory leak (report at the end) with a lot of migrated documents
  • v200.3.49: fix: log invalid metadata type in contentType[].publicationIndex config
  • v200.3.48: fix: improve isTestFile regex
  • v200.3.47: fix: update framework version
  • v200.3.46: fix(documents): Allow dashboard request to exclude revision content
  • v200.3.45: fix(lib): Get require("~lib") to work again with newer npm versions
  • v200.3.44: fix(document-lists): Support list updates with a lot of document ids
  • v200.3.43: fix(performance): Give postgres better query hints by adding a project_id to content type joins
  • v200.3.42: fix(indexing): Always pass the contentTypeId used for indexing filtering
  • v200.3.41: fix(webhooks): Acknowledge and delete duplicated webhook requests
  • v200.3.40: fix(security): Update taffydb modules to latest non-vulnerable version
  • v200.3.39: fix(deps): update dependency ua-parser-js from 1.0.32 to v1.0.33
  • v200.3.38: fix(designs): Fix transaction support
  • v200.3.37: fix(scheduled-publishing): Coerce schedule dates to a proper iso date with time zone
  • v200.3.36: fix(local-authentication): Make the current_password validation more strict
  • v200.3.35: fix(public-api): Fix mutating property on route declaration of composition api
  • v200.3.34: fix: extend test for filtering unknown components when nested default content is defined in the contentType
  • v200.3.33: fix(import): Ignore duplicate import webhook delivery report error
  • v200.3.32: fix(public-api): Fix Cannot set headers after they are sent to the client error on POST /api/v1/import/mediaLibrary
  • v200.3.31: fix: check documentType delete permissions
  • v200.3.30: fix(publication-indexing): Remove documents of a deleted content type from the publication index
  • v200.3.29: fix(xmldom): Update @xmldom/xmldom to a newer release that includes fix for security vulnerability
  • v200.3.28: fix: add test for id range parameter for PublicationEvents
  • v200.3.27: fix(desknet): Prevent empty userId from Desk-Net
  • v200.3.26: chore: Fix DocumentEntity save tests that use the documents repo
  • v200.3.25: fix(comyan): expose api
  • v200.3.24: fix(cli reencrypt): now uses correct stringify
  • 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.78: fix(menu): fix drag and drop handler - quick fix

  • v85.15.77: fix(draft): Use remote metadata source when updating metadata

  • v85.15.76: fix(vue): Fix default parameter of components that should fallback to an empty object

  • v85.15.75: fix: bump framework version november

  • v85.15.74: fix: detect media changes by asset.key

  • v85.15.73: fix(dashboards): Don’t load document content in table dashboards

  • v85.15.72: fix(li-list-assignments): avoid flickering after list was selected

  • v85.15.71: fix(kanban board): reloads results correctly when result is less than page size

  • v85.15.70: fix(publish control): ensure button state changes on publish/draft creation

  • v85.15.69: fix: defaultParams from directive

  • v85.15.68: fix(drag-and-drop): Fix issue where drag-and-drop from the SVG starting in the clipboard would result in an error

  • v85.15.67: fix(occupations): Migrate to utc time queries on the billing screen

  • v85.15.66: fix(li-link-edit): Fix error logged in triggerDigest()

  • v85.15.65: fix(multilist): Prevent removed item from being re-added on sort

  • v85.15.64: fix(supportCrops): false checker

  • v85.15.63: fix(supportsCrop): checks for false value

  • v85.15.62: fix(dashboard-reload): persist current result list

  • v85.15.61: fix(autosave): Add scheduled save when autosave.stopped

  • v85.15.60: chore(images): fix image crop tests to test the correct thing

  • v85.15.59: fix(images): do not auto-update images for includes

  • v85.15.58: fix(deps): bump ua-parser-js from 0.7.32 to 0.7.33

  • v85.15.57: fix(focalPoint): avoid creating empty object as focal point

  • v85.15.56: fix: Replace jsonwebtoken with jose

  • v85.15.55: chore(soft lock): no helper function, better lock check

  • v85.15.54: fix(basePath): Always load webpack assets with the absolute path

  • v85.15.53: fix(security): Applies all security patches that do not have the patch in a breaking version

  • v85.15.52: fix: show configured style of li-document-reference in creation flow dialogs and includes

  • v85.15.51: fix(security): Upgrade socket.io to fix critical vulnerability

  • v85.15.50: fix(security): Upgrade resolve-url-loader to fix loader-utils critical vulnerability

  • v85.15.49: fix(upload): handle unsupported images in browser

  • v85.15.48: fix(document lists): Code removed

  • v85.15.47: fix(metadata): Wrap document references in default list

  • v85.15.46: chore(li-link-edit): tests added

  • v85.15.45: fix(namedCrops): Delete button works correctly

  • v85.15.44: fix: add system user for empty userid

  • v85.15.43: fix(metadata): Always pass focalPoint when initialising image cropper

  • v85.15.42: fix(deps): update dependency moment-timezone from 0.5.34 to 0.5.35 [security]

  • v85.15.41: fix(li-date-time-range-filter): prevent filter dropdown to be cut off

  • v85.15.40: fix(search): Fix load more button translation for list search

  • v85.15.39: fix(inlineListEditor): Only publishable when dirty

  • v85.15.38: fix(dateTimevalidity): Does not error without ’to’ date

  • v85.15.37: fix(metadata): Change calculation for li-text input height

  • v85.15.36: fix: change to selected service on copy

  • v85.15.35: fix(document-lists): Update German translation for “Close”

  • v85.15.34: fix(loader): added and styled for translation card

  • v85.15.33: fix(count): For reference list

  • v85.15.32: fix(focalPoint): make sure crop coordinates are rounded when using focal point tool

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