Releases: reactodia/reactodia-workspace
Releases · reactodia/reactodia-workspace
v0.34.1
🐛 Fixed
- Fix stale/non-saved data when calling
applyChanges()immediately afterupdateData()inEntityEditorandRelationEditor. - Fix
SelectionAction*components not updating on selection change when provided as children toHalo.
💅 Polish
- Allow to control the placement of newly created entity elements from
ClassTreeandSearchSectionElementTypesviaplaceCreatedEntityprop. - Expose
fixedElementsoption forperformLayout()to be able to constrain elements not to move (if supported by the layout function). - Improve ARIA-attributes and other accessibility interaction:
- Allow to resize and toggle
WorkspaceLayout*with a keyboard; - Change
WorkspaceLayout*to be<section>elements witharia-label(i.e. regions); - Add
roleforCanvaslayers,Toolbar,ZoomControl,UnifiedSearch(and other search inputs); - Add
aria-labelandaria-keyshortcutsforToolbarAction,SelectionAction,LinkAction.
- Allow to resize and toggle
v0.34.0
🚀 New Features
- Support proper graph manipulation on touchscreen devices:
- Allow to move and resize elements on touchscreen;
- Allow to manipulate link vertices on touchscreen (only in Firefox for now due to bug);
- Allow to select multiple elements with
Selectionwith touch whenCanvasApi.pointerModeisselection; - Allow to establish new links with
SelectionActionEstablishLinkon touchscreen; - Allow to move link source or target with
LinkActionMoveEndpointon touchscreen; - Make
ZoomOptions.requireCtrldefault tofalseto zoom without holdingCtrli.e. like on a map. - Enable
showPointerModeToggleonZoomControlby default (can be disabled by passingfalse).
- [💥Breaking] Extend and make optional built-in property editing form support:
- Extract property editor inputs into separate entry point
@reactodia/workspace/formsto be able to use external forms implementation without always bundling the built-in one; - Provide
InputText,InputListandInputSelectbasic form inputs; - Provide
InputFileform input withMemoryFileUploaderimplementation forFileUploadProviderinterface; VisualAuthoringnow requirespropertyEditorprop with changed contract, which have to return an editor component in all cases.DefaultPropertyEditorin combination with imported inputs provides default (built-in) property editing experience, but custom editors can be implemented withEntityEditorandRelationEditor"provider" components.
- Extract property editor inputs into separate entry point
- Allow to customize how resource anchors and asset URLs (e.g. images or downloadable files) are resolved via
DataLocaleProvider.{prepareAnchor, resolveAssetUrl}:- Resolve anchors and image thumbnail URLs in
StandardEntity,ClassicEntityandSelectionActionAnchor; - Add
useResolvedAssetUrl()helper hook to simplify resolving asset URLs from components;
- Resolve anchors and image thumbnail URLs in
- Support conditionally rendering
WorkspaceLayout*child components by passingnullinstead of a child to remove it:- Allow to hide left and right panels in
ClassicWorkspaceby passingnullto the corresponding props; - Allow to provide
classNameandstyletoWorkspaceLayout*components.
- Allow to hide left and right panels in
- Add
Translation.textOptional()to support common translation string defaults with ability to provide separate string for each case:- Use
search_defaults.input.placeholderfor a search input field; - Use
visual_authoring.dialog.apply.{label, text}for an "Apply" button inVisualAuthoringdialogs.
- Use
- Allow to customize default dialog sizes for built-in dialogs and persist user-changed sizes with
dialogSettingsProviderprop onWorkspace:- Default provider persists user-changed dialog sizes in-memory based on
dialogType.
- Default provider persists user-changed dialog sizes in-memory based on
💅 Polish
- Expose
useAsync()utility hook to simplify data loading from via a single Promise-returning task. - Expose
useProvidedEntities()utility hook to have a simple way to load non-canvas entities with cache from aDataProvider. - Provide
onlySelectedproperty to link templates the same way as for element templates. - Allow to configure whether
ClassTreeandSearchSectionElementTypestree items should be draggable. - Allow to configure
SparqlDataProvider.lookup()vialookupQueryandfilterInnerPreludesettings.
🔧 Maintenance
- Preparations to extract generic scrollable paper component
Paperfrom diagram-specific state and logic:- Replace
reactodia-paper-areaCSS class byreactodia-canvas-areaandreactodia-paper. - Deprecate
CanvasMetrics.areain favor ofCanvasMetrics.pane.
- Replace
- Remove
AbortScopeutility class (can be trivially replaced by the built-inAbortSignal.any()function).
v0.33.0
🚀 New Features
- Allow to open "Edit entity" dialog from
VisualAuthoringfor an entity not present on the canvas (e.g. to edit related or well-known entities). - Extends metadata support for editing an entity or relation properties:
- Allow to order properties with
MetadataPropertyShape.order; - Allow to specify default value with
MetadataValueShape.defaultValue; - Provide
sourceandtargetentities toMetadataProvider.getRelationShape().
- Allow to order properties with
🐛 Fixed
- Fix stale rendering (i.e. missing links after moving an endpoint until an element move) due to the lost scheduled layer updates.
- Fix unable to scroll inside canvas components and templates when
requireCtrlinzoomOptionsis setfalse. - Disallow moving relation source or target to another entity in authoring mode if the relation after move already exists on the canvas.
- Disable changing an entity IRI in a form when
MetadataProvider.canModifyEntity()disallows it. - Move link vertices together with source and target elements if both are selected in
Selectioncomponent. - Re-validate entities and links with
ValidationProviderwhen added or removed via undo/redo. - Fix marking
AnnotationLinkwithTemplateProperties.LayoutOnlywhen importing a diagram layout.
💅 Polish
- Remove superfluous "Type" fields from the default "Edit entity" dialog.
- Provide
translationand currentlanguagetoValidationProvider.validate()method. - Allow to specify related property IRI when returning a validation item for a relation from
ValidationProvider. - Display language selector in
FormInputTextonly when shapedatatypeisrdf:langStringoruniqueLangis set to eithertrueorfalse(the selector will be hidden by default whendatatypeisxsd:string). - Deprecate getting
Translationinstance fromWorkspaceContext: useuseTranslation()hook instead to be able to subscribe to translation bundle changes in the future.
v0.32.0
🐛 Fixed
- Avoid marking grouped relation as "layout only" when importing a diagram (only grouped relation links themselves).
- Fix being unable to pan the canvas in Firefox when an graph element with a scrollbar inside was present.
- Fix a freeze when opening a class tree in authoring mode when
MetadataProvider.filterConstructibleTypes()returns without any delay. - Fix calling
MetadataProvider.canConnect()with only source and without target when dragging over an element to establish a new link. - Fix
flushSync was called from inside a lifecycle methodReact warning when callingcenterTo(),centerContent(),zoomToFit()onCanvasApifrom a lifecycle method. - Fix labels not loading for element and link type selectors in
VisualAuthoringdialogs unless already preloaded from the diagram. - Use default property editor for entities or relations when
VisualAuthoring.propertyEditorreturnsundefined. - Fix
prepareLabelsoption forSparqlDataProviderto be applied forknownElementTypes(),knownLinkTypes(),elementTypes(),linkTypes(),propertyTypes()andelements. - Fix
SparqlDataProvider.elements()to always return entities with sorted types.
💅 Polish
- Allow to set
classNameandstyleon workspace root when usingDefaultWorkspaceorClassicWorkspace. - Allow to customize link label style separately for each property type in
StandardRelation. - Allow to customize relation property editor with the built-in relation type selector
RelationTypeSelector. - Export
LinkMarkerCircleandLinkMarkerDiamondbuilt-in link marker styles in addition to existingLinkMarkerArrowhead:- Built-in link markers now use
context-strokeasstroke/fillvalue to match link path color.
- Built-in link markers now use
- Provide
translationand currentlanguagetocreateEntity()andcreateRelation()methods ofMetadataProvider. - Add
RdfDataProvider.clear()to clear all added graphs to the provider. - Add
datatypePredicatesoption forRdfDataProviderto explicitly place connectedNamedNodeproperty values into entity/relation properties as if they were literals. - Add
originPropertyoption toCompositeDataProviderandorigintoDataProviderDefinitionto attach information about source provider for an entity or relation as a property value:DataProviderDefinition.originreplaces previous non-configurablenameprop (which is marked as deprecated now).
- Add
anyoption forToolbarActionSavepropertymodeto be able to save when either diagram or authoring state has changes. - Increase default maximum fallback size when exporting a raster image to 8192x8192 px as it well supported in the current browsers.
v0.31.2
🐛 Fixed
- Fix
AnnotationSupportnot unsubscribing fromAnnotationTopicat unmount which causes two annotations to be created fromSelectionActionAnnotatein React development mode. - Fix undo/redo history not working after panning or pinch-zoom gesture on touch devices.
- Fix keyboard hotkeys for selection actions not working after focusing on search input then clicking back on the selection box.
v0.31.1
🐛 Fixed
- Fix incorrect canvas viewport position when
zoomToFit()or similar operation is called immediately after element position changes; - Omit properties without values in
StandardEntity,StandardRelationandClassicEntity.
v0.31.0
🚀 New Features
- Simplify canvas widgets placement at one or multiple layers:
- Canvas children are always assumed to be viewport widgets;
- Add
CanvasPlaceAtcomponent to render its children at specified non-viewport canvas layer instead; - Support new placement layers:
underlaylayer to place components under all canvas content,overLinkGeometrylayer to place components above link geometry (connections) but under link labels; - [💥Breaking] Remove
defineCanvasWidget()andSharedCanvasState.setCanvasWidget()(useCanvasPlaceAtto display components at canvas layers instead).
- Support to import and export diagram layout with custom element and link cell types (derived from
ElementorLink):- Introduce an optional contract for
ElementorLink-derived cell types to be serializable:SerializableElementCellandSerializableLinkCell; - When implemented, the corresponding cell types can be exported and later imported with the diagram;
DataDiagramModel.importLayout()will accept known cell types viaelementCellTypesandlinkCellTypesto import.
- Introduce an optional contract for
- Support diagram-only annotations:
- Add
AnnotationElementandAnnotationLinkelements and links which exports and imports with the diagram but does not exists in the data graph; - Rendered by default with new built-in templates
NoteTemplateandNoteLinkTemplatewhich useNoteAnnotation,NoteEntityandNoteLinktemplate components; - Add
AnnotationSupportcanvas widget which enables annotations in the UI (can be configured or disabled viaannotationsprop onDefaultWorkspaceandClassicWorkspace); - Support annotation elements in
SelectionActionEstablishLinkand newSelectionActionAnnotatecomponents; - Support annotation links in
LinkActionDelete,LinkActionMoveEndpointcomponents. - Add
DefaultRenameLinkProviderand use it by default to allow to change annotation link labels.
- Add
- Support user-resizable element templates with
ElementSizetemplate state property:- Resizable elements display "box with handles" in the
Haloto change the size; - Changed element sizes are captured and restored by
RestoreGeometrycommand.
- Resizable elements display "box with handles" in the
- Allow to customize link template separately for each link instead of only based on its link type IRI in
linkTemplateResolverforCanvas. - Allow to configure
DropOnCanvasto allow only some drop events and provide items to place on the canvas. - Support keyboard hotkeys for
LinkActioncomponents to act on a currently selected link.
🐛 Fixed
- Fix link rendering lagging behind when moving elements.
- Fix
RdfDataProvider.links()returning empty results when called withlinkTypeIdsparameter. - Fix
HaloLinkand visual authoring link path highlight being rendered on top on elements by placing it ontooverLinkGeometrywidget layer instead. - Fix
HaloLinklink path highlighting not updating on link re-route. - Fix element template state not being restored when ungrouping entities.
- Fix missing element decorations after re-importing the same diagram.
- Fix
DraggableHandleto avoid using staleonDragHandleandonEndDragHandleprop values. - Fix being able to execute disabled
SelectionActionvia keyboard hotkey. - Fix throwing an error while trying to access
CanvasApi.metricsmembers before theCanvasis fully mounted.
⏱ Performance
- [💥Breaking] Canvas widgets are not automatically updated when parent canvas is rendered to reduce unnecessary re-renders, and now require explicit subscriptions:
- Subscribe to canvas
changeTransformevent when usingCanvasApi.metricsto convert between coordinates; - Subscribe to canvas
resizeevent to track viewport size; - Subscribe to
changeCellsevent fromDiagramModelto track graph content changes.
- Subscribe to canvas
- Add
TemplateProps.onlySelectedflag to use in the element templates to track if the element is the only one selected without performance penalty. - Avoid per-layer frame delay when processing canvas layer updates without calling
RenderingState.syncUpdate():- Add
useLayerDebouncedStore()hook as more flexible way to debounce and update with the canvas layer.
- Add
- Avoid eager link type creation for relation links, only create and fetch them on first render.
💅 Polish
- [💥Breaking] Use typed
TemplateStateforElement.elementStateandLink.linkStateto avoid accidental type mismatch. - Make dialogs fill the available viewport when the viewport width is small:
- This is controlled by new CSS property
--reactodia-dialog-viewport-breakpoint-swith default value600pxwhich makes dialog fill the viewport if the available width is less or equal to that value.
- This is controlled by new CSS property
- Allow to override base z-index level for workspace components with a set z-index value via
--reactodia-z-index-baseCSS property; - Make
Halomargin configurable via CSS property--reactodia-selection-single-box-margin. - Highlight link path in
HaloLinkwith--reactodia-selection-link-colorcolor by default. - Add
changeTransformevent toCanvasApi.eventswhich triggers onCanvasApi.metrics.getTransform()changes, i.e. when coordinate mapping changes due to scale or canvas size is re-adjusted. - Add
DiagramModel.cellsVersionproperty which updates on every element or link addition/removal/reordering to be able to subscribe tochangeCellsevent withuseSyncStore()hook. - Deprecate
canvasWidgetsprop onDefaultWorkspaceandClassicWorkspacein favor of passing widgets directly as children. - Mark placeholder entity data with
PlaceholderDataPropertyproperty key to distinguish not-loaded-yet elements withEntityElement.isPlaceholderData():- Add
DataDiagramModel.requestData()as a convenient method to load all placeholder entities at once.
- Add
- Move expanded element state from distinct property on
Elementto be stored inElement.elementStatewithTemplateProperties.Expandedproperty:- All existing properties, methods and commands works as before but use element template state as storage for expanded state;
changeExpandedevent is removed from element events, usechangeElementStateevent instead;- When exporting the diagram the expanded state is serialized only with
elementStatewhile usingisExpandedproperty when importing the diagram for backward compatibility.
- Introduce
ElementTemplate.supportsproperty for templates to tell its capabilities such as ability to expand/collapse or resized by user. - Use consistent naming for standard element and link templates:
- Deprecate
DefaultLinkTemplateandDefaultLinkand alias them toStandardLinkTemplateandStandardRelation; - Change CSS class for standard element template from
reactodia-standard-templatetoreactodia-standard-element; - Change CSS class for default link template from
reactodia-default-linktoreactodia-standard-link; - Change translation groups from
standard_template/default_link_templatetostandard_element/standard_link.
- Deprecate
- Move "expand/collapse on double click" global element behavior to
StandardEntityandClassicEntityimplementation only. - Change
MetadataProvider.{createEntity, createRelation}to return result object with initial template state in addition to the data to customize the created cells (i.e. new elements can be expanded or collapsed). - Add
EditorController.applyAuthoringChanges()method to apply current authoring changes to the diagram (i.e. change entity data, delete relations, etc) and reset the change state to be empty. - Deprecate and hide by default "Edit" and "Delete" action buttons in
StandardEntityexpanded state (can be re-enabled by settingshowActionsprop totrue). - Deprecate
WorkpaceContext.{group, ungroupAll, ungroupSome}methods in favor of free functionsgroupEntities(),ungroupAllEntities(),ungroupSomeEntities().
🔧 Maintenance
- Use Vite to build the library instead of Webpack to reduce build time by 70% and produced bundle size by 38%.
- Update Vitest to v4.
- Use small subset of carbon design icons for various buttons.
v0.30.1
🐛 Fixed
- Fix
BaseMetadataProvidernot delegatingcanModifyRelationmethod from object passed in its constructor. - Make
CanvasApi.{exportSvg, exportRaster}export images referenced in CSS stylesheets or inline styles frommask(mask-image) orbackground(background-image) CSS properties. - Fix incomplete styles for exported canvas due to non-captured custom CSS property values in Chromium-based browsers.
- Fix issues when setting a mutable selection array, e.g.
model.setSelection(model.elements). - Fix moving elements with
Selectiondoes not adding an undo command to the history.
⏱ Performance
- Avoid unnecessary component updates in
HaloandHaloLinkwhen multiple elements are selected.
💅 Polish
- Expose
contentPaddingoption forCanvasApi.{exportSvg, exportRaster}methods to configure padding for the exported diagram.
v0.30.0
🚀 New Features
- Support authoring relation properties:
- Add
MetadataProvider.getRelationShape()interface method to get editor metadata for relation properties, and allow to returncanEdit: truefromMetadataProvider.canModifyRelation()to display relation properties editor;
- Add
- Display "edit" and "delete" inline entity actions:
- Add option
inlineEntityActions(defaults totrue) forVisualAuthoringto display entity actions inline at the top of each entity; - Improve the style for "cancel" (discard) action on entities and relations to make it consistent with other inline actions.
- Add option
- Add
ElementDecorationcomponent to display additional decorations over canvas elements either from the template itself or from outside the element:- Element decorations are not included in the computed element bounds but are exported with the canvas unless explicitly marked with
data-reactodia-no-exportattribute (as with other canvas elements).
- Element decorations are not included in the computed element bounds but are exported with the canvas unless explicitly marked with
- Support keyboard hotkeys for the focused canvas:
- Allow to specify arbitrary hotkeys to
ToolbarActionandSelectionActioncomponents, exportuseCanvasHotkey()hook to bind hotkey from any canvas widget; - Add default hotkeys for components:
Selection(Ctrl+A: select all),ToolbarActionUndo(Ctrl+Z),ToolbarActionRedo(Ctrl+Shift+Z),SelectionActionRemove(Delete, same as before),SelectionActionGroup(G).
- Allow to specify arbitrary hotkeys to
- [💥Breaking] Use separate HTML paper layer to display
LinkLabelcomponents instead of an SVG canvas, which allows to use CSS for layout, backgrounds and improves rendering performance:textClass,textStyle,rectClassandrectStyleare replaced byclassNameandstyleprops;- CSS should use HTML styling properties instead of SVG variants, e.g.
colorandbackground-colorinstead ofstrokeandfill; - Label content should be placed directly as children to the component instead of using
contentprop.
- Select entity label and image using
DataLocaleProviderbased on its properties:- [💥Breaking] Remove
ElementModel.{label, image}properties and instead useDataDiagramModel.localemethods to select them based onElementModel.propertiesinstead; - Allow to override data locale provider (default is
DefaultDataLocaleProvider) by passinglocaleoption tomodel.importLayout()ormodel.createNewDiagram();
- [💥Breaking] Remove
🐛 Fixed
- Always display validation state for an entities and relations in case when the target does not have any authoring changes.
- Display elliptical authoring state overlays for elliptically-shaped entity elements.
- Use provided
durationinCanvasApi.animateGraph()for element transitions without the need to override the styles. - Trigger
keydown,keyup,scrollandcontextMenucanvas events only from a non-widget layer. - Fix marking existing relation as new or changed after moving its source or target to its original source or target.
⏱ Performance
- Optimize diagram loading time by avoiding unnecessary updates and separating a measuring element sizes step from applying the sizes to the rendering state.
💅 Polish
- Export
BaseMetadataProvideras a stable base to instantiate or extend when implementing custom metadata providers. - Re-use and un-deprecate
model.localeformatting object withDataLocaleProviderinterface type:- Deprecate
Translation.formatIri()in favor oflocale.formatIri(); - Replace other deprecated methods of
localewith:selectEntityLabel(),selectEntityImageUrl(),formatEntityLabel(),formatEntityTypeList();
- Deprecate
- Provide gradual customization options for the built-in entity and relation property editor:
- Expose ability to customize property input in authoring forms with
inputResolveroption forVisualAuthoringcomponent; - Export built-in inputs
FormInputListandFormInputText, as well asFormInputSinglePropsandFormInputMultiPropsprops interfaces to implement custom property inputs.
- Expose ability to customize property input in authoring forms with
- [💥Breaking] Rename the following constants for consistency in naming style:
DIAGRAM_CONTEXT_URL_V1->DiagramContextV1,PLACEHOLDER_ELEMENT_TYPE->PlaceholderEntityType,PLACEHOLDER_LINK_TYPE->PlaceholderRelationType;
- Support the ability to expand up the
Dropdown,DropdownMenuandToolbarby settingdirectionto"up"e.g. for docking the toolbar to the bottom of the viewport. - Allow to return
iconMonochrome: truefor a type style to automatically apply dark theme filter for the icon. - Support optional dependency list in
useEventStore()to re-subscribe to store if needed.
🔧 Maintenance
- Make library compatible with React v19, while continuing support for v17 and v18.
- Increase
IndexedDbCachedProvider.DB_VERSIONto 4 due toElementModelchanges. - Remove deprecated
LocaleFormatter,DataGraphLocaleFormatterandFormattedPropertytypes. - Simplify the exported canvas SVG by using a single
<foreignObject>to hold the whole element layer instead of a separate one for each canvas element.
v0.29.1
🐛 Fixed
- Fix "max update exceeded in
componentDidUpdate()" error that can be triggered inInstancesSearchin some cases.