@eccenca/gui-elements 25.0.0-rc.2 → 25.1.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/CHANGELOG.md +64 -18
  2. package/dist/cjs/cmem/ActivityControl/SilkActivityControl.js +1 -3
  3. package/dist/cjs/cmem/ActivityControl/SilkActivityControl.js.map +1 -1
  4. package/dist/cjs/cmem/ContentBlobToggler/ContentBlobToggler.js +1 -0
  5. package/dist/cjs/cmem/ContentBlobToggler/ContentBlobToggler.js.map +1 -1
  6. package/dist/cjs/cmem/ContentBlobToggler/StringPreviewContentBlobToggler.js +34 -11
  7. package/dist/cjs/cmem/ContentBlobToggler/StringPreviewContentBlobToggler.js.map +1 -1
  8. package/dist/cjs/cmem/react-flow/ReactFlow/ReactFlowV12.js.map +1 -1
  9. package/dist/cjs/common/Intent/index.js +1 -1
  10. package/dist/cjs/common/Intent/index.js.map +1 -1
  11. package/dist/cjs/common/index.js +3 -1
  12. package/dist/cjs/common/index.js.map +1 -1
  13. package/dist/cjs/common/utils/reduceToText.js +26 -1
  14. package/dist/cjs/common/utils/reduceToText.js.map +1 -1
  15. package/dist/cjs/components/Application/ApplicationViewability.js +33 -0
  16. package/dist/cjs/components/Application/ApplicationViewability.js.map +1 -0
  17. package/dist/cjs/components/Application/index.js +1 -0
  18. package/dist/cjs/components/Application/index.js.map +1 -1
  19. package/dist/cjs/components/ContextOverlay/ContextMenu.js +2 -2
  20. package/dist/cjs/components/ContextOverlay/ContextMenu.js.map +1 -1
  21. package/dist/cjs/components/ContextOverlay/ContextOverlay.js +62 -24
  22. package/dist/cjs/components/ContextOverlay/ContextOverlay.js.map +1 -1
  23. package/dist/cjs/components/Icon/IconButton.js.map +1 -1
  24. package/dist/cjs/components/TextReducer/TextReducer.js +15 -3
  25. package/dist/cjs/components/TextReducer/TextReducer.js.map +1 -1
  26. package/dist/cjs/components/Typography/InlineText.js +29 -0
  27. package/dist/cjs/components/Typography/InlineText.js.map +1 -0
  28. package/dist/cjs/components/Typography/index.js +1 -0
  29. package/dist/cjs/components/Typography/index.js.map +1 -1
  30. package/dist/cjs/extensions/codemirror/CodeMirror.js +2 -2
  31. package/dist/cjs/extensions/codemirror/CodeMirror.js.map +1 -1
  32. package/dist/cjs/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.js +1 -1
  33. package/dist/cjs/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.js.map +1 -1
  34. package/dist/cjs/extensions/codemirror/tests/codemirrorTestHelper.js +2 -2
  35. package/dist/cjs/extensions/codemirror/tests/codemirrorTestHelper.js.map +1 -1
  36. package/dist/cjs/extensions/react-flow/edges/EdgeNew.js +1 -1
  37. package/dist/cjs/extensions/react-flow/edges/EdgeNew.js.map +1 -1
  38. package/dist/cjs/extensions/react-flow/handles/HandleDefault.js +1 -1
  39. package/dist/cjs/extensions/react-flow/handles/HandleDefault.js.map +1 -1
  40. package/dist/cjs/extensions/react-flow/minimap/MiniMap.js +1 -1
  41. package/dist/cjs/extensions/react-flow/minimap/MiniMap.js.map +1 -1
  42. package/dist/cjs/extensions/react-flow/minimap/MiniMapV12.js.map +1 -1
  43. package/dist/cjs/extensions/react-flow/nodes/nodeUtils.js.map +1 -1
  44. package/dist/esm/cmem/ActivityControl/SilkActivityControl.js +1 -3
  45. package/dist/esm/cmem/ActivityControl/SilkActivityControl.js.map +1 -1
  46. package/dist/esm/cmem/ContentBlobToggler/ContentBlobToggler.js +1 -0
  47. package/dist/esm/cmem/ContentBlobToggler/ContentBlobToggler.js.map +1 -1
  48. package/dist/esm/cmem/ContentBlobToggler/StringPreviewContentBlobToggler.js +32 -9
  49. package/dist/esm/cmem/ContentBlobToggler/StringPreviewContentBlobToggler.js.map +1 -1
  50. package/dist/esm/cmem/react-flow/ReactFlow/ReactFlowV12.js.map +1 -1
  51. package/dist/esm/common/Intent/index.js +1 -1
  52. package/dist/esm/common/Intent/index.js.map +1 -1
  53. package/dist/esm/common/index.js +3 -1
  54. package/dist/esm/common/index.js.map +1 -1
  55. package/dist/esm/common/utils/reduceToText.js +37 -1
  56. package/dist/esm/common/utils/reduceToText.js.map +1 -1
  57. package/dist/esm/components/Application/ApplicationViewability.js +28 -0
  58. package/dist/esm/components/Application/ApplicationViewability.js.map +1 -0
  59. package/dist/esm/components/Application/index.js +1 -0
  60. package/dist/esm/components/Application/index.js.map +1 -1
  61. package/dist/esm/components/ContextOverlay/ContextMenu.js +2 -2
  62. package/dist/esm/components/ContextOverlay/ContextMenu.js.map +1 -1
  63. package/dist/esm/components/ContextOverlay/ContextOverlay.js +66 -28
  64. package/dist/esm/components/ContextOverlay/ContextOverlay.js.map +1 -1
  65. package/dist/esm/components/Icon/IconButton.js.map +1 -1
  66. package/dist/esm/components/TextReducer/TextReducer.js +14 -3
  67. package/dist/esm/components/TextReducer/TextReducer.js.map +1 -1
  68. package/dist/esm/components/Typography/InlineText.js +33 -0
  69. package/dist/esm/components/Typography/InlineText.js.map +1 -0
  70. package/dist/esm/components/Typography/index.js +1 -0
  71. package/dist/esm/components/Typography/index.js.map +1 -1
  72. package/dist/esm/extensions/codemirror/CodeMirror.js +3 -3
  73. package/dist/esm/extensions/codemirror/CodeMirror.js.map +1 -1
  74. package/dist/esm/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.js +1 -1
  75. package/dist/esm/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.js.map +1 -1
  76. package/dist/esm/extensions/codemirror/tests/codemirrorTestHelper.js +3 -3
  77. package/dist/esm/extensions/codemirror/tests/codemirrorTestHelper.js.map +1 -1
  78. package/dist/esm/extensions/react-flow/edges/EdgeNew.js +1 -1
  79. package/dist/esm/extensions/react-flow/edges/EdgeNew.js.map +1 -1
  80. package/dist/esm/extensions/react-flow/handles/HandleDefault.js +1 -1
  81. package/dist/esm/extensions/react-flow/handles/HandleDefault.js.map +1 -1
  82. package/dist/esm/extensions/react-flow/minimap/MiniMap.js +1 -1
  83. package/dist/esm/extensions/react-flow/minimap/MiniMap.js.map +1 -1
  84. package/dist/esm/extensions/react-flow/minimap/MiniMapV12.js.map +1 -1
  85. package/dist/esm/extensions/react-flow/nodes/nodeUtils.js.map +1 -1
  86. package/dist/types/cmem/ContentBlobToggler/StringPreviewContentBlobToggler.d.ts +26 -10
  87. package/dist/types/common/index.d.ts +2 -0
  88. package/dist/types/common/utils/reduceToText.d.ts +1 -1
  89. package/dist/types/components/Application/ApplicationViewability.d.ts +36 -0
  90. package/dist/types/components/Application/index.d.ts +1 -0
  91. package/dist/types/components/ContextOverlay/ContextMenu.d.ts +1 -1
  92. package/dist/types/components/Icon/IconButton.d.ts +1 -1
  93. package/dist/types/components/Structure/TitleSubsection.d.ts +1 -1
  94. package/dist/types/components/Tabs/Tab.d.ts +2 -2
  95. package/dist/types/components/TextReducer/TextReducer.d.ts +13 -1
  96. package/dist/types/components/Typography/InlineText.d.ts +13 -0
  97. package/dist/types/components/Typography/index.d.ts +1 -0
  98. package/dist/types/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.d.ts +1 -1
  99. package/dist/types/extensions/codemirror/tests/codemirrorTestHelper.d.ts +1 -1
  100. package/package.json +54 -53
  101. package/src/cmem/ActivityControl/SilkActivityControl.tsx +1 -1
  102. package/src/cmem/ContentBlobToggler/ContentBlobToggler.tsx +1 -1
  103. package/src/cmem/ContentBlobToggler/StringPreviewContentBlobToggler.tsx +66 -18
  104. package/src/cmem/ContentBlobToggler/stories/StringPreviewContentBlobToggler.stories.tsx +27 -0
  105. package/src/cmem/ContentBlobToggler/tests/StringPreviewContentBlobToggler.test.tsx +98 -0
  106. package/src/cmem/react-flow/ReactFlow/ReactFlowV12.tsx +1 -0
  107. package/src/common/Intent/index.ts +2 -1
  108. package/src/common/index.ts +6 -2
  109. package/src/common/utils/reduceToText.tsx +30 -2
  110. package/src/components/Application/ApplicationViewability.tsx +61 -0
  111. package/src/components/Application/_content.scss +7 -0
  112. package/src/components/Application/_header.scss +12 -3
  113. package/src/components/Application/_viewability.scss +13 -0
  114. package/src/components/Application/application.scss +1 -0
  115. package/src/components/Application/index.ts +1 -0
  116. package/src/components/Application/stories/ApplicationViewability.stories.tsx +37 -0
  117. package/src/components/Application/tests/ApplicationViewability.test.tsx +43 -0
  118. package/src/components/AutoSuggestion/tests/ExtendedCodeEditor.test.tsx +1 -1
  119. package/src/components/Card/card.scss +6 -0
  120. package/src/components/Checkbox/checkbox.scss +14 -2
  121. package/src/components/ContentGroup/_contentgroup.scss +9 -0
  122. package/src/components/ContextOverlay/ContextMenu.tsx +4 -1
  123. package/src/components/ContextOverlay/ContextOverlay.tsx +74 -24
  124. package/src/components/ContextOverlay/tests/ContextMenu.test.tsx +43 -0
  125. package/src/components/ContextOverlay/tests/ContextOverlay.test.tsx +71 -0
  126. package/src/components/Depiction/depiction.scss +6 -0
  127. package/src/components/Dialog/stories/Modal.stories.tsx +12 -150
  128. package/src/components/Dialog/stories/ModalContext.stories.tsx +153 -0
  129. package/src/components/FlexibleLayout/flexiblelayout.scss +16 -0
  130. package/src/components/Grid/grid.scss +17 -0
  131. package/src/components/Grid/stories/Grid.stories.tsx +10 -7
  132. package/src/components/Grid/stories/GridRow.stories.tsx +13 -7
  133. package/src/components/Icon/IconButton.tsx +1 -1
  134. package/src/components/Notification/notification.scss +6 -0
  135. package/src/components/OverviewItem/overviewitem.scss +9 -0
  136. package/src/components/OverviewItem/stories/OverviewItem.stories.tsx +28 -0
  137. package/src/components/OverviewItem/stories/OverviewItemActions.stories.tsx +2 -2
  138. package/src/components/OverviewItem/stories/OverviewItemDescription.stories.tsx +1 -1
  139. package/src/components/OverviewItem/stories/OverviewItemLine.stories.tsx +1 -1
  140. package/src/components/PropertyValuePair/propertyvalue.scss +23 -1
  141. package/src/components/Separation/separation.scss +6 -0
  142. package/src/components/Table/table.scss +22 -0
  143. package/src/components/Tabs/stories/TabTitle.stories.tsx +7 -2
  144. package/src/components/Tag/stories/TagList.stories.tsx +2 -2
  145. package/src/components/Tag/tag.scss +19 -9
  146. package/src/components/TextReducer/TextReducer.stories.tsx +2 -1
  147. package/src/components/TextReducer/TextReducer.test.tsx +44 -0
  148. package/src/components/TextReducer/TextReducer.tsx +14 -4
  149. package/src/components/Typography/InlineText.tsx +24 -0
  150. package/src/components/Typography/_reset.scss +1 -0
  151. package/src/components/Typography/index.ts +1 -0
  152. package/src/components/Typography/stories/InlineText.stories.tsx +27 -0
  153. package/src/components/Typography/typography.scss +28 -2
  154. package/src/extensions/codemirror/CodeMirror.tsx +4 -4
  155. package/src/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.ts +1 -2
  156. package/src/extensions/codemirror/tests/codemirrorTestHelper.ts +3 -3
  157. package/src/extensions/react-flow/edges/EdgeNew.tsx +2 -1
  158. package/src/extensions/react-flow/handles/HandleDefault.tsx +2 -2
  159. package/src/extensions/react-flow/minimap/MiniMap.tsx +2 -1
  160. package/src/extensions/react-flow/minimap/MiniMapV12.tsx +1 -1
  161. package/src/extensions/react-flow/nodes/_nodes.scss +4 -3
  162. package/src/extensions/react-flow/nodes/nodeUtils.tsx +1 -0
  163. package/src/extensions/react-flow/nodes/stories/NodeContent.stories.tsx +2 -2
@@ -0,0 +1,43 @@
1
+ import React from "react";
2
+ import { fireEvent, render, screen } from "@testing-library/react";
3
+
4
+ import "@testing-library/jest-dom";
5
+
6
+ import { CLASSPREFIX as eccgui } from "../../../configuration/constants";
7
+
8
+ import ContextMenu from "./../ContextMenu";
9
+ import { Default as ContextMenuStory } from "./../ContextMenu.stories";
10
+
11
+ const overlayWrapper = `${eccgui}-contextoverlay`;
12
+ const placeholderClass = `${overlayWrapper}__wrapper--placeholder`;
13
+
14
+ const checkForPlaceholderClass = (container: HTMLElement, tobe: number) => {
15
+ expect(container.getElementsByClassName(placeholderClass).length).toBe(tobe);
16
+ };
17
+
18
+ describe("ContextMenu", () => {
19
+ it("should render placeholder automatically", () => {
20
+ const { container } = render(<ContextMenu {...ContextMenuStory.args} />);
21
+ checkForPlaceholderClass(container, 1);
22
+ });
23
+ it("should not render placeholder when `preventPlaceholder===true`", () => {
24
+ const { container } = render(<ContextMenu {...ContextMenuStory.args} preventPlaceholder={true} />);
25
+ checkForPlaceholderClass(container, 0);
26
+ });
27
+ it("should render placeholder when `preventPlaceholder===false`", () => {
28
+ const { container } = render(<ContextMenu {...ContextMenuStory.args} preventPlaceholder={false} />);
29
+ checkForPlaceholderClass(container, 1);
30
+ });
31
+ it("if no placeholder is used the menu should be displayed on click", async () => {
32
+ const { container } = render(<ContextMenu {...ContextMenuStory.args} preventPlaceholder={true} />);
33
+ checkForPlaceholderClass(container, 0);
34
+ fireEvent.click(container.getElementsByClassName(overlayWrapper)[0]);
35
+ expect(await screen.findByText("First option")).toBeVisible();
36
+ });
37
+ it("if placeholder is used the menu should be displayed on click", async () => {
38
+ const { container } = render(<ContextMenu {...ContextMenuStory.args} preventPlaceholder={false} />);
39
+ checkForPlaceholderClass(container, 1);
40
+ fireEvent.click(container.getElementsByClassName(overlayWrapper)[0]);
41
+ expect(await screen.findByText("First option")).toBeVisible();
42
+ });
43
+ });
@@ -0,0 +1,71 @@
1
+ import React from "react";
2
+ import { PopoverInteractionKind } from "@blueprintjs/core";
3
+ import { fireEvent, render, screen, waitFor } from "@testing-library/react";
4
+
5
+ import "@testing-library/jest-dom";
6
+
7
+ import { CLASSPREFIX as eccgui } from "../../../configuration/constants";
8
+
9
+ import ContextOverlay from "./../ContextOverlay";
10
+ import { Default as ContextOverlayStory } from "./../ContextOverlay.stories";
11
+
12
+ const overlayWrapper = `${eccgui}-contextoverlay`;
13
+ const placeholderClass = `${overlayWrapper}__wrapper--placeholder`;
14
+
15
+ const checkForPlaceholderClass = (container: HTMLElement, tobe: number) => {
16
+ expect(container.getElementsByClassName(placeholderClass).length).toBe(tobe);
17
+ };
18
+
19
+ describe("ContextOverlay", () => {
20
+ it("should not render placeholder automatically", () => {
21
+ const { container } = render(<ContextOverlay {...ContextOverlayStory.args} />);
22
+ checkForPlaceholderClass(container, 0);
23
+ });
24
+ it("should render placeholder when `usePlaceholder===true`", () => {
25
+ const { container } = render(<ContextOverlay {...ContextOverlayStory.args} usePlaceholder={true} />);
26
+ checkForPlaceholderClass(container, 1);
27
+ });
28
+ it("should render no placeholder when `usePlaceholder===false`", () => {
29
+ const { container } = render(<ContextOverlay {...ContextOverlayStory.args} usePlaceholder={false} />);
30
+ checkForPlaceholderClass(container, 0);
31
+ });
32
+ it("if no placeholder is used the overlay should be displayed on click", async () => {
33
+ const { container } = render(<ContextOverlay {...ContextOverlayStory.args} usePlaceholder={false} />);
34
+ fireEvent.click(container.getElementsByClassName(overlayWrapper)[0]);
35
+ expect(await screen.findByText("Overlay:")).toBeVisible();
36
+ });
37
+ it("if no placeholder is used the overlay should be displayed on hover (hover interactionKind)", async () => {
38
+ const { container } = render(
39
+ <ContextOverlay
40
+ {...ContextOverlayStory.args}
41
+ usePlaceholder={false}
42
+ interactionKind={PopoverInteractionKind.HOVER}
43
+ />
44
+ );
45
+ fireEvent.mouseEnter(container.getElementsByClassName(overlayWrapper)[0]);
46
+ expect(await screen.findByText("Overlay:")).toBeVisible();
47
+ });
48
+ it("if placeholder is used the overlay should be displayed on click", async () => {
49
+ const { container } = render(<ContextOverlay {...ContextOverlayStory.args} usePlaceholder={true} />);
50
+ fireEvent.click(container.getElementsByClassName(overlayWrapper)[0]);
51
+ expect(await screen.findByText("Overlay:")).toBeVisible();
52
+ });
53
+ it("if placeholder is used the overlay should be displayed on hover (hover interactionKind)", async () => {
54
+ const { container } = render(
55
+ <ContextOverlay
56
+ {...ContextOverlayStory.args}
57
+ usePlaceholder={true}
58
+ interactionKind={PopoverInteractionKind.HOVER}
59
+ />
60
+ );
61
+ checkForPlaceholderClass(container, 1);
62
+ fireEvent.mouseEnter(container.getElementsByClassName(overlayWrapper)[0]);
63
+ await waitFor(async () => {
64
+ expect(screen.queryByDisplayValue("Overlay:")).toBeNull();
65
+ checkForPlaceholderClass(container, 0);
66
+ // we need to emulate another mouseover to simulate real user behaviour
67
+ fireEvent.mouseOver(container.getElementsByClassName(overlayWrapper)[0]);
68
+ expect(await screen.findByText("Overlay:")).toBeVisible();
69
+ });
70
+ });
71
+ });
@@ -220,3 +220,9 @@ $eccgui-size-depiction-border-radius: $pt-border-radius !default;
220
220
  position: fixed;
221
221
  left: -5000rem;
222
222
  }
223
+
224
+ @media print {
225
+ .#{$eccgui}-depiction {
226
+ print-color-adjust: exact;
227
+ }
228
+ }
@@ -1,20 +1,11 @@
1
1
  import React from "react";
2
- import { Classes, OverlaysProvider } from "@blueprintjs/core";
2
+ import { OverlaysProvider } from "@blueprintjs/core";
3
3
  import { Meta, StoryFn } from "@storybook/react";
4
4
  import { fn } from "@storybook/test";
5
5
 
6
6
  import { SimpleCard } from "../../Card/stories/Card.stories";
7
7
 
8
- import {
9
- Button,
10
- Card,
11
- CardContent,
12
- Modal,
13
- ModalContext,
14
- ModalSize,
15
- Spacing,
16
- useModalContext,
17
- } from "./../../../../index";
8
+ import { Card, Modal } from "./../../../../index";
18
9
 
19
10
  export default {
20
11
  title: "Components/Dialog/Modal",
@@ -24,15 +15,18 @@ export default {
24
15
  control: false,
25
16
  },
26
17
  },
18
+ decorators: [
19
+ (Story) => (
20
+ <OverlaysProvider>
21
+ <div style={{ height: "400px" }}>
22
+ <Story />
23
+ </div>
24
+ </OverlaysProvider>
25
+ ),
26
+ ],
27
27
  } as Meta<typeof Modal>;
28
28
 
29
- const Template: StoryFn<typeof Modal> = (args) => (
30
- <OverlaysProvider>
31
- <div style={{ height: "400px" }}>
32
- <Modal {...args} />
33
- </div>
34
- </OverlaysProvider>
35
- );
29
+ const Template: StoryFn<typeof Modal> = (args) => <Modal {...args} />;
36
30
 
37
31
  export const Default = Template.bind({});
38
32
  Default.args = {
@@ -42,135 +36,3 @@ Default.args = {
42
36
  onOpening: fn(),
43
37
  onClosing: fn(),
44
38
  };
45
-
46
- const ContextTemplate = ({ children }: React.HTMLAttributes<HTMLDivElement>) => {
47
- const { setModalOpen, openModalStack } = useModalContext();
48
-
49
- return (
50
- <OverlaysProvider>
51
- <div style={{ height: "70vh", position: "relative" }} id={"modalPortal"}>
52
- <ModalContext.Provider value={{ setModalOpen, openModalStack }}>{children}</ModalContext.Provider>
53
- </div>
54
- </OverlaysProvider>
55
- );
56
- };
57
-
58
- const ModalContent = ({ children }: React.HTMLAttributes<HTMLDivElement>) => {
59
- return (
60
- <Card style={{ height: "100%" }}>
61
- <CardContent>{children}</CardContent>
62
- </Card>
63
- );
64
- };
65
-
66
- /** Component for nested modals. */
67
- const ExampleModal = ({
68
- id,
69
- size,
70
- children,
71
- }: {
72
- id?: string;
73
- size: ModalSize;
74
- children?: React.HTMLAttributes<HTMLDivElement>["children"];
75
- }) => {
76
- const [isOpen, setIsOpen] = React.useState(true);
77
- const [portalElement, setPortalElement] = React.useState<HTMLElement | undefined>();
78
-
79
- React.useEffect(() => {
80
- setPortalElement(document.getElementById("modalPortal")!);
81
- }, []);
82
-
83
- return (
84
- <Modal
85
- modalId={id}
86
- size={size}
87
- isOpen={isOpen}
88
- usePortal={true}
89
- portalContainer={portalElement}
90
- hasBackdrop={true}
91
- onOpened={() => {
92
- // workaround, Blueprint attach a class to body tht prevents scrolling, probably it is attached to the wrong portal
93
- document.body.classList.remove(Classes.OVERLAY_OPEN);
94
- }}
95
- >
96
- <ModalContent>
97
- Modal with constant modal ID "{id}".
98
- <Spacing />
99
- <TrackingContent />
100
- <Spacing />
101
- {children}
102
- <Spacing />
103
- <Button key={"close"} onClick={() => setIsOpen(false)}>
104
- Close
105
- </Button>
106
- </ModalContent>
107
- </Modal>
108
- );
109
- };
110
-
111
- const InnerModal = () => {
112
- return <ExampleModal id="innerModal" size="small" />;
113
- };
114
-
115
- const MiddleModal = () => {
116
- return (
117
- <ExampleModal id="middleModal" size="regular">
118
- <InnerModal />
119
- </ExampleModal>
120
- );
121
- };
122
-
123
- /** Shows the current stack of open modals. */
124
- const TrackingContent = () => {
125
- const modalContext = React.useContext(ModalContext);
126
-
127
- return (
128
- <ul>
129
- {(modalContext.openModalStack() ?? []).map((modalId, idx) => (
130
- <li key={modalId}>
131
- {idx + 1}. {modalId}
132
- </li>
133
- ))}
134
- </ul>
135
- );
136
- };
137
-
138
- /**
139
- * `ModalContext` can be used as provider to track a stack of modals.
140
- *
141
- * ```(Javascript)
142
- * const ContextTemplate = () => {
143
- * const { setModalOpen, openModalStack } = useModalContext();
144
- * return (
145
- * <ModalContext.Provider value={{ setModalOpen, openModalStack }}>
146
- * <SimpleDialog size="large" isOpen>
147
- * <OtherModal />
148
- * </SimpleDialog>
149
- * </ModalContext.Provider>
150
- * );
151
- * };
152
- *
153
- * const OtherModal = () => {
154
- * const modalContext = React.useContext(ModalContext);
155
- * return (
156
- * <SimpleDialog size="small">
157
- * <ul>
158
- * {(modalContext.openModalStack ?? []).map((modalId, idx) => (
159
- * <li key={modalId}>
160
- * {idx + 1}. {modalId}
161
- * </li>
162
- * ))}
163
- * </ul>
164
- * </SimpleDialog>
165
- * );
166
- * };
167
- * ```
168
- */
169
- export const NestedModalWithContext = ContextTemplate.bind({});
170
- NestedModalWithContext.args = {
171
- children: [
172
- <ExampleModal id="rootModal" size="large">
173
- <MiddleModal />
174
- </ExampleModal>,
175
- ],
176
- };
@@ -0,0 +1,153 @@
1
+ import React from "react";
2
+ import { Classes, OverlaysProvider } from "@blueprintjs/core";
3
+ import { Meta } from "@storybook/react";
4
+
5
+ import {
6
+ Button,
7
+ Card,
8
+ CardContent,
9
+ Modal,
10
+ ModalContext,
11
+ ModalContextProps,
12
+ ModalSize,
13
+ Spacing,
14
+ useModalContext,
15
+ } from "./../../../../index";
16
+
17
+ /**
18
+ * `ModalContext` can be used as provider to track a stack of modals.
19
+ *
20
+ * ```(Javascript)
21
+ * import { ModalContext, SimpleDialog } from "@eccenca/gui-elements";
22
+ *
23
+ * const ContextTemplate = () => {
24
+ * const { setModalOpen, openModalStack } = useModalContext();
25
+ * return (
26
+ * <ModalContext.Provider value={{ setModalOpen, openModalStack }}>
27
+ * <SimpleDialog size="large" isOpen>
28
+ * <OtherModal />
29
+ * </SimpleDialog>
30
+ * </ModalContext.Provider>
31
+ * );
32
+ * };
33
+ *
34
+ * const OtherModal = () => {
35
+ * const modalContext = React.useContext(ModalContext);
36
+ * return (
37
+ * <SimpleDialog size="small">
38
+ * <ul>
39
+ * {(modalContext.openModalStack ?? []).map((modalId, idx) => (
40
+ * <li key={modalId}>
41
+ * {idx + 1}. {modalId}
42
+ * </li>
43
+ * ))}
44
+ * </ul>
45
+ * </SimpleDialog>
46
+ * );
47
+ * };
48
+ * ```
49
+ */
50
+ export default {
51
+ title: "Components/Dialog/ModalContext",
52
+ decorators: [
53
+ (Story) => (
54
+ <OverlaysProvider>
55
+ <div style={{ height: "70vh", position: "relative" }} id={"modalPortal"}>
56
+ <Story />
57
+ </div>
58
+ </OverlaysProvider>
59
+ ),
60
+ ],
61
+ } as Meta<ModalContextProps>;
62
+
63
+ export const Usage = () => {
64
+ const { setModalOpen, openModalStack } = useModalContext();
65
+
66
+ return (
67
+ <ModalContext.Provider value={{ setModalOpen, openModalStack }}>
68
+ <ExampleModal id="rootModal" size="large">
69
+ <MiddleModal />
70
+ </ExampleModal>
71
+ </ModalContext.Provider>
72
+ );
73
+ };
74
+
75
+ const ModalContent = ({ children }: React.HTMLAttributes<HTMLDivElement>) => {
76
+ return (
77
+ <Card style={{ height: "100%" }}>
78
+ <CardContent>{children}</CardContent>
79
+ </Card>
80
+ );
81
+ };
82
+
83
+ /** Component for nested modals. */
84
+ const ExampleModal = ({
85
+ id,
86
+ size,
87
+ children,
88
+ }: {
89
+ id?: string;
90
+ size: ModalSize;
91
+ children?: React.HTMLAttributes<HTMLDivElement>["children"];
92
+ }) => {
93
+ const [isOpen, setIsOpen] = React.useState(true);
94
+ const [portalElement, setPortalElement] = React.useState<HTMLElement | undefined>();
95
+
96
+ React.useEffect(() => {
97
+ setPortalElement(document.getElementById("modalPortal")!);
98
+ }, []);
99
+
100
+ return (
101
+ <Modal
102
+ modalId={id}
103
+ size={size}
104
+ isOpen={isOpen}
105
+ usePortal={true}
106
+ portalContainer={portalElement}
107
+ hasBackdrop={true}
108
+ onOpened={() => {
109
+ // workaround, Blueprint attach a class to body tht prevents scrolling, probably it is attached to the wrong portal
110
+ document.body.classList.remove(Classes.OVERLAY_OPEN);
111
+ }}
112
+ >
113
+ <ModalContent>
114
+ Modal with constant modal ID "{id}".
115
+ <Spacing />
116
+ <TrackingContent />
117
+ <Spacing />
118
+ {children}
119
+ <Spacing />
120
+ <Button key={"close"} onClick={() => setIsOpen(false)}>
121
+ Close
122
+ </Button>
123
+ </ModalContent>
124
+ </Modal>
125
+ );
126
+ };
127
+
128
+ const InnerModal = () => {
129
+ return <ExampleModal id="innerModal" size="small" />;
130
+ };
131
+
132
+ const MiddleModal = () => {
133
+ return (
134
+ <ExampleModal id="middleModal" size="regular">
135
+ <InnerModal />
136
+ </ExampleModal>
137
+ );
138
+ };
139
+
140
+ /** Shows the current stack of open modals. */
141
+ const TrackingContent = () => {
142
+ const modalContext = React.useContext(ModalContext);
143
+
144
+ return (
145
+ <ul>
146
+ {(modalContext.openModalStack() ?? []).map((modalId, idx) => (
147
+ <li key={modalId}>
148
+ {idx + 1}. {modalId}
149
+ </li>
150
+ ))}
151
+ </ul>
152
+ );
153
+ };
@@ -46,3 +46,19 @@
46
46
  flex-basis: auto;
47
47
  }
48
48
  }
49
+
50
+ @media print {
51
+ .#{$eccgui}-flexible__container,
52
+ .#{$eccgui}-flexible__item {
53
+ position: relative;
54
+ display: block;
55
+ width: auto;
56
+ height: auto;
57
+ padding: 0;
58
+ margin: 0;
59
+
60
+ &:is(.#{$eccgui}-flexible__item) {
61
+ margin-bottom: $eccgui-size-block-whitespace;
62
+ }
63
+ }
64
+ }
@@ -86,3 +86,20 @@ $grid-gutter: rem($eccgui-size-grid-gutter);
86
86
  flex-wrap: nowrap;
87
87
  }
88
88
  }
89
+
90
+ @media print {
91
+ .#{$eccgui}-grid,
92
+ .#{$eccgui}-grid__row,
93
+ .#{$eccgui}-grid__column {
94
+ position: relative;
95
+ display: block;
96
+ width: auto;
97
+ height: auto;
98
+ padding: 0;
99
+ margin: 0;
100
+
101
+ &:is(.#{$eccgui}-grid__column) {
102
+ margin-bottom: $eccgui-size-block-whitespace;
103
+ }
104
+ }
105
+ }
@@ -11,19 +11,22 @@ export default {
11
11
  subcomponents: { GridRow, GridColumn },
12
12
  argTypes: {
13
13
  children: {
14
- control: "none",
14
+ control: false,
15
15
  },
16
16
  },
17
+ decorators: [
18
+ (Story) => (
19
+ <div style={{ minHeight: "30vh", position: "relative" }}>
20
+ <Story />
21
+ </div>
22
+ ),
23
+ ],
17
24
  } as Meta<typeof Grid>;
18
25
 
19
- const Template: StoryFn<typeof Grid> = (args) => (
20
- <div style={{ minHeight: "30vh", position: "relative" }}>
21
- <Grid {...args} />
22
- </div>
23
- );
26
+ const Template: StoryFn<typeof Grid> = (args) => <Grid {...args} />;
24
27
 
25
28
  export const Default = Template.bind({});
26
29
  Default.args = {
27
- children: <GridRow {...RowExample.args} verticalStretched />,
30
+ children: [<GridRow {...RowExample.args} verticalStretched />, <GridRow {...RowExample.args} verticalStretched />],
28
31
  verticalStretchable: true,
29
32
  };
@@ -10,21 +10,27 @@ export default {
10
10
  component: GridRow,
11
11
  argTypes: {
12
12
  children: {
13
- control: "none",
13
+ control: false,
14
14
  },
15
15
  },
16
16
  } as Meta<typeof GridRow>;
17
17
 
18
- const Template: StoryFn<typeof GridRow> = (args) => (
19
- <Grid style={{ minHeight: "30vh" }} verticalStretchable>
20
- <GridRow {...args} />
21
- </Grid>
22
- );
18
+ const Template: StoryFn<typeof GridRow> = (args) => <GridRow {...args} />;
23
19
 
24
20
  export const Default = Template.bind({});
25
21
  Default.args = {
26
- children: <GridColumn {...ColumnExample.args} verticalAlign="center" />,
22
+ children: [
23
+ <GridColumn {...ColumnExample.args} verticalAlign="center" key="col1" />,
24
+ <GridColumn {...ColumnExample.args} verticalAlign="center" key="col1" />,
25
+ ],
27
26
  };
27
+ Default.decorators = [
28
+ (Story) => (
29
+ <Grid style={{ minHeight: "30vh" }} verticalStretchable>
30
+ <Story />
31
+ </Grid>
32
+ ),
33
+ ];
28
34
 
29
35
  const TemplateStretched: StoryFn<typeof GridRow> = (args) => (
30
36
  <Grid style={{ minHeight: "50vh" }} verticalStretchable>
@@ -2,11 +2,11 @@ import React from "react";
2
2
 
3
3
  import { CLASSPREFIX as eccgui } from "../../configuration/constants";
4
4
  import Button, { ButtonProps } from "../Button/Button";
5
+ import {TestableComponent} from "../interfaces";
5
6
 
6
7
  import { ValidIconName } from "./canonicalIconNames";
7
8
  import Icon, { IconProps } from "./Icon";
8
9
  import { TestIconProps } from "./TestIcon";
9
- import {TestableComponent} from "../interfaces";
10
10
 
11
11
  interface ExtendedButtonProps
12
12
  extends Omit<ButtonProps, "name" | "icon" | "rightIcon" | "text" | "minimal" | "tooltip">, TestableComponent {
@@ -91,3 +91,9 @@
91
91
  color: inherit;
92
92
  }
93
93
  }
94
+
95
+ @media print {
96
+ .#{$eccgui}-notification__actions {
97
+ display: none;
98
+ }
99
+ }
@@ -197,3 +197,12 @@ $eccgui-size-overviewitem-line-typo-large-lineheight: $eccgui-size-typo-subtitle
197
197
  display: flex;
198
198
  }
199
199
  }
200
+
201
+ @media print {
202
+ .#{$eccgui}-overviewitem__actions {
203
+ display: none;
204
+ }
205
+ .#{$eccgui}-overviewitem__depiction {
206
+ print-color-adjust: exact;
207
+ }
208
+ }
@@ -6,15 +6,20 @@ import {
6
6
  Badge,
7
7
  Card,
8
8
  Depiction,
9
+ OverflowText,
9
10
  OverviewItem,
10
11
  OverviewItemActions,
11
12
  OverviewItemDepiction,
12
13
  OverviewItemDescription,
14
+ OverviewItemLine,
15
+ Tag,
16
+ TagList,
13
17
  } from "./../../../../index";
14
18
  import { FullExample as OtherDepictionExample } from "./../../Depiction/stories/Depiction.stories";
15
19
  import { Default as ActionsExample } from "./OverviewItemActions.stories";
16
20
  import { AutoTransform as DepictionExample } from "./OverviewItemDepiction.stories";
17
21
  import { Default as DescriptionExample } from "./OverviewItemDescription.stories";
22
+ import { Default as LineExample } from "./OverviewItemLine.stories";
18
23
 
19
24
  export default {
20
25
  title: "Components/OverviewItem",
@@ -76,3 +81,26 @@ ItemWithDepictionElement.args = {
76
81
  hasSpacing: true,
77
82
  hasCardWrapper: true,
78
83
  };
84
+
85
+ export const ItemWithTags = Template.bind({});
86
+ ItemWithTags.args = {
87
+ children: [
88
+ <OverviewItemDepiction {...DepictionExample.args} key={"depiction"} />,
89
+ <OverviewItemDescription key={"description"}>
90
+ <OverviewItemLine {...LineExample.args} />
91
+ <OverviewItemLine small>
92
+ <OverflowText>
93
+ <TagList>
94
+ <Tag small>Test</Tag>
95
+ <Tag small>Tag</Tag>
96
+ <Tag small>List</Tag>
97
+ </TagList>
98
+ </OverflowText>
99
+ </OverviewItemLine>
100
+ </OverviewItemDescription>,
101
+ <OverviewItemActions children={ActionsExample.args.children[0]} key={"actions"} />,
102
+ ],
103
+ densityHigh: false,
104
+ hasSpacing: true,
105
+ hasCardWrapper: true,
106
+ };
@@ -9,7 +9,7 @@ export default {
9
9
  subcomponents: { Button, IconButton, ContextMenu },
10
10
  argTypes: {
11
11
  children: {
12
- control: "none",
12
+ control: false,
13
13
  description: "User-interactive elements.",
14
14
  },
15
15
  },
@@ -20,7 +20,7 @@ const Template: StoryFn<typeof OverviewItemActions> = (args) => <OverviewItemAct
20
20
  export const Default = Template.bind({});
21
21
  Default.args = {
22
22
  children: [
23
- <IconButton name="item-remove" tooltip="Remove this item" disruptive />,
23
+ <IconButton name="item-remove" text="Remove this item" disruptive />,
24
24
  <Button affirmative>Other action</Button>,
25
25
  ],
26
26
  };
@@ -12,7 +12,7 @@ export default {
12
12
  },
13
13
  argTypes: {
14
14
  children: {
15
- control: "none",
15
+ control: false,
16
16
  description: "Elements for text content.",
17
17
  },
18
18
  },