Skip to content

10.10.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 07:04
· 141 commits to main since this release
9d8e4cb

@dextinity/admin@10.10.0

Patch Changes

  • c6b573b: Prevent GridToolbarQuickFilter and DataGridPagination from interfering with a surrounding form field

    Previously, when a data grid was rendered inside a form field, for instance in a dialog opened from a field, the quick filter's search input and the pagination's page size select registered with the field's FormControl.
    This caused a console error about multiple inputs inside a FormControl, and the field and the data grid shared their focused, filled, disabled, and error state.

@dextinity/admin-rte@10.10.0

Patch Changes

  • fbb437a: Stop passing the control props of the RTE toolbar to DOM elements

    Toolbar, LinkControls and BlockTypesControls passed editorState, setEditorState, editorRef and options on to their root element. React logged "React does not recognize the editorRef prop on a DOM element", and the props were rendered as editorstate="[object Object]" attributes.

@dextinity/cms-admin@10.10.0

Minor Changes

  • d44bdd0: Add isTipTapRichTextEmpty

    The TipTap counterpart of isRichTextEmpty: it returns true when the tipTapContent of a createTipTapRichTextBlock block holds neither text nor a child block.
    It takes the content rather than the block state, so it works with the block's data and its state alike.

    if (isTipTapRichTextEmpty(notes.tipTapContent)) {
        // show a placeholder
    }
  • 8ca42f5: Add a preview text to the table block

  • 7a121f1: Rework the content scopes management in the user permissions panel

    The user permissions panel now renders a consistent set of content scope columns for every user based on the content scope dimensions declared in the API (userPermissionsAvailableContentScopeDimensions). A dimension whose value is the "*" wildcard is shown as "All".

    • Content scopes are assigned through an "Add scope" dialog that builds a scope from one dropdown per enumerable dimension, cascading so that only existing combinations can be selected. Each dropdown also offers an "All" option to grant every value of that dimension (* wildcard). Dimensions that are not part of availableContentScopes are entered as a free text value (* grants all values).
    • The assigned content scopes and the permission-specific content scopes (override dialog) use the same paginated grid and add dialog, and show manually assigned scopes first.
    • Removing a content scope asks for confirmation, consistent with removing a permission.
    • The assignment type is shown in a consistent way across the permissions and content scopes grids.
  • ad1ad05: Show only warnings of visible entities by default in the warnings grid

    The grid has a new "Visible" column, and the default filter shows only warnings whose entity is visible (e.g., a published page).
    Remove the filter to see warnings of unpublished entities as well.

Patch Changes

  • 7f5eefe: Show the correct error message when a DAM file upload is rejected by the API

    Previously, rejected uploads (e.g., an image exceeding the maximum resolution) were treated as successful, resulting in a generic error like "Variable $id of required type ID! was not provided" instead of the specific validation message.

    Replacing a file now also shows the HTTP status instead of a JSON parse error when the API responds with a non-JSON error.

  • bfc162a: Don't read files into memory before uploading them to the DAM

    Previously, every file was fully loaded into the browser's memory before the upload started, which could cause high memory usage and a delay before the upload progress was shown for large files.

  • c1ac227: Fix hover marking between a block list and the block preview

    Hovering a block in the block list didn't mark it in the block preview, and hovering a block in the block preview neither marked its entry in the block list nor scrolled the list to it. This affected the entries of BlocksBlock, ListBlock and ColumnsBlock and the child blocks of composite blocks.

  • 245faa3: Fix the "Each child in a list should have a unique key prop" warning in createListBlock and the TipTap block dialog

    FormattedMessage returns an array when a value is a React element. The itemName, itemsName and displayName values are usually a FormattedMessage and are now wrapped in a keyed Fragment.

  • 98499dd: Remove the unsupported rowsMax prop from the description fields of createSeoBlock

    MUI v5 removed rowsMax, so the prop had no effect and only caused the React warning "React does not recognize the rowsMax prop on a DOM element". The fields keep their height of three rows.

  • 43461dd: Show the folder path of search results in the dialogs for choosing DAM files

    Files with the same name in different folders can now be told apart, as in the DAM search.

  • 4bd97fa: Make the content column of SplitPreview scrollable

    Previously, when using SplitPreview without tabs, content taller than the viewport scrolled the whole page, moving the preview out of view.

  • 6683f95: Fix the empty line after a list at the end of a TipTap rich text that couldn't be deleted

    The editor no longer adds an empty text block after a list at the end of the content. Deleting this empty line added it again right away. To continue writing after the list, press Enter in its empty last item.

  • a607533: Fix the TipTap rich text block keeping a text block style the new text block doesn't offer when no defaultStyle is configured

    Changing a styled paragraph to a heading, e.g. with the Mod-Alt-1 shortcut, kept the paragraph's style, so the API rejected the content and the block couldn't be saved.

  • fdce21f: Separate the lines of a TipTapRichTextBlock with a space in the block preview

    Previously, the text of all paragraphs and list items was joined without a space, for example "First lineSecond line".

@dextinity/cms-api@10.10.0

Minor Changes

  • 3862673: Add the includeFormatExtensionInImageUrls option to include a file extension in DAM image URLs

    CDN features that cache an image per format, such as Cloudflare's Vary for Images or the WebP option of Bunny's Vary Cache, require the file extension in the URL path.
    With the option enabled, image URLs end with the extension of the format the API delivers when the Accept header offers no modern format, e.g. photo.png.
    Originals that aren't JPEG, PNG or GIF get .jpg, because the API delivers them as JPEG.
    Image URLs with an outdated filename, i.e. without extension or from before the file was renamed, permanently redirect to the current URL.

    The API accepts image URLs with and without extension regardless of the option, so disabling it again doesn't break URLs that are already in use.

    Example

    DamModule.register({
        damConfig: {
            // ...
            includeFormatExtensionInImageUrls: true,
        },
        // ...
    });
  • b6bca3b: TipTap Rich Text Block: fill in a missing text block style with the defaultStyle when reading the block

    Content written before a defaultStyle was configured carries no style, so the site had to render a missing style like the default. The API now applies the defaultStyle of the text block, or inside a list item of the list, whenever it reads a text block without a style. The site always receives the style's name, and the content needs no migration.

  • 7a121f1: Rework the content scopes management in the user permissions panel

    The user permissions panel now renders a consistent set of content scope columns for every user based on the content scope dimensions declared in the API (userPermissionsAvailableContentScopeDimensions). A dimension whose value is the "*" wildcard is shown as "All".

    • Content scopes are assigned through an "Add scope" dialog that builds a scope from one dropdown per enumerable dimension, cascading so that only existing combinations can be selected. Each dropdown also offers an "All" option to grant every value of that dimension (* wildcard). Dimensions that are not part of availableContentScopes are entered as a free text value (* grants all values).
    • The assigned content scopes and the permission-specific content scopes (override dialog) use the same paginated grid and add dialog, and show manually assigned scopes first.
    • Removing a content scope asks for confirmation, consistent with removing a permission.
    • The assignment type is shown in a consistent way across the permissions and content scopes grids.
  • ad1ad05: Add visible to EntityInfo and support filtering and sorting warnings by it

    The EntityInfo GraphQL type now exposes the entity's visibility (e.g., whether a page is published).
    The warnings query accepts a visible filter and sort field, resolved via the joined EntityInfo.
    Warnings of entities without an EntityInfo are treated as visible.

Patch Changes

  • b6441cb: Convert a soft line break in DraftJS content to a hardBreak node when migrating to TipTap

    DraftJS stores a soft line break (Shift+Enter) as a newline within the block's text. The migration kept it as a newline in a TipTap text node, which the rich text renderers don't render as a line break.

  • d5d2a85: Return one search text entry per text block in createTipTapRichTextBlock

    Previously, searchText() returned one entry per TipTap text node. Since TipTap splits a line into several text nodes wherever a mark such as bold, italic or a link starts or ends, a single sentence ended up as several entries. Consumers that join the entries with spaces got stray spaces, for instance before a period following a link.

    Now searchText() returns one entry per paragraph or heading, like the DraftJS-based rich text block. A hard break within a text block becomes a newline.

@dextinity/cli@10.10.0

Patch Changes

  • b0decc5: Fix dextinity inject-site-configs failing with ERR_MODULE_NOT_FOUND in projects without a tsconfig.json

    Without a tsconfig.json, ts-node falls back to the defaults of @tsconfig/node16, which switched to module: Node16 in version 1.0.4.
    This caused ts-node to emit ESM, so extensionless imports in the site configs (e.g., import main from "./main") could no longer be resolved.
    The CLI now always compiles to CommonJS.

@dextinity/mail-react@10.10.0

Patch Changes

  • dd4f424: Disable mj-include in the server renderMailHtml by default

    Security fix for CVE-2025-67898: in mjml 4, an <mj-include> in the MJML can read files on the server into the rendered mail.
    Projects that use mj-include must pass ignoreIncludes: false. Otherwise, the include is removed without a warning.

@dextinity/site-react@10.10.0

Patch Changes

  • 9d65d08: Fix the selection in the block preview for blocks that a page renders more than once

    When one copy of such a block unmounted, the other copies could not be selected in the block preview until it was reloaded.

  • 41b3249: Respect the autoplay setting of YouTubeVideoBlock when no preview image is set

    Previously the video only started playing after the preview image was clicked, so blocks without a preview image (e.g. in a kiosk) never autoplayed.

    The embedded player is now also loaded lazily, so a video further down the page doesn't start playing before it is anywhere near the viewport.

  • 3ba43d6: Play the video unmuted in YouTubeVideoBlock, VimeoVideoBlock and DamVideoBlock when it is started by clicking the preview image

    Autoplaying videos still start muted, since browsers block unmuted autoplay without a user interaction. The click on the preview image is such an interaction, so muting is no longer necessary from that point on.