Repository navigation
10.10.0
@dextinity/admin@10.10.0
Patch Changes
-
c6b573b: Prevent
GridToolbarQuickFilterandDataGridPaginationfrom interfering with a surrounding form fieldPreviously, 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 aFormControl, 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,LinkControlsandBlockTypesControlspassededitorState,setEditorState,editorRefandoptionson to their root element. React logged "React does not recognize theeditorRefprop on a DOM element", and the props were rendered aseditorstate="[object Object]"attributes.
@dextinity/cms-admin@10.10.0
Minor Changes
-
d44bdd0: Add
isTipTapRichTextEmptyThe TipTap counterpart of
isRichTextEmpty: it returnstruewhen thetipTapContentof acreateTipTapRichTextBlockblock 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 ofavailableContentScopesare 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.
- 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 (
-
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,ListBlockandColumnsBlockand the child blocks of composite blocks. -
245faa3: Fix the "Each child in a list should have a unique key prop" warning in
createListBlockand the TipTap block dialogFormattedMessagereturns an array when a value is a React element. TheitemName,itemsNameanddisplayNamevalues are usually aFormattedMessageand are now wrapped in a keyedFragment. -
98499dd: Remove the unsupported
rowsMaxprop from the description fields ofcreateSeoBlockMUI v5 removed
rowsMax, so the prop had no effect and only caused the React warning "React does not recognize therowsMaxprop 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
SplitPreviewscrollablePreviously, when using
SplitPreviewwithout 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
defaultStyleis configuredChanging a styled paragraph to a heading, e.g. with the
Mod-Alt-1shortcut, kept the paragraph's style, so the API rejected the content and the block couldn't be saved. -
fdce21f: Separate the lines of a
TipTapRichTextBlockwith a space in the block previewPreviously, 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
includeFormatExtensionInImageUrlsoption to include a file extension in DAM image URLsCDN 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 theAcceptheader 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
defaultStylewhen reading the blockContent written before a
defaultStylewas configured carries no style, so the site had to render a missing style like the default. The API now applies thedefaultStyleof 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 ofavailableContentScopesare 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.
- 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 (
-
ad1ad05: Add
visibletoEntityInfoand support filtering and sorting warnings by itThe
EntityInfoGraphQL type now exposes the entity's visibility (e.g., whether a page is published).
Thewarningsquery accepts avisiblefilter and sort field, resolved via the joinedEntityInfo.
Warnings of entities without anEntityInfoare treated as visible.
Patch Changes
-
b6441cb: Convert a soft line break in DraftJS content to a
hardBreaknode when migrating to TipTapDraftJS 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
createTipTapRichTextBlockPreviously,
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-configsfailing withERR_MODULE_NOT_FOUNDin projects without atsconfig.jsonWithout a
tsconfig.json,ts-nodefalls back to the defaults of@tsconfig/node16, which switched tomodule: Node16in version 1.0.4.
This causedts-nodeto 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-includein the serverrenderMailHtmlby defaultSecurity fix for CVE-2025-67898: in
mjml4, an<mj-include>in the MJML can read files on the server into the rendered mail.
Projects that usemj-includemust passignoreIncludes: 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
autoplaysetting ofYouTubeVideoBlockwhen no preview image is setPreviously 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,VimeoVideoBlockandDamVideoBlockwhen it is started by clicking the preview imageAutoplaying 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.