Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
ad360d9
adapted for react 18
arausly Sep 30, 2025
f8a22eb
added temp any type for failing strict ts check
arausly Sep 30, 2025
919bca3
merge develop
arausly Dec 8, 2025
ef6fede
corrected interface to fix compilation errors
arausly Dec 8, 2025
f8edf61
fixed compile errors in ContextOverlay
arausly Dec 10, 2025
e7ab6a0
Merge branch 'develop' into change/upgradedToReact18-CMEM-6639
andreas-schultz Jan 14, 2026
2491c21
Remove seemingly unnecessary changes
andreas-schultz Jan 14, 2026
67bb694
Upgrade react testing library from v12 to v14
andreas-schultz Jan 19, 2026
47395f9
Fix deprecation warnings because of React 18 upgrade
andreas-schultz Jan 19, 2026
52bd09a
add NotAvailable component
haschek Jan 29, 2026
b921c68
add tooltip indicator if no tag is used
haschek Feb 2, 2026
8764a22
provide an inline option for content blob togglers
haschek Feb 4, 2026
432f99d
add story for NotAvailable and update changelog
haschek Feb 5, 2026
80161ac
update yarn lock
haschek Feb 5, 2026
bfcbe84
Merge remote-tracking branch 'origin/change/upgradedToReact18-CMEM-66…
haschek Feb 5, 2026
60624bd
Add isValidNewOption to MultiSuggestField
andreas-schultz Feb 6, 2026
c8b3703
Fix tests
andreas-schultz Feb 9, 2026
24d10e0
fix border of tag in multi suggest component
haschek Feb 9, 2026
54fbae9
Remove unnecessary code leading to test failure
andreas-schultz Feb 9, 2026
28457be
Merge remote-tracking branch 'origin/change/upgradedToReact18-CMEM-66…
haschek Feb 9, 2026
23720eb
use var for header height
haschek Feb 10, 2026
dcdbc36
simplify fetching styles for small/large text blobs
haschek Feb 10, 2026
b06bec7
add togglerSize property
haschek Feb 10, 2026
aff9553
support the size property of the BlueprintJS button by forwarding it …
haschek Feb 10, 2026
c0daf9a
use jest-fixed-jsdom to fix global JS APIs
haschek Feb 12, 2026
a6bffc2
Several MultiSelect improvements
andreas-schultz Feb 13, 2026
c17f5b7
Fix imports to fix tests
andreas-schultz Feb 16, 2026
800e09e
Fix all imports in components to not import from index
andreas-schultz Feb 16, 2026
6205dcf
use jest-fixed-jsdom to fix global JS APIs
haschek Feb 12, 2026
cb5b504
fix imports for storybook to prevent circular dpendencies
haschek Feb 16, 2026
40aeb01
fix more imports in stories
haschek Feb 16, 2026
8b792d5
fix imports
haschek Feb 16, 2026
7b093dd
Merge branch 'develop' into change/upgradedToReact18-CMEM-6639
andreas-schultz Apr 13, 2026
bb7b621
Fix new compile issues after merge from develop
andreas-schultz Apr 13, 2026
a65c4a8
Merge branch 'change/upgradedToReact18-CMEM-6639' into feature/replac…
andreas-schultz Apr 14, 2026
6940791
Refactor imports from index
andreas-schultz Apr 14, 2026
cf1a50c
Remove potential hook re-ordering problem in VisualTour component
andreas-schultz Apr 15, 2026
3a5f28d
Reset drop down list immediately in MultiSelect when query changes
andreas-schultz Apr 17, 2026
6307ab2
Merge branch 'develop' into change/upgradedToReact18-CMEM-6639
haschek Apr 23, 2026
31eb14e
Merge change/upgradedToReact18-CMEM-6639 into feature/replaceDeprecat…
andreas-schultz Apr 23, 2026
d176040
Fix re-rendering bug in MultiSelect
andreas-schultz Apr 23, 2026
80aa2ba
Merge pull request #367 from eccenca/feature/replaceDeprecatedGuiComp…
andreas-schultz Apr 23, 2026
a9b3706
Remove uncommented code
andreas-schultz Apr 23, 2026
7fa47cf
Remove type hack in ApplicationSidebarNavigation
andreas-schultz Apr 23, 2026
1decd25
Improve types in various places
andreas-schultz Apr 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- `operation-filterreset`
- `toggler-pin-empty`
- `toggler-pin-filled`
- `<NotAvailable />`
- simple placeholder element that can be used to display info about missing data
- `<ContentBlobToggler />`
- `forceInline` property: force inline rendering
- `<ContextMenu />`
- `togglerSize`: replaces the deprecated `togglerLarge` property
- `<MultiSelect />:
- `searchListPredicate` property: Allows to filter the complete list of search options at once.
- Following optional BlueprintJs properties are forwarded now to override default behaviour: `noResults`, `createNewItemRenderer` and `itemRenderer`
- `isValidNewOption` property: Checks if an input string is or can be turned into a valid new option.


### Fixed

Expand Down Expand Up @@ -85,6 +96,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- Focus outlines
- we use again bold focus outlines for input elements
- they are also used for clickable elements that are focused via keyboard (tab navigation)
- `<MultiSelect />`:
- border of the BlueprintJS `Tag` elements were fixed

### Changed

Expand All @@ -105,11 +118,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- `<FlexibleLayoutItem />`
- `<GridColumn />`
- `<PropertyName />` and `<PropertyValue />`
- `<MultiSelect />`
- by default, if no searchPredicate or searchListPredicate is defined, the filtering is done via case-insensitive multi-word filtering.

### Deprecated

- `<StringPreviewContentBlobToggler />`
- `firstNonEmptyLineOnly` will be removed, is replaced by `useOnly="firstNonEmptyLine"`
- `<ContextMenu />`
- `togglerLarge`: replaced by the more versatile `togglerSize` property
- `<MultiSelect />`
- `searchPredicate`: replaced by the, in some cases, more efficient `searchListPredicate`

## [25.0.0] - 2025-12-01

Expand Down
11 changes: 8 additions & 3 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@ const compat = new FlatCompat({
allConfig: js.configs.all
});

export default [...compat.extends(
const base = compat.extends(
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
), {
);

export default [...base, {
plugins: {
"@typescript-eslint": typescriptEslint,
react,
Expand All @@ -31,6 +33,9 @@ export default [...compat.extends(

languageOptions: {
parser: tsParser,
globals: {
window: "readonly",
}
},

rules: {
Expand All @@ -54,4 +59,4 @@ export default [...compat.extends(

"no-console": "error",
},
}];
}];
11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@
"lodash": "^4.18.1",
"n3": "^1.26.0",
"re-resizable": "^6.10.3",
"react": "^16.13.1",
"react-dom": "^16.14.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-flow-renderer": "9.7.4",
"react-inlinesvg": "^3.0.3",
"react-is": "^16.13.1",
Expand Down Expand Up @@ -132,7 +132,7 @@
"@storybook/react-webpack5": "^8.6.14",
"@storybook/test": "^8.6.14",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^12.1.5",
"@testing-library/react": "^14.3.1",
"@types/color": "^3.0.6",
"@types/he": "^1.2.3",
"@types/jest": "^30.0.0",
Expand All @@ -153,6 +153,7 @@
"identity-obj-proxy": "^3.0.0",
"jest": "^30.2.0",
"jest-environment-jsdom": "^30.2.0",
"jest-fixed-jsdom": "^0.0.11",
"jest-pnp-resolver": "^1.2.3",
"lint-staged": "^15.5.2",
"node-sass-package-importer": "^5.3.3",
Expand Down Expand Up @@ -180,7 +181,7 @@
"react": ">=16"
},
"resolutions": {
"**/@types/react": "^17.0.90",
"**/@types/react": "^18.2.0",
"node-sass-package-importer/**/postcss": "^8.5.6",
"string-width": "^4.2.3",
"wrap-ansi": "^7.0.0",
Expand Down Expand Up @@ -228,7 +229,7 @@
"testMatch": [
"<rootDir>/src/**/*(*.)@(spec|test).{js,jsx,ts,tsx}"
],
"testEnvironment": "jest-environment-jsdom",
"testEnvironment": "jest-fixed-jsdom",
"transform": {
"^.+\\.(js|jsx|ts|tsx)$": "babel-jest"
},
Expand Down
11 changes: 3 additions & 8 deletions src/cmem/ActivityControl/ActivityControlWidget.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,9 @@ import { OverlaysProvider } from "@blueprintjs/core";
import { Meta, StoryFn } from "@storybook/react";

import { helpersArgTypes } from "../../../.storybook/helpers";
import {
ActivityControlWidget,
ActivityControlWidgetAction,
IconButton,
SimpleDialog,
Tag,
TagList,
} from "../../../index";
import { IconButton, SimpleDialog, Tag, TagList } from "../../components";

import { ActivityControlWidget, ActivityControlWidgetAction } from "./ActivityControlWidget";

export default {
title: "Cmem/ActivityControlWidget",
Expand Down
26 changes: 13 additions & 13 deletions src/cmem/ActivityControl/ActivityControlWidget.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
import React from "react";

import {ValidIconName} from "../../components/Icon/canonicalIconNames";
import {IconProps} from "../../components/Icon/Icon";
import {TestIconProps} from "../../components/Icon/TestIcon";
import {TestableComponent} from "../../components/interfaces";
import {ProgressBarProps} from "../../components/ProgressBar/ProgressBar";
import {SpinnerProps} from "../../components/Spinner/Spinner";
import {CLASSPREFIX as eccgui} from "../../configuration/constants";
import {
Card,
ContextMenu,
Expand All @@ -24,22 +17,29 @@ import {
ProgressBar,
Spinner,
Tooltip,
} from "../../index";
} from "../../components";
import { ValidIconName } from "../../components/Icon/canonicalIconNames";
import { IconProps } from "../../components/Icon/Icon";
import { TestIconProps } from "../../components/Icon/TestIcon";
import { TestableComponent } from "../../components/interfaces";
import { ProgressBarProps } from "../../components/ProgressBar/ProgressBar";
import { SpinnerProps } from "../../components/Spinner/Spinner";
import { CLASSPREFIX as eccgui } from "../../configuration/constants";

export interface ActivityControlWidgetProps extends TestableComponent {
/**
* The label to be shown
*/
label?: string | JSX.Element;
label?: string | React.JSX.Element;
/**
* Element that wraps around the label.
* Default: `<OverflowText inline={true} />`
*/
labelWrapper?: JSX.Element;
labelWrapper?: React.JSX.Element;
/**
* To add tags in addition to the widget status description
*/
tags?: JSX.Element;
tags?: React.JSX.Element;
/**
* The progress bar parameters if it should be show by a progres bar
*/
Expand Down Expand Up @@ -83,7 +83,7 @@ export interface ActivityControlWidgetProps extends TestableComponent {
/**
* execution timer messages for waiting and running times.
*/
timerExecutionMsg?: JSX.Element | null;
timerExecutionMsg?: React.JSX.Element | null;
/**
* additional actions that can serve as a complex component, positioned between the default actions and the context menu
*/
Expand Down Expand Up @@ -159,7 +159,7 @@ export function ActivityControlWidget(props: ActivityControlWidgetProps) {
keepColors
>
{progressSpinnerFinishedIcon ? (
React.cloneElement(progressSpinnerFinishedIcon as JSX.Element, { small, large: !small })
React.cloneElement(progressSpinnerFinishedIcon as React.JSX.Element, { small, large: !small })
) : (
<Spinner
position="inline"
Expand Down
10 changes: 6 additions & 4 deletions src/cmem/ActivityControl/ActivityExecutionErrorReportModal.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import React, { useState } from "react";

import { Button, HtmlContentBlock, IconButton, SimpleDialog } from "../../index";
import React, {useState} from "react";
import SimpleDialog from "../../components/Dialog/SimpleDialog";
import IconButton from "../../components/Icon/IconButton";
import Button from "../../components/Button/Button";
import HtmlContentBlock from "../../components/Typography/HtmlContentBlock";

interface ActivityExecutionErrorReportModalProps {
// Title of the modal
title?: string;
// Called when the close button is clicked
onDiscard: () => any;
// The error report
report: JSX.Element;
report: React.JSX.Element;
// Value of the download button
downloadButtonValue: string;
// Value of the close button
Expand Down
8 changes: 4 additions & 4 deletions src/cmem/ActivityControl/SilkActivityControl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ const progressBreakpointAnimation = 99;

export interface SilkActivityControlProps extends TestableComponent {
// The label of this activity
label: string | JSX.Element;
label: string | React.JSX.Element;
/**
* To add tags in addition to the widget status description
*/
tags?: JSX.Element;
tags?: React.JSX.Element;
// Initial state
initialStatus?: SilkActivityStatusProps;
// Register a function in order to receive callbacks
Expand Down Expand Up @@ -80,7 +80,7 @@ export interface SilkActivityControlLayoutProps {
// what type of progrss display should be uses, horizontal progress bar, circular spinner, or none of that
visualization?: "none" | "progressbar" | "spinner";
// wrapper around label
labelWrapper?: JSX.Element;
labelWrapper?: React.JSX.Element;
}

const defaultLayout: SilkActivityControlLayoutProps = {
Expand All @@ -94,7 +94,7 @@ interface IErrorReportAction {
// The title of the error report modal
title?: string;
// The element that will be rendered in the modal, either as Markdown or object
renderReport: (report: string | SilkActivityExecutionReportProps) => JSX.Element;
renderReport: (report: string | SilkActivityExecutionReportProps) => React.JSX.Element;
// What version of the report should be handed to the renderReport function, if false SilkActivityExecutionReportProps, if true the Markdown string
renderMarkdown: boolean;
// The function to fetch the error report. It returns undefined if something went wrong.
Expand Down
24 changes: 17 additions & 7 deletions src/cmem/ContentBlobToggler/ContentBlobToggler.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import React, { useState } from "react";

import { Link, Spacing } from "../../index";
import Link from "../../components/Link/Link";
import Spacing from "../../components/Separation/Spacing";
import InlineText from "../../components/Typography/InlineText";

export interface ContentBlobTogglerProps extends React.HTMLAttributes<HTMLDivElement> {
/**
Expand Down Expand Up @@ -31,6 +33,10 @@ export interface ContentBlobTogglerProps extends React.HTMLAttributes<HTMLDivEle
Callback if toggler is necessary. Default: true
*/
enableToggler?: boolean;
/**
* Force always inline rendering.
*/
forceInline?: boolean;
}

/** Shows a preview with the option to expand to a full view (and back). */
Expand All @@ -42,27 +48,29 @@ export function ContentBlobToggler({
fullviewContent,
startExtended = false,
enableToggler = true,
forceInline = false,
...otherProps
}: ContentBlobTogglerProps) {
const [isExtended, setViewState] = useState(startExtended);
const handlerToggleView = (event: any) => {
const handlerToggleView = (event: React.MouseEvent<HTMLAnchorElement>) => {
event.preventDefault();
event.stopPropagation();
setViewState(!isExtended);
};

return (
const tooglerDisplay = (
<div className={className} {...otherProps}>
{!isExtended ? (
<>
{previewContent}
{enableToggler && (
<>
{" "}&hellip;{" "}
{" "}
&hellip;{" "}
<Link
href="#more"
data-test-id={"content-blob-toggler-more-link"}
onClick={(e: any) => {
onClick={(e: React.MouseEvent<HTMLAnchorElement>) => {
handlerToggleView(e);
}}
>
Expand All @@ -76,11 +84,11 @@ export function ContentBlobToggler({
{fullviewContent}
{enableToggler && (
<div>
<Spacing size="small" />
{forceInline ? <> </> : <Spacing size="small" />}
<Link
data-test-id={"content-blob-toggler-less-link"}
href="#less"
onClick={(e: any) => {
onClick={(e: React.MouseEvent<HTMLAnchorElement>) => {
handlerToggleView(e);
}}
>
Expand All @@ -92,4 +100,6 @@ export function ContentBlobToggler({
)}
</div>
);

return forceInline ? <InlineText>{tooglerDisplay}</InlineText> : tooglerDisplay;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import React from "react";
import {ContentBlobToggler, ContentBlobTogglerProps} from "./ContentBlobToggler";
import {Markdown} from "../markdown/Markdown";
import {utils} from "../../common";
import InlineText from "../../components/Typography/InlineText";

import { ContentBlobToggler, ContentBlobTogglerProps, InlineText, Markdown, utils } from "./../../index";

export interface StringPreviewContentBlobTogglerProps
extends Omit<ContentBlobTogglerProps, "previewContent" | "enableToggler"> {
Expand Down Expand Up @@ -31,7 +34,7 @@ export interface StringPreviewContentBlobTogglerProps
* Allows to add non-string elements at the end of the content if the full description is shown, i.e. no toggler is necessary.
* This allows to add non-string elements to both the full-view content and the pure string content.
*/
noTogglerContentSuffix?: JSX.Element;
noTogglerContentSuffix?: React.JSX.Element;
/**
* If only the first non-empty line should be shown in the preview.
* This will in addition also be shortened according to `previewMaxLength`.
Expand All @@ -54,6 +57,7 @@ export function StringPreviewContentBlobToggler({
allowedHtmlElementsInPreview,
noTogglerContentSuffix,
firstNonEmptyLineOnly,
...otherContentBlobTogglerProps
}: StringPreviewContentBlobTogglerProps) {
// need to test `firstNonEmptyLineOnly` until property is removed
const useOnlyTest: StringPreviewContentBlobTogglerProps["useOnly"] = firstNonEmptyLineOnly
Expand Down Expand Up @@ -105,6 +109,7 @@ export function StringPreviewContentBlobToggler({
fullviewContent={fullviewContent}
startExtended={startExtended}
enableToggler={enableToggler}
{...otherContentBlobTogglerProps}
/>
);
}
Expand Down
3 changes: 2 additions & 1 deletion src/cmem/markdown/Markdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ import { remarkDefinitionList } from "remark-definition-list";
import remarkGfm from "remark-gfm";
import { PluggableList } from "unified";

import { TestableComponent } from "../../components";
import { HtmlContentBlock, HtmlContentBlockProps } from "../../components/Typography";
import { CLASSPREFIX as eccgui } from "../../configuration/constants";
import { HtmlContentBlock, HtmlContentBlockProps, TestableComponent } from "../../index";

export interface MarkdownProps extends TestableComponent {
children: string;
Expand Down
Loading
Loading