diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9b550f94..ef821cc4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,9 +11,12 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- ``
- component for hiding elements in specific media
- ``
- - force children to get displayed as inline content
+ - force children to get displayed as inline content
- ``
- - `useOnly` property: specify if only parts of the content should be used for the shortened preview, this property replaces `firstNonEmptyLineOnly`
+ - `useOnly` property: specify if only parts of the content should be used for the shortened preview, this property replaces `firstNonEmptyLineOnly`
+- new icons:
+ - `state-confirmed-all`
+ - `state-declined-all`
### Fixed
@@ -21,9 +24,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- create more whitespace inside `small` tag
- reduce visual impact of border
- ``
- - take Markdown rendering into account before testing the maximum preview length
-- ``
- - header-menu items are vertically centered now
+ - take Markdown rendering into account before testing the maximum preview length
+- ``
+ - fix `disabled` property update
### Changed
@@ -37,16 +40,28 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- ``
- ``
- `` and ``
+- ``
+ - reduce stroke width to only 1px
### Deprecated
- ``
- - `firstNonEmptyLineOnly` will be removed, is replaced by `useOnly="firstNonEmptyLine"`
+ - `firstNonEmptyLineOnly` will be removed, is replaced by `useOnly="firstNonEmptyLine"`
## [25.0.0] - 2025-12-01
This is a major release, and it might be not compatible with your current usage of our library. Please read about the necessary changes in the section about how to migrate.
+### Added
+
+- ``
+ - Add parameter `active` to activity control action to set the `active` state of its button.
+
+### Changed
+
+- ``:
+ - Change default filter predicate to match multi-word queries.
+
### Migration from v24 to v25
- remove deprecated components, properties and imports from your project, if the info cannot be found here then it was already mentioned in **Deprecated** sections of the past changelogs
diff --git a/src/cmem/ActivityControl/ActivityControlWidget.tsx b/src/cmem/ActivityControl/ActivityControlWidget.tsx
index efda5060..b529f96a 100644
--- a/src/cmem/ActivityControl/ActivityControlWidget.tsx
+++ b/src/cmem/ActivityControl/ActivityControlWidget.tsx
@@ -1,17 +1,20 @@
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 {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,
+ ContextOverlay,
IconButton,
MenuItem,
+ Notification,
+ NotificationProps,
OverflowText,
OverviewItem,
OverviewItemActions,
@@ -97,7 +100,7 @@ interface IActivityContextMenu extends TestableComponent {
export interface ActivityControlWidgetAction extends TestableComponent {
// The action that should be triggered
action: () => void;
- // The tooltip that should be shown over the action icon
+ // The tooltip that should be shown over the action icon on hover
tooltip?: string;
// The icon of the action button
icon: ValidIconName | React.ReactElement;
@@ -105,6 +108,16 @@ export interface ActivityControlWidgetAction extends TestableComponent {
disabled?: boolean;
// Warning state
hasStateWarning?: boolean;
+ // Active state
+ active?: boolean
+ /** A notification that is shown in an overlay pointing at the activity action button. */
+ notification?: {
+ message: string
+ onClose: () => void
+ intent?: NotificationProps["intent"]
+ // Timeout in ms before notification is closed. Default: none
+ timeout?: number
+ }
}
interface IActivityMenuAction extends ActivityControlWidgetAction {
@@ -210,26 +223,39 @@ export function ActivityControlWidget(props: ActivityControlWidgetProps) {
>
{activityActions &&
activityActions.map((action, idx) => {
- return (
-
- );
+ const ActionButton = () =>
+ return action.notification ?
+ }
+ defaultIsOpen={true}
+ onClose={action.notification.onClose}
+ >
+
+ :
+
})}
{additionalActions}
{activityContextMenu && activityContextMenu.menuItems.length > 0 && (
diff --git a/src/components/DecoupledOverlay/DecoupledOverlay.stories.tsx b/src/components/DecoupledOverlay/DecoupledOverlay.stories.tsx
new file mode 100644
index 00000000..ecc5eb35
--- /dev/null
+++ b/src/components/DecoupledOverlay/DecoupledOverlay.stories.tsx
@@ -0,0 +1,30 @@
+import React from "react";
+import { Meta, StoryFn } from "@storybook/react";
+
+import { DecoupledOverlay, DecoupledOverlayProps, Tag, WhiteSpaceContainer } from "../../../index";
+
+export default {
+ title: "Components/DecoupledOverlay",
+ component: DecoupledOverlay,
+ argTypes: {},
+} as Meta;
+
+const Template: StoryFn = (args: DecoupledOverlayProps) => {
+ return (
+ <>
+ Decoupled target
+
+ >
+ );
+};
+
+export const Default = Template.bind({});
+
+Default.args = {
+ children: (
+
+ Decoupled overlay
+
+ ),
+ targetSelectorOrElement: "#decoupledTarget",
+};
diff --git a/src/components/DecoupledOverlay/DecoupledOverlay.tsx b/src/components/DecoupledOverlay/DecoupledOverlay.tsx
new file mode 100644
index 00000000..d5dde670
--- /dev/null
+++ b/src/components/DecoupledOverlay/DecoupledOverlay.tsx
@@ -0,0 +1,86 @@
+import React from "react";
+import { createPortal } from "react-dom";
+import { Classes as BlueprintClasses } from "@blueprintjs/core";
+import { createPopper } from "@popperjs/core";
+
+import { CLASSPREFIX as eccgui } from "../../configuration/constants";
+import { ContextOverlayProps, TestableComponent, TooltipSize } from "../../index";
+
+export interface DecoupledOverlayProps
+ extends React.HTMLAttributes,
+ TestableComponent,
+ Pick {
+ /**
+ * Element that should be used. The step content is displayed as a tooltip instead of a modal.
+ * In case of an array, the first match is highlighted. */
+ targetSelectorOrElement: string | Element;
+ /**
+ * The size of the overlay.
+ * */
+ size?: TooltipSize;
+}
+
+/**
+ * Use an overlay popover without the necessity to use a target that need to be rendered in place.
+ * The target is referenced by a selector string or element object.
+ * It can exist somewhere in the DOM, but it must exist when the overlay is rendered.
+ * It is always displayed, close it by removement.
+ */
+export const DecoupledOverlay = ({
+ targetSelectorOrElement,
+ usePortal = true,
+ portalContainer = document.body,
+ minimal = false,
+ placement = "auto",
+ size = "large",
+ children,
+}: DecoupledOverlayProps) => {
+ const overlayRef = React.useCallback(
+ (overlay: HTMLDivElement | null) => {
+ const target =
+ typeof targetSelectorOrElement === "string"
+ ? document.querySelector(targetSelectorOrElement)
+ : targetSelectorOrElement;
+ if (overlay && target) {
+ createPopper(target, overlay, {
+ placement: placement,
+ modifiers: [
+ {
+ name: "offset",
+ options: {
+ offset: [0, 15],
+ },
+ },
+ ],
+ });
+ }
+ },
+ [targetSelectorOrElement]
+ );
+
+ const overlay = (
+