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

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

Editing improvements

With this release we improved some behavior during editing a document:

  • Support insert on ENTER on last editable of a multi-editable component
  • Support container look-ahead for insert
  • Support split / merge on ENTER / DEL on last editable of a multi-editable component
  • Select text over multiple editables
  • Fix arrow movement past empty doc-optional editables
  • Allow formats to be set over links if the beginning or end is at a boundary
  • Support copy of multiple components
  • Support dragging multiple components from clipboard

References:

Vue Metadata Plugins

A much requested feature was adding metadata plugins with a custom Vue component. Finally we have it!

References:

Table Dashboards

Table dashboards are a new flexible type of dashboards where individual columns can be configured. This release contains a first iteration, the full functionality will be provided with the next release.

The following functionality is available in this release:

  • 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

The following functionality will be added in the next release:

  • Table dashboard used as default for articles, pages, and data records
  • Document creation from a table dashboard
  • New filter configuration
  • Inline editing of more metadata properties

References:

Retresco integration

We integrated Retresco tagging system to automatically add tags to a document with a nice UI. The supported functionality is:

  • automated adding of tags (via Retresco) to a Livingdocs document
  • ability to change tags via Editor

Video Includes

Video includes provide a more flexible approach to embedding videos within a document than using the standard media library entry directly. The media library approach does not have an integrated solution for video transcoding, so it would only be possible to render the original video file to HTML. On the other hand, using an include service allows you to hook into an external service or data store which could provide the transcoded assets you require.

oEmbed Include

The oEmbed include service allows users to embed content (such as photos, videos, or iframes) by providing a link to a resource, without having to worry about embed scripts. The include service has a small number of core providers (TikTok, Twitter, Vimeo, YouTube), but it can easily be extended with additional providers, or with a generic catch-all provider.

References:

Breaking Changes 🔥

Migrate the 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 - 173-add-user-ids-to-document-lists.js
# migration - 174-add-range-query-functions.js
# migration - 175-drop-documents-content-type-document-type-and-channel.js
# migration - 176-publish-control.js
# migration - 177-document_revisions-document_id-deferrable.js
livingdocs-server migrate up

Remove Support for Postgres 9 + 10 🔥

🔥 Support for Postgres 9 + 10 has been removed, Please Update to Postgres 14 (11+ is supported).

Migrate knex transactions to pg 🔥

💣 The knex instance on liServer.db.connection is deprecated 🔥 Knex transactions aren’t compatible with Livingdocs anymore. Please use db.begin instead:

const db = liServer.db
liServer.db.begin(async (trx) => {
  db.sql`UPDATE something set foo = 'bar'`.transacting(trx)
  // or
  await trx.sql`UPDATE something set foo = 'bar'`
})

References: Server PR

Remove columns from documents / document_publication_events table 🔥

💣 Remove metadata_id, channel_id, content_type and document_type columns from the documents table 💣 Remove channel_id, content_type and document_type columns from the document_publication_events table

Those changes shouldn’t affect any downstream, but in case there are direct sql queries against the database, you need to switch to queries that use the content_type_id column.

References: Server PR

Remove support for callbacks in multiple server API’s 🔥

We removed Callback support in several server API’s as we noticed many bugs originating from mixing callbacks and promises. So we continue to phase out callbacks in all APIs. In the next releases we will continue with the removal of callbacks in server API’s. All server API’s already support Promises, therefore you can prepare the downstream migration from Callbacks to Promises.

An example how to migrate the APIs you will find in September 2021 Release

  • 🔥 remove callback support of channelConfig (server.features.api('li-channel-configs').write) functions. Only promise based calls are supported
  • 🔥 remove callback support of documentApi (server.features.api('li-documents').document) functions. Only promise based calls are supported
  • 🔥 remove callback support of pushNotifications (server.features.api('li-push-notifications').publication) functions. Only promise based calls are supported
  • 🔥 remove callback support of publicationApi (server.features.api('li-documents').publication) functions. Only promise based calls are supported
  • 🔥 remove callback support of pusherApi (server.features.api('li-pusher-authentication')) functions. Only promise based calls are supported
  • 🔥 remove callback support of hugoApi (server.features.api('li-hugo')) functions. Only promise based calls are supported

References:

Reject registering unknown publication hooks 🔥

Until now, you were able to register a publication hook with any name, even when the hook had no effect.

🔥 Only support the registration of well-known Publication Hooks

Remove prepublishHook 🔥

🔥 removed server hook prepublishHook 🔥 renamed server config integrations.retresco.registerPrepublishHook to integrations.retresco.registerPreparePublishHook

If you want to keep the functionality of the prepublishHook, you can use the preparePublishHook. For alternatives and explanations check the Server Hooks documentation

// migrate from
async prepublishHookAsync ({documentVersion}) {
  // modify documentVersion
  return {documentVersion}
}
// to
async preparePublishHookAsync ({documentVersion}) {
  // modify documentVersion
  return
}

References: Server PR

Remove publishHook 🔥

🔥 removed publishHook (throws an error on server startup)

If you want to keep the functionality of the publishHook, you can use the preparePublishHook (modify the document) or postPublishHook (notify other systems). For more explanations check the Server Hooks documentation

Example 1 - migration from publishHook to preparePublishHook

// migrate from
async publishHookAsync ({documentVersion}) {
  // modify documentVersion
  return {documentVersion}
}
// to
async preparePublishHookAsync ({documentVersion}) {
  // modify documentVersion
  return
}

Example 2 - migration from publishHook to postPublishHook

// migrate from
async publishHookAsync ({documentVersion}) {
  // notify other system
  return {documentVersion}
}
// to
async postPublishHookAsync ({documentVersion}) {
  // notify other system
  return
}

Example 3 - migrate document rendering

// if you have used the document rendering in the publication hook, you can still use the functionality
// but you have to go over the publicationApi

async publishHookAsync (params) {
  const {documentVersion, renditions} = await params.render()
  await pushRenditionsToExternalService(renditions)
  return {documentVersion}
}
// to
async postPublishHookAsync (params) {
  const publicationApi = server.features.api('li-documents').publication
  const {documentVersion, renditions} = await publicationApi.render(params.documentVersion)
  await pushRenditionsToExternalService(renditions)
  return
}

References: Server PR

Rename metadata.onPublish hook to metadata.onPreparePublish hook 🔥

🔥 rename metadata.onPublish hook to metadata.onPreparePublish hook (API stays same)

References: Server PR

unpublishHook parameter change 🔥

🔥 Change the parameters in unpublishHook.

  • params.payload.documentVersion moved to params.documentVersion.
  • Access of params.payload now throws an error

Migration example

async unpublishHookAsync ({documentVersion}) {
  // params.payload.documentVersion moved to params.documentVersion
  await doSomething(documentVersion)
}

References: Server PR

Document Inbox - remove position parameter 🔥

The position parameter can no longer be passed to server.features.api('li-document-inbox').removeItem({}) or POST /documents/:documentId/inbox-remove

References: Server PR

Remove support for callbacks in projectApi 🔥

We removed Callback support in several server API’s as we noticed many bugs originating from mixing callbacks and promises. So we continue to phase out callbacks in all APIs. In the next releases we will continue with the removal of callbacks in server API’s. All server API’s already support Promises, therefore you can prepare the downstream migration from Callbacks to Promises.

  • 🔥 remove callback support for projectApi (server.features.api('li-projects')) functions. Only promise based calls are supported

You can find migration a migration example here.

References: Server PR

Document Search - Don’t search for exact document id matches 🔥

🔥 server.features.api('li-documents').document.find() will no longer search by id if the search string is numeric.

References: Server PR

Remove Support for tasks-v1 🔥

Tasks v1 is deprecated since 2 years. We removed it, because no customers use it to our knowledge.

Steps to do for downstreams

  • delete editor config app.taskTypes
  • delete metadata plugin projectConfig with type li-tasks
  • delete Elasticsearch document mapping for li-tasks (see example)
  • configure tasks-v2, if you want to continue using tasks, e.g.

References: Server PR

Remove server config search.documentsMetadataFields 🔥

🔥 remove server config search.documentsMetadataFields

This config must not be defined anymore, because all metadata are returned when calling the editing API endpoint /documents.

References: Server PR

Remove server event mediaLibraryEntry.added 🔥

🔥 remove server event mediaLibraryEntry.added. Use mediaLibraryEntry.create instead (same API)

References: Server PR

desk-net access removed for read API token 🔥

🔥 removed desk-net access for document read API token

If you want to have access to Desk Net with your API token, you need to add the “desk-net integration API access” via API tokens in the editor

References: Server PR

Filter unconfigured metadata in publicApi 🔥

Unconfigured metadata are now filtered from the publicApi. After a project configuration is updated the metadata properties not configured anymore will be filtered immediately. When saving a document from the editor with an unconfigured property the save will now succeed and unconfigured properties are ‘ghosted’ in the save operation. The importer will still throw errors for unconfigured metadata properties.

🔥 Filter unconfigured properties from public Api

References: Server PR

Render default UI component per metadata type 🔥

For some metadata plugins, a default UI component is now rendered if config.hideFromForm is not set to true for a specific metadata property.

add hideFromForm: true to the metadata config for any metadata property you want to see not rendered and is not in this list: li-dependencies, li-document-lock, li-google-vision, li-media-language, li-metadata-translations, li-moderated-collab, li-print, li-push-notifications, li-routing, li-task-v2.

// contentType config
{
  metadata: [
    {
      handle: 'myText',
      type: 'li-text',
      config: {
        hideFromForm: true
      }
    }
  ]
}

References: Editor PR

Use Vue based form rendering by default 🔥

🔥 editor config app.metadata.useVueBasedFormRendering has no effect anymore (remove the config)

Any downstream AngularJS based custom UI component should work as expected. If you have any problems, please do this:

  • Tell your contact at Livingdocs about the problem you see. We will make sure to fix the issue.
  • Set editor config app.metadata.useAngularBasedFormRendering: true in your editor config to temporarily switch back to the Angular based form rendering. This will be possible for release-2022-03 only and removed in release-2022-05.

References: Editor PR

Remove group property in mainNavigation config 🔥

🔥 Remove support for the group property within an editorSettings.mainNavigation item.

Required Actions

Old configuration

The old configuration relied on a group property of a mainNavigation menu item object to set the group. The possible groups were top, dashboards, custom, preferences, and admin. The menu items defined using liItem would use the group of that item type, and any other custom menu items would be assigned to the dashboards group if a group was not specified.

editorSettings: {
  // ...
  mainNavigation: [
    {liItem: 'articles'}, // defaults to dashboard group
    {liItem: 'pages'}, // defaults to dashboard group
    {liItem: 'mediaLibrary'}, // defaults to dashboard group
    {
      label: 'Authors',
      dashboard: 'authors-dashboard',
      icon: 'account'
      // group not specified so it defaults to dashboard group
    },
    {
      label: 'Proofreading',
      dashboard: 'kanban-proofreading',
      icon: 'clipboard-check',
      group: 'custom' // assigned to custom group
    },
    {
      label: 'Livingdocs Website',
      icon: 'rocket',
      href: 'https://www.livingdocs.io',
      group: 'preferences' // assigned to preferences group
    },
    {liItem: 'contentSetup'}, // defaults to preferences group
    {liItem: 'projectSettings'}, // defaults to preferences group
    {
      liItem: 'serverAdmin',
      group: 'preferences' // assigned to preferences group instead of default admin group
    }
  ]
  // ...
}

New configuration

The new configuration uses a new mainNavigationGroups array which provides more flexibility. You can create your own collapsible groups with a label of your choice, and set the style using the secondary property. Menu groups and their items will appear in the order they are defined within the arrays. It’s also possible to have top-level menu items by not specifying a label.

To re-create the old configuration above you would define the following:

editorSettings: {
  // ...
  // groups are no longer defined in mainNavigation, so delete the group property
  mainNavigation: [
    {liItem: 'articles'},
    {liItem: 'pages'},
    {liItem: 'mediaLibrary'},
    {
      handle: 'authors', // add new handle property for custom navigation items
      label: 'Authors',
      dashboard: 'authors-dashboard',
      icon: 'account'
    },
    {
      handle: 'proofreading',
      label: 'Proofreading',
      dashboard: 'kanban-proofreading',
      icon: 'clipboard-check'
    },
    {
      handle: 'website',
      label: 'Livingdocs Website',
      href: 'https://www.livingdocs.io',
      icon: 'rocket'
    },
    {liItem: 'contentSetup'},
    {liItem: 'projectSettings'},
    {liItem: 'serverAdmin'}
  ],
  mainNavigationGroups: [
    {
      handle: 'dashboards',
      label: 'Dashboards',
      items: [
        'articles',
        'pages',
        'mediaLibrary',
        'authors'
      ]
    },
    {
      handle: 'custom',
      label: 'Custom',
      items: ['proofreading']
    },
    {
      handle: 'preferences',
      label: 'Preferences',
      secondary: true,
      items: [
        'website',
        'contentSetup',
        'projectSettings',
        'serverAdmin'
      ]
    }
  ],
  // ...
}

Instead of trying to replicate the menu exactly as it was, it may make more sense to utilise the new functionality:

editorSettings: {
  // ...
  mainNavigation: [
    // Same as the other new configuration example above
  ],
  mainNavigationGroups: [
    {
      // Rename dashboards to documents
      handle: 'documents',
      label: 'Documents',
      items: [
        'articles',
        'pages',
        'authors'
      ]
    },
    {
      // Move the images, videos and files dashboards into a media group
      handle: 'media',
      label: 'Media Library',
      items: ['mediaLibrary']
    },
    {
      // Give the custom dashboard a more meaningful name
      handle: 'workflow',
      label: 'Workflow',
      items: ['proofreading']
    },
    {
      // Move the website link to a top-level menu item (don't define a label for the group)
      handle: 'website',
      secondary: true,
      items: ['website']
    },
    {
      // Update the label name of the preferences group
      handle: 'preferences',
      label: 'Settings',
      secondary: true,
      items: [
        'contentSetup',
        'projectSettings',
        'serverAdmin'
      ]
    }
  ],
  // ...
}

Button group improvement 🔥

If you have any custom UI in your downstream that makes use of any of the following you want to read this:

No longer existing classes:

  • .ld-btn-group, .ld-btn-group__item, .ld-btn-group__item-v2, .ld-btn-group--right, .ld-btn-group--full, .ld-btn-group--toggle, .ld-btn-group--arrow, .ld-btn-group--cardchange, .ld-btn-group--selection, .ld-btn-group--center, .ld-btn-group--extension

You are highly encouraged to refactor your markup / custom stylesheets to not use these things anymore. 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-02.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-02.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.

Required Actions for Refactoring In case you’re making use of the above mentioned classes in your downstream:

  • Replace any .li-btn-group or .li-button-group element with the new <li-button-group> Vue or Angular components
  • Buttons should be placed directly within the component
  • See the style guide screenshot below for examples

References: Editor PR

Deprecations

Postgres

Postgres 11 is now deprecated. Please update to Postgres 14.1 whenever possible.

Elasticsearch

Elasticsearch 6.x is now deprecated. Please update to Elasticsearch 7 or OpenSearch.

Configuration auth.accessTokenSecret

The configuration auth.accessTokenSecret gets replaced by auth.accessTokenSigningKeys. Old configurations are still valid, but make sure you’ll convert your secret to a JSON web key as soon as you use the new configuration property.

  auth: {
-    accessTokenSecret: "some-secret-for-hmac256-token-signing"
      // Generate the JSON web key using
      //   $ livingdocs-server key-generate convert-hs256 'some-secret-for-hmac256-token-signing'
+    accessTokenSigningKeys: [{"kty":"oct","k":"c29tZS1zZWNyZXQtZm9yLWhtYWMyNTYtdG9rZW4tc2lnbmluZw","kid":"","alg":"HS256","use":"sig"}]
}

Take the existing auth.accessTokenSecret value and convert it to a JSON web key. To ease the conversion, we have the following command that outputs the json for the auth.accessTokenSigningKeys array:

livingdocs-server key-generate convert-hs256 'some-secret-for-hmac256-token-signing'

References:

Config ui.component in metadata plugin config

Configuring ui.component with the default component name for a type is now deprecated. Please consult the documentation to learn about the default components per type. If you have the default component configured, please remove the ui.component configuration.

An example:

// contentType config
{
  metadata: [
    {
      handle: 'title',
      type: 'li-text',
      ui: {
        component: 'liMetaTextForm'
      }
    }
  ]
}

// can be configured like this with the same effect:
{
  metadata: [
    {
      handle: 'title',
      type: 'li-text'
    }
  ]
}

References:

Deprecate documentWriteModel.metadataContent

Deprecate documentWriteModel.metadataContent use documentWriteModel.metadata instead.

References: Server PR

APIs 🎁

Public API

Media Library

🎁 Add replaceAsset operation at PATCH api/v1/mediaLibrary/:id

References:

Document Draft

🎁 Added new publicApi endpoint GET /api/beta/documents/:documentId/latestDraft to get the latest draft of a document

References:

Server Config

🎁 Support a accessTokenCacheSize config to increase the token cache size on heavy used servers | PR

Server APIs

publicApi getLatestDraftBeta

🎁 Added liServer.features.api('li-public-api').getLatestDraftBeta({projectId, documentId, renditionHandles}) to get the latest draft of a document via server Api

References:

hooksApi

🎁 Add preparePublishHookAsync to the instant publishing process 🎁 Add postPublishHookAsync to the instant publishing process

References:

documentApi

🎁 Add documentApi.unregisterPublicationServerHooks function to support removal of hooks added using documentApi.registerPublicationServerHooks | PR

Renderpipeline

remove renderInProcess option in renderPipeline.renderDocumentVersion({documentVersion, renderInProcess}). The parameter didn’t have any effect anymore | PR

Other Changes

Security

Features

Design

Improvements

Bugfixes

Patches

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

Livingdocs Server Patches

  • v171.1.55: fix: avoid loading content when retrieving lists
  • v171.1.54: fix(image-processing): Add format to GIF metadata extraction
  • v171.1.53: fix(print): Use previously hardcoded fields as fallback
  • v171.1.52: fix(hugo): Add assetPath to filterHugoConfig()
  • v171.1.51: fix(hugo): Add assetPath hugo config
  • v171.1.50: fix(cut and paste): Does not affect undo
  • v171.1.49: fix(frameworkBump): March release
  • v171.1.48: fix(print): Expose Desk-Net metadata in print export
  • v171.1.47: fix(project-config): replace pointer error message also on a deeper value
  • v171.1.46: fix: create new version to deploy to npm
  • v171.1.45: fix: wrong brackets after rebase
  • v171.1.44: fix(dependencies): update vulnerable dependencies
  • v171.1.43: fix(FrameworkVersion): bump to 23.0.13
  • v171.1.42: fix: tests for desk-net api
  • v171.1.41: fix(frameworkBump): to 23.0.11
  • v171.1.40: fix(project-config): load an old designConfig with correct designVersion for an embedded design
  • v171.1.39: fix(channel-config): fix transformToPointer to not throw during property deconstruction
  • v171.1.38: fix: incorporate PR feedback
  • v171.1.37: chore(tests): Test added
  • v171.1.36: chore: Use raw queries for embeddable sql statements
  • v171.1.35: fix(document): Allow searching by a reference in /documents?reference=document:id
  • v171.1.34: fix: add video to component directives schema
  • v171.1.33: fix: generate a new release
  • v171.1.32: fix: wrong migration test
  • v171.1.31: fix(hugoError): callback removed
  • v171.1.30: fix(retresco): Add details to Retresco error logs
  • v171.1.29: fix(hooks-factory): remove cb
  • v171.1.28: fix(retresco): Load entities from any metadata handle

Livingdocs Editor Patches

  • v77.2.83: fix(findIdfromUrl): Updated regex finder

  • v77.2.82: fix(lists): fix document state deprecations

  • v77.2.81: fix(hugo): Fallback field for hugo image import

  • v77.2.80: fix(hugo): Use configured hugo assetPath

  • v77.2.79: fix(liDateRangeFilter): documentPropertyName config supported

  • v77.2.78: fix(cacheIdentifier): now defined

  • v77.2.77: fix(text-formatting): Keep links closer to user input

  • v77.2.76: fix(cut and paste): Does not affect undo

  • v77.2.75: fix(multiListEditor): Service always found

  • v77.2.74: fix(frameworkBump): March release

  • v77.2.73: fix(metadata): ensure the UI updates after an async selection service returns

  • v77.2.72: fix(allow no multiselection): behaviour for multiselect configurable

  • v77.2.71: fix(dependencies): update vulnerable version of karma

  • v77.2.70: fix(isPublished): Pre publish control metadata plugins have correct published state

  • v77.2.69: fix(deletedComments): Only resolved threads removed with component

  • v77.2.68: fix(comments): Comments without components no longer break

  • v77.2.67: fix(softLock): Soft lock object can be empty

  • v77.2.66: fix(noComments): Allow component deletion without comments

  • v77.2.65: fix: tag proxy suggestion

  • v77.2.64: chore(clipboard): Add Windows/Linux multi-select support

  • v77.2.63: fix(FrameworkVersion): bump to 23.0.13

  • v77.2.62: fix(resolvedCount): resolved count reactive on delete

  • v77.2.61: fix: close previous flyout when opening another one

  • v77.2.60: fix: remove flyout backdrop logic from the toolbar

  • v77.2.59: fix: remove targetLength when it is set to nothing

  • v77.2.58: fix(responsive): Now fits inside page always

  • v77.2.57: fix(legacy dashboard): Make Cmd/Ctrl + click work again to open documents in new tab

  • v77.2.56: fix(frameworkBump): to 23.0.11

  • v77.2.55: fix(main-navigation): Allow loading when user has no project

  • v77.2.54: fix(softLock): Soft Lock not disabled by entering publish screen

  • v77.2.53: fix(quoteIcons): Grey and blue

  • v77.2.52: fix(softLock): Now correctly spaced

  • v77.2.51: fix(document): consider future metadata based publication date a schedule only for published documents

  • v77.2.50: fix(softLock): Button inline

  • v77.2.49: fix(translation manager): Use correct locale for checking if there is a new asset

  • v77.2.48: fix: remove bluewin/nzz test pipeline for release-2022-03

  • v77.2.47: fix(documentRemoved): from embedded list

  • v77.2.46: fix(documentWordRemoval): Document type dynamic

  • v77.2.45: fix(failedCypressTest): test removed

  • v77.2.44: fix(media-library): show active upload button in upload center when exif extraction provides new data

  • v77.2.43: fix(loadMoreListInbox): buttons centered

  • v77.2.42: fix(charCounter): position now fixed

  • v77.2.41: fix: transform prefillConfig from V1 to V2

  • v77.2.40: fix(query-types): add reference filter

  • v77.2.39: fix(document): publish state is correctly set for systems without publish control nor customPublicationDateField config

  • v77.2.38: fix(retresco): Reduce update frequency by ignoring scores

  • v77.2.37: fix: add margin below li-reference

  • v77.2.36: fix: add createdBy queryType

  • v77.2.35: fix(metadata): correctly apply startcase for default placeholder based on handle

  • v77.2.34: fix(metadata): fix deprecation log messages for ui.component configs

  • v77.2.33: fix(Safari): insert component doesn’t select everything

  • v77.2.32: fix: wrap text for long document titles on document lists

  • v77.2.31: fix(singleImageCrop): automatic crop fixed

  • v77.2.30: fix(metadata): correctly update the metadata form when a remote update to metadata occurs

  • v77.2.29: fix(metadata): Enable multiple default values

  • v77.2.28: fix: remove ‘href’ dependency of linked documents on formating toolbar


    Icon Legend

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