@camunda/camunda-composite-components 0.2.18-rc.4 → 0.2.18-rc.5

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.
@@ -8,9 +8,9 @@ import { useC3UserConfiguration } from "../c3-user-configuration/c3-user-configu
8
8
  import { defaultTheme, useC3Profile, } from "../c3-user-configuration/c3-profile-provider/c3-profile-provider";
9
9
  import { resolveTheme, } from "../c3-user-configuration/c3-profile-provider/carbon-theme-provider";
10
10
  import { useC3HelpCenter } from "./c3-help-center-provider";
11
- export const C3HelpCenter = ({ autoStartSurvey, origin, flags, onRequestClose, mixpanelTrack, onRequestOpen, theme, onPersonaChange, activeTab, }) => {
11
+ export const C3HelpCenter = ({ autoStartSurvey, origin, flags, onRequestClose, mixpanelTrack: customMixpanelTrack, onRequestOpen, theme, onPersonaChange, activeTab, }) => {
12
12
  const { isHelpCenterOpen: isOpen, setIsHelpCenterOpen } = useC3HelpCenter();
13
- const { userToken, decodedToken, activeOrganizationId, handleTheme, decodedAudience, } = useC3UserConfiguration() || {};
13
+ const { userToken, decodedToken, activeOrganizationId, handleTheme, decodedAudience, analyticsTrack, } = useC3UserConfiguration() || {};
14
14
  const { theme: themeConfig, isEnabled, reloadClusters } = useC3Profile();
15
15
  const themeHandlingEnabled = isEnabled && !!handleTheme && !!themeConfig;
16
16
  const themeRef = useRef();
@@ -20,6 +20,14 @@ export const C3HelpCenter = ({ autoStartSurvey, origin, flags, onRequestClose, m
20
20
  const [helpCenterConfig, setHelpCenterConfig] = useState(defaultHelpCenterConfig);
21
21
  const [email, setEmail] = useState("");
22
22
  const [showSurvey, setShowSurvey] = useState(autoStartSurvey);
23
+ const mixpanelTrack = (event, data) => {
24
+ if (customMixpanelTrack) {
25
+ customMixpanelTrack(event, data);
26
+ }
27
+ else if (analyticsTrack) {
28
+ analyticsTrack(event, data);
29
+ }
30
+ };
23
31
  useEffect(() => {
24
32
  const updateResolvedTheme = ({ matches }) => {
25
33
  if (themeRef.current === "system") {
@@ -92,7 +100,7 @@ export const C3HelpCenter = ({ autoStartSurvey, origin, flags, onRequestClose, m
92
100
  });
93
101
  setPersona({ wasShown: true });
94
102
  }
95
- mixpanelTrack?.(`helpcenter:open`, {
103
+ mixpanelTrack?.("helpcenter:open", {
96
104
  to: activeTab ?? firstTab,
97
105
  from: origin,
98
106
  });
@@ -49,6 +49,7 @@ export type Tab = {
49
49
  };
50
50
  export type Organization = {
51
51
  uuid: string;
52
+ name: string;
52
53
  salesPlan?: {
53
54
  type: string;
54
55
  };
@@ -152,34 +152,30 @@ export const HelpCenter = ({ configuration, persona, email, audience, flags = []
152
152
  React.createElement(SideNavItems, null,
153
153
  React.createElement(SideNavMenuItem, null,
154
154
  React.createElement("h5", null, "Help Center")),
155
- React.createElement("li", { style: { marginTop: "4px" } },
156
- React.createElement(Stack, null,
157
- React.createElement("ul", null, tabBar.map(({ name, id, text }) => {
158
- const active = activeTab === name;
159
- let tabBackgroundColor = theme === "light" ? "#F4F4F4" : "#161616";
160
- let tabButtonColor = theme === "light" ? "#525252" : "#f4f4f4";
161
- if (active) {
162
- tabBackgroundColor =
163
- theme === "light" ? "#E5E5E5" : "#8D8D8D3D";
164
- tabButtonColor =
165
- theme === "light" ? "#161616" : "#f4f4f4";
166
- }
167
- return (React.createElement("li", { key: name },
168
- React.createElement(Button, { className: active ? "active" : "", kind: "secondary", onClick: () => {
169
- setActiveTab(name);
170
- mixpanelTrack?.("helpcenter:open", {
171
- to: id,
172
- from: origin,
173
- });
174
- }, style: {
175
- width: "100%",
176
- backgroundColor: tabBackgroundColor,
177
- color: tabButtonColor,
178
- }, "aria-label": text }, text)));
179
- })))),
180
- React.createElement("li", { style: { position: "absolute", bottom: "20px" } },
181
- React.createElement("ul", null, configuration.links.map((link) => (React.createElement(SideNavMenuItem, { key: link.label.split(" ").join("-").toLowerCase(), href: link.link, target: "_blank" },
182
- React.createElement("span", { className: "cds--link" }, link.label)))))))),
155
+ React.createElement("div", { style: { marginTop: "4px" } },
156
+ React.createElement(Stack, null, tabBar.map(({ name, id, text }) => {
157
+ const active = activeTab === name;
158
+ let tabBackgroundColor = theme === "light" ? "#F4F4F4" : "#161616";
159
+ let tabButtonColor = theme === "light" ? "#525252" : "#f4f4f4";
160
+ if (active) {
161
+ tabBackgroundColor =
162
+ theme === "light" ? "#E5E5E5" : "#8D8D8D3D";
163
+ tabButtonColor = theme === "light" ? "#161616" : "#f4f4f4";
164
+ }
165
+ return (React.createElement(Button, { className: active ? "active" : "", kind: "secondary", onClick: () => {
166
+ setActiveTab(name);
167
+ mixpanelTrack?.("helpcenter:open", {
168
+ to: id,
169
+ from: origin,
170
+ });
171
+ }, style: {
172
+ width: "100%",
173
+ backgroundColor: tabBackgroundColor,
174
+ color: tabButtonColor,
175
+ }, key: name, "aria-label": text }, text));
176
+ }))),
177
+ React.createElement("div", { style: { position: "absolute", bottom: "20px" } }, configuration.links.map((link) => (React.createElement(SideNavMenuItem, { key: link.label.split(" ").join("-").toLowerCase(), href: link.link, target: "_blank" },
178
+ React.createElement("span", { className: "cds--link" }, link.label))))))),
183
179
  content)),
184
180
  persona.complete && activeTab === "recommendations" && (React.createElement(ModalFooter, { style: {
185
181
  height: "62px",
@@ -157,12 +157,13 @@ export const Feedback = (props) => {
157
157
  // eslint-disable-next-line
158
158
  // @ts-ignore
159
159
  align: "bottom" },
160
- React.createElement(Button, { kind: "ghost", "aria-label": "Information", renderIcon: Information, iconDescription: "Information", style: {
161
- marginTop: "-10px",
162
- backgroundColor: props.theme === "light" ? "#FFFFFF" : "#161616",
163
- color: props.theme === "light" ? "#161616" : "#F4F4F4",
164
- paddingLeft: "0px",
165
- } }))),
160
+ React.createElement("span", { className: "upload-file" },
161
+ React.createElement(Button, { kind: "ghost", renderIcon: Information, iconDescription: "Information", style: {
162
+ marginTop: "-10px",
163
+ backgroundColor: props.theme === "light" ? "#FFFFFF" : "#161616",
164
+ color: props.theme === "light" ? "#161616" : "#F4F4F4",
165
+ paddingLeft: "0px",
166
+ } })))),
166
167
  React.createElement("p", { className: "cds--label-description", style: { marginTop: "-24px" } }, "Max. file size is 5MB. Supported file types are .jpg and .png."))),
167
168
  !orgIsEnterPriseOrPaidCC &&
168
169
  (() => {
@@ -10,19 +10,21 @@ export type C3NavigationSideBarBaseProps = {
10
10
  elements?: C3NavigationElementProps[];
11
11
  bottomElements?: C3NavigationElementProps[];
12
12
  };
13
+ export type CamundaOrg = {
14
+ activeLabel: string;
15
+ otherLabel: string;
16
+ orgName: string;
17
+ action: {
18
+ label: string;
19
+ onClick: () => void;
20
+ };
21
+ };
13
22
  export type C3NavigationOrgSideBarProps = C3NavigationSideBarBaseProps & {
14
23
  type: "org";
15
24
  customElements?: {
16
- activeOrganization?: {
17
- activeLabel: string;
18
- otherLabel: string;
19
- orgName: string;
20
- action: {
21
- label: string;
22
- onClick: () => void;
23
- };
24
- };
25
+ activeOrganization?: CamundaOrg;
25
26
  };
27
+ switchToOrg?: (orgId: string) => void;
26
28
  };
27
29
  export type C3NavigationInfoSideBarProps = C3NavigationSideBarBaseProps & {
28
30
  type: "info";
@@ -4,15 +4,49 @@ import { Enterprise } from "@carbon/react/icons";
4
4
  import C3NavigationSideBar from "./c3-navigation-sidebar";
5
5
  import { SwitcherDivider } from "./components";
6
6
  import { useOrgSidebarState } from "./c3-sidebar-state-provider";
7
+ import { useC3Profile } from "../../c3-user-configuration/c3-profile-provider/c3-profile-provider";
8
+ import { useC3UserConfiguration } from "../../c3-user-configuration/c3-user-configuration-provider";
7
9
  const C3OrgSidebar = ({ sideBar }) => {
8
- const { customElements, ...sideBarProps } = sideBar;
9
- const activeOrganization = customElements?.activeOrganization;
10
+ const { customElements, switchToOrg, elements, ...sideBarProps } = sideBar;
10
11
  const { isOpen, setIsOpen } = useOrgSidebarState();
12
+ const { decodedAudience, setActiveOrgId, analyticsTrack } = useC3UserConfiguration();
13
+ const { activeOrg, orgs } = useC3Profile();
14
+ const isCustomized = Boolean(customElements?.activeOrganization);
15
+ const onManageOrg = () => {
16
+ if (!isCustomized) {
17
+ analyticsTrack?.("navBar:orgSettings:click", { orgId: activeOrg?.uuid });
18
+ }
19
+ if (sideBar.closeOnClick !== false)
20
+ setIsOpen(false);
21
+ };
22
+ const activeOrganization = customElements?.activeOrganization || {
23
+ activeLabel: "Active Organization",
24
+ orgName: activeOrg?.name || "",
25
+ action: {
26
+ onClick: onManageOrg,
27
+ label: "Manage",
28
+ },
29
+ otherLabel: "Other Organizations",
30
+ };
31
+ const switchOrg = (orgId) => {
32
+ setActiveOrgId(orgId);
33
+ analyticsTrack?.("navBar:orgSwitch:click", { orgId });
34
+ switchToOrg?.(orgId);
35
+ setIsOpen(false);
36
+ };
37
+ const orgElements = orgs
38
+ ?.filter(({ uuid }) => uuid !== activeOrg?.uuid)
39
+ .map((org) => ({
40
+ key: org.uuid,
41
+ label: org.name,
42
+ onClick: () => switchOrg(org.uuid),
43
+ }));
11
44
  const itemTabIndex = isOpen ? undefined : -1;
12
45
  return (React.createElement(C3NavigationSideBar, { sideBar: {
13
46
  ...sideBarProps,
47
+ elements: elements || orgElements,
14
48
  ariaLabel: sideBarProps.ariaLabel || "Organization Sidebars",
15
- }, icon: React.createElement(Enterprise, { size: 20 }) }, activeOrganization && (React.createElement(React.Fragment, null,
49
+ }, icon: React.createElement(Enterprise, { size: 20 }) }, (customElements?.activeOrganization || activeOrg) && (React.createElement(React.Fragment, null,
16
50
  React.createElement("div", { style: {
17
51
  padding: "1rem",
18
52
  paddingTop: "1.5rem",
@@ -35,12 +69,11 @@ const C3OrgSidebar = ({ sideBar }) => {
35
69
  overflow: "hidden",
36
70
  whiteSpace: "nowrap",
37
71
  }, title: activeOrganization.orgName }, activeOrganization.orgName)),
38
- React.createElement(Button, { size: "md", kind: "ghost", key: "org-management", onClick: () => {
72
+ isCustomized ? (React.createElement(Button, { size: "md", kind: "ghost", onClick: () => {
39
73
  activeOrganization.action.onClick();
40
- if (sideBar.closeOnClick !== false) {
41
- setIsOpen(false);
42
- }
43
- }, tabIndex: itemTabIndex }, activeOrganization.action.label)),
74
+ onManageOrg();
75
+ }, tabIndex: itemTabIndex }, activeOrganization.action?.label)) : (activeOrg?.uuid &&
76
+ decodedAudience && (React.createElement(Button, { as: "a", size: "md", kind: "ghost", key: "org-management", href: `https://console.${decodedAudience}/org/${activeOrg?.uuid}/management`, onClick: onManageOrg, tabIndex: itemTabIndex }, activeOrganization.action?.label)))),
44
77
  sideBar.elements && sideBar.elements.length > 0 && (React.createElement(React.Fragment, null,
45
78
  React.createElement(SwitcherDivider, null),
46
79
  React.createElement(FormLabel, { style: {
@@ -14,6 +14,7 @@ import { C3SidebarStateProvider } from "./c3-navigation-sidebar/c3-sidebar-state
14
14
  import { C3HelpCenter } from "../c3-help-center/c3-help-center";
15
15
  import { C3ClusterTag } from "../c3-cluster-tag/c3-cluster-tag";
16
16
  import { useC3HelpCenter } from "../c3-help-center/c3-help-center-provider";
17
+ import { useC3Profile } from "../c3-user-configuration/c3-profile-provider/c3-profile-provider";
17
18
  /**
18
19
  * UI SHELL
19
20
  * Docs: https://react.carbondesignsystem.com/?path=/story/components-ui-shell--fixed-side-nav
@@ -40,9 +41,11 @@ const ClusterTagWrapper = styled.div `
40
41
  `;
41
42
  export const C3Navigation = ({ app, appBar, forwardRef, navbar, orgSideBar, infoSideBar, infoButton, helpCenter, actionButtons, userSideBar, notificationSideBar, clusterUuid, options, }) => {
42
43
  const { setIsHelpCenterOpen, isHelpCenterOpen } = useC3HelpCenter();
44
+ const { activeOrg } = useC3Profile();
43
45
  const isLargeScreen = useMediaQuery(`(min-width: ${BREAKPOINT_LG_WIDTH}`);
44
46
  const appBarElementsLength = appBar.elements?.length ?? 0;
45
47
  const displayAppBar = appBarElementsLength > 0 || (!isLargeScreen && navbar.elements.length > 0);
48
+ const orgName = activeOrg?.name || navbar.orgName;
46
49
  if (app.prefix)
47
50
  console.warn("The `prefix` prop is deprecated and will be removed in a future release. It has been replaced with a Camunda icon.");
48
51
  return (React.createElement(C3SidebarStateProvider, { isNotificationSidebarOpen: notificationSideBar?.isOpen, isOrgSidebarOpen: orgSideBar?.isOpen, isInfoSidebarOpen: infoSideBar?.isOpen, isUserSidebarOpen: userSideBar?.isOpen },
@@ -90,14 +93,14 @@ export const C3Navigation = ({ app, appBar, forwardRef, navbar, orgSideBar, info
90
93
  }),
91
94
  clusterUuid && (React.createElement(ClusterTagWrapper, null,
92
95
  React.createElement(C3ClusterTag, { clusterUuid: clusterUuid, conditionalRendering: options?.conditionalTagRendering }))),
93
- navbar.orgName && (React.createElement("div", { className: "bodyText", style: {
96
+ orgName && (React.createElement("div", { className: "bodyText", style: {
94
97
  fontSize: "14px",
95
98
  lineHeight: "3rem",
96
99
  textOverflow: "ellipsis",
97
100
  whiteSpace: "nowrap",
98
101
  overflow: "hidden",
99
102
  maxWidth: "150px",
100
- } }, navbar.orgName))),
103
+ } }, orgName))),
101
104
  actionButtons && React.createElement(C3ActionButtons, { elements: actionButtons }),
102
105
  notificationSideBar && (React.createElement(C3NotificationSidebar, { sideBar: {
103
106
  ...notificationSideBar,
@@ -6,8 +6,9 @@ export declare function createAppBarProps(options?: {
6
6
  isOpen?: boolean;
7
7
  elements?: Array<C3NavigationElementProps>;
8
8
  }): C3NavigationProps["appBar"];
9
- export declare function createNavBarBarProps(options?: {
9
+ export declare function createNavBarBarProps({ orgName, elements, }?: {
10
10
  elements?: C3NavigationNavBarProps["elements"];
11
+ orgName?: string;
11
12
  }): C3NavigationNavBarProps;
12
13
  export declare function createInfoSideBarProps(options: {
13
14
  isOpen: boolean;
@@ -15,7 +16,8 @@ export declare function createInfoSideBarProps(options: {
15
16
  }): C3NavigationProps["infoSideBar"];
16
17
  export declare function createOrgSideBarProps(options: {
17
18
  isOpen: boolean;
18
- orgCount: number;
19
+ orgCount?: number;
20
+ useConfig?: boolean;
19
21
  }): C3NavigationProps["orgSideBar"];
20
22
  export declare function createUserSideBarProps(options: {
21
23
  isOpen: boolean;
@@ -61,9 +61,9 @@ export function createAppBarProps(options = {}) {
61
61
  elementClicked: (element) => console.log(`event coming from the appBarProps: ${element} has been clicked`),
62
62
  };
63
63
  }
64
- export function createNavBarBarProps(options = {}) {
64
+ export function createNavBarBarProps({ orgName = "Camunda", elements = undefined, } = {}) {
65
65
  return {
66
- elements: options?.elements ?? [
66
+ elements: elements ?? [
67
67
  {
68
68
  key: "dashboard",
69
69
  label: "Dashboard",
@@ -79,7 +79,7 @@ export function createNavBarBarProps(options = {}) {
79
79
  },
80
80
  },
81
81
  ],
82
- orgName: "Camunda",
82
+ orgName,
83
83
  tags: [
84
84
  {
85
85
  key: "stage",
@@ -125,36 +125,45 @@ export function createInfoSideBarProps(options) {
125
125
  }
126
126
  export function createOrgSideBarProps(options) {
127
127
  const elements = [];
128
- for (let i = 0; i < options.orgCount; i++) {
129
- elements.push({
130
- key: `org-${i}`,
131
- label: `Organization ${i}`,
132
- });
128
+ if (options.orgCount !== undefined) {
129
+ for (let i = 0; i < options.orgCount; i++) {
130
+ elements.push({
131
+ key: `org-${i}`,
132
+ label: `Organization ${i}`,
133
+ });
134
+ }
133
135
  }
134
136
  return {
135
137
  isOpen: options.isOpen,
136
- customElements: {
137
- activeOrganization: {
138
- activeLabel: "Active Organization",
139
- otherLabel: "Other Organization",
140
- orgName: "Camunda",
141
- action: {
142
- label: "Manage",
143
- onClick: () => console.log("Manage organization"),
138
+ customElements: options.useConfig
139
+ ? undefined
140
+ : {
141
+ activeOrganization: {
142
+ activeLabel: "Active Organization",
143
+ otherLabel: "Other Organization",
144
+ orgName: "Camunda",
145
+ action: {
146
+ label: "Manage",
147
+ onClick: () => console.log("Manage organization"),
148
+ },
144
149
  },
145
150
  },
146
- },
147
- elements,
148
- bottomElements: [
149
- {
150
- key: "createTrial",
151
- label: "Create new Trial Org",
152
- renderIcon: Add,
153
- onClick: () => {
154
- console.log("clicked");
151
+ elements: options.useConfig ? undefined : elements,
152
+ bottomElements: options.useConfig
153
+ ? undefined
154
+ : [
155
+ {
156
+ key: "createTrial",
157
+ label: "Create new Trial Org",
158
+ renderIcon: Add,
159
+ onClick: () => {
160
+ console.log("clicked");
161
+ },
155
162
  },
156
- },
157
- ],
163
+ ],
164
+ switchToOrg: options.useConfig
165
+ ? (orgId) => console.log("Switch to org: ", orgId)
166
+ : undefined,
158
167
  };
159
168
  }
160
169
  export function createUserSideBarProps(options) {
@@ -1,12 +1,12 @@
1
1
  import { FC } from "react";
2
2
  import { Persona } from "../c3-help-center/c3-help-center.types";
3
- import { Dict } from "mixpanel-browser";
3
+ import { MixPanelTrack } from "../c3-user-configuration/c3-user-configuration-provider";
4
4
  export type C3OnboardingSurveyProps = {
5
5
  onRequestClose: () => void;
6
6
  onRequestSkip: () => void;
7
7
  personaCallback: (persona: Persona) => void;
8
8
  theme: "light" | "dark";
9
- mixpanelTrack?: (event: string, data: Dict | undefined) => void;
9
+ mixpanelTrack?: MixPanelTrack;
10
10
  origin: "console" | "webmodeler" | "operate" | "tasklist" | "optimize";
11
11
  modal: boolean;
12
12
  persona: Persona | undefined;
@@ -2,7 +2,7 @@ import React, { useState } from "react";
2
2
  import { OnboardingSurvey } from "./onboardingSurvey";
3
3
  import { defaultOnboardingConfig } from "./defaultOnboardingConfig";
4
4
  import { getOnboardingConfig, submitSurvey, updatePersona, } from "../../api/help-center";
5
- import { useC3UserConfiguration } from "../c3-user-configuration/c3-user-configuration-provider";
5
+ import { useC3UserConfiguration, } from "../c3-user-configuration/c3-user-configuration-provider";
6
6
  export const C3OnboardingSurvey = (props) => {
7
7
  const { userToken, decodedToken, activeOrganizationId, decodedAudience } = useC3UserConfiguration() || {};
8
8
  const [persona, setPersona] = useState(props.persona);
@@ -1,6 +1,5 @@
1
1
  import { Select, SelectItem, Stack, TextInput } from "@carbon/react";
2
2
  import React, { useState } from "react";
3
- import { getTitleId } from "../helpers";
4
3
  export const DropdownSelect = ({ title, label, elements, selectedElement, setSelectedElement, exceptionTitle, exceptionLabel, exceptionValue, }) => {
5
4
  let showSuggestion = false;
6
5
  const [suggestion, setSuggestion] = useState((selectedElement ?? "").split(" - ").length > 0
@@ -23,8 +22,6 @@ export const DropdownSelect = ({ title, label, elements, selectedElement, setSel
23
22
  setSuggestion(input);
24
23
  setElement(rawElement);
25
24
  };
26
- const titleId = getTitleId(title);
27
- const exceptionTitleId = getTitleId(exceptionTitle);
28
25
  return (React.createElement(React.Fragment, null,
29
26
  React.createElement(Stack, null, (() => {
30
27
  return (React.createElement(React.Fragment, null,
@@ -33,7 +30,7 @@ export const DropdownSelect = ({ title, label, elements, selectedElement, setSel
33
30
  gridTemplateColumns: "58% 42%",
34
31
  } },
35
32
  React.createElement(Stack, { gap: 1 },
36
- React.createElement("h4", { id: titleId }, title),
33
+ React.createElement("h4", null, title),
37
34
  (() => {
38
35
  if (label) {
39
36
  return React.createElement("p", { className: "cds--modal-header__label" }, label);
@@ -41,7 +38,7 @@ export const DropdownSelect = ({ title, label, elements, selectedElement, setSel
41
38
  return React.createElement(React.Fragment, null);
42
39
  })(),
43
40
  " "),
44
- React.createElement(Select, { key: `select-${Math.random() * 10000}`, id: `select-${Math.random() * 10000}`, size: "lg", defaultValue: elements[0].value, "aria-labelledby": titleId, labelText: "", onChange: (event) => {
41
+ React.createElement(Select, { key: `select-${Math.random() * 10000}`, id: `select-${Math.random() * 10000}`, size: "lg", defaultValue: elements[0].value, labelText: "", onChange: (event) => {
45
42
  const element = elements.find((e) => e.value === event.target.value);
46
43
  if (element)
47
44
  setElement(element.value);
@@ -52,11 +49,11 @@ export const DropdownSelect = ({ title, label, elements, selectedElement, setSel
52
49
  React.createElement("div", { style: { marginTop: "24px" } }),
53
50
  React.createElement("div", { style: { marginTop: "24px" } }),
54
51
  React.createElement(Stack, { gap: 1 },
55
- React.createElement("h4", { id: exceptionTitleId }, exceptionTitle),
52
+ React.createElement("h4", null, exceptionTitle),
56
53
  React.createElement("p", { className: "cds--modal-header__label" }, exceptionLabel)),
57
54
  React.createElement(TextInput, { style: { height: "48px" }, id: `text-input-element-${Math.random() * 1000}`, placeholder: "Enter your suggestion", labelText: "", value: suggestion, onChange: (event) => {
58
55
  calculateSuggestion(event.target.value);
59
- }, "aria-labelledby": exceptionTitleId, "aria-label": exceptionTitle })));
56
+ } })));
60
57
  }
61
58
  return React.createElement(React.Fragment, null);
62
59
  })())));
@@ -1,14 +1,10 @@
1
1
  import { TextInput, Stack } from "@carbon/react";
2
2
  import React from "react";
3
- import { getTitleId } from "../helpers";
4
- export const TextInputElement = ({ title, label, preFiledValue, setValue, placeholder }) => {
5
- const titleId = getTitleId(title);
6
- return (React.createElement(React.Fragment, null,
7
- React.createElement(Stack, { orientation: "horizontal" },
8
- React.createElement(Stack, { gap: 1 },
9
- React.createElement("h4", { id: titleId }, title),
10
- label && React.createElement("p", { className: "cds--modal-header__label" }, label)),
11
- React.createElement(TextInput, { id: `text-input-element-${Math.random() * 1000}`, placeholder: placeholder ?? "", labelText: "", value: preFiledValue ?? "", onChange: (event) => {
12
- setValue(event.target.value);
13
- }, "aria-labelledby": titleId }))));
14
- };
3
+ export const TextInputElement = ({ title, label, preFiledValue, setValue, placeholder }) => (React.createElement(React.Fragment, null,
4
+ React.createElement(Stack, { orientation: "horizontal" },
5
+ React.createElement(Stack, { gap: 1 },
6
+ React.createElement("h4", null, title),
7
+ label && React.createElement("p", { className: "cds--modal-header__label" }, label)),
8
+ React.createElement(TextInput, { id: `text-input-element-${Math.random() * 1000}`, placeholder: placeholder ?? "", labelText: "", value: preFiledValue ?? "", onChange: (event) => {
9
+ setValue(event.target.value);
10
+ } }))));
@@ -37,7 +37,11 @@ export const C3ProfileProvider = ({ children }) => {
37
37
  setActiveOrg(res?.find((org) => org.uuid === config.activeOrganizationId) || null);
38
38
  });
39
39
  loadClusters();
40
- }, [config?.activeOrganizationId, decodedToken, decodedAudience]);
40
+ }, [
41
+ config?.activeOrganizationId,
42
+ JSON.stringify(decodedToken),
43
+ decodedAudience,
44
+ ]);
41
45
  useEffect(() => {
42
46
  const updateSystemTheme = ({ matches }) => {
43
47
  if (themeRef.current === "system")
@@ -1,10 +1,13 @@
1
1
  import React, { FC, ReactNode } from "react";
2
2
  import { Endpoints, Stage } from "../../api/endpoints.const";
3
3
  import { DecodedToken } from "./authToken";
4
+ import { Dict } from "mixpanel-browser";
5
+ export type MixPanelTrack = (event: string, data?: Dict) => void;
4
6
  type C3UserConfigurationBase = {
5
7
  activeOrganizationId: string;
6
8
  userToken: string;
7
9
  getNewUserToken: () => Promise<string>;
10
+ analyticsTrack?: MixPanelTrack;
8
11
  };
9
12
  type C3UserConfigurationWithEndpoints = C3UserConfigurationBase & {
10
13
  endpoints: Endpoints;
@@ -18,6 +21,8 @@ export type C3UserConfiguration = C3UserConfigurationWithEndpoints | C3UserConfi
18
21
  export type C3UserConfigurationContextValue = C3UserConfiguration & {
19
22
  decodedToken: DecodedToken | null;
20
23
  decodedAudience: string | null;
24
+ setActiveOrgId: (newOrg: string) => void;
25
+ analyticsTrack?: MixPanelTrack;
21
26
  };
22
27
  export declare const C3UserConfigurationContext: React.Context<C3UserConfigurationContextValue>;
23
28
  declare const C3UserConfigurationProvider: FC<C3UserConfiguration & {
@@ -9,19 +9,30 @@ export const C3UserConfigurationContext = React.createContext({
9
9
  decodedToken: null,
10
10
  decodedAudience: null,
11
11
  getNewUserToken: () => Promise.resolve(""),
12
+ setActiveOrgId: () => undefined,
12
13
  });
13
- const C3UserConfigurationProvider = ({ children, ...config }) => {
14
+ const C3UserConfigurationProvider = ({ children, activeOrganizationId, ...config }) => {
14
15
  const [decodedToken, setDecodedToken] = useState(null);
15
16
  const [decodedAudience, setDecodedAudience] = useState(null);
17
+ const [activeOrgId, setActiveOrgId] = useState(activeOrganizationId);
16
18
  useEffect(() => {
17
19
  if (config.userToken)
18
20
  setDecodedToken(decodeJWT(config.userToken));
19
21
  }, [config.userToken]);
22
+ useEffect(() => {
23
+ setActiveOrgId(activeOrganizationId);
24
+ }, [activeOrganizationId]);
20
25
  useEffect(() => {
21
26
  const { audience } = decodedToken || {};
22
27
  setDecodedAudience((typeof audience === "string" ? audience : audience?.[0]) || null);
23
28
  }, [decodedToken]);
24
- return (React.createElement(C3UserConfigurationContext.Provider, { value: { ...config, decodedToken, decodedAudience } },
29
+ return (React.createElement(C3UserConfigurationContext.Provider, { value: {
30
+ ...config,
31
+ activeOrganizationId: activeOrgId,
32
+ setActiveOrgId,
33
+ decodedToken,
34
+ decodedAudience,
35
+ } },
25
36
  React.createElement(C3ProfileProvider, null,
26
37
  React.createElement(C3HelpCenterProvider, null, children))));
27
38
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/camunda-composite-components",
3
- "version": "0.2.18-rc.4",
3
+ "version": "0.2.18-rc.5",
4
4
  "scripts": {
5
5
  "clean": "rimraf lib/",
6
6
  "build": "yarn clean && tsc",
@@ -33,16 +33,16 @@
33
33
  "@carbon/react": "1.37.0",
34
34
  "@mdx-js/react": "2.3.0",
35
35
  "@playwright/test": "1.37.1",
36
- "@storybook/addon-a11y": "7.4.6",
37
- "@storybook/addon-actions": "7.4.6",
38
- "@storybook/addon-docs": "7.4.6",
39
- "@storybook/addon-essentials": "7.4.6",
40
- "@storybook/addon-interactions": "7.4.6",
41
- "@storybook/addon-links": "7.4.6",
42
- "@storybook/blocks": "7.4.6",
36
+ "@storybook/addon-a11y": "7.5.1",
37
+ "@storybook/addon-actions": "7.5.1",
38
+ "@storybook/addon-docs": "7.5.1",
39
+ "@storybook/addon-essentials": "7.5.1",
40
+ "@storybook/addon-interactions": "7.5.1",
41
+ "@storybook/addon-links": "7.5.1",
42
+ "@storybook/blocks": "7.5.1",
43
43
  "@storybook/preset-scss": "1.0.3",
44
- "@storybook/react": "7.4.6",
45
- "@storybook/react-webpack5": "7.4.6",
44
+ "@storybook/react": "7.5.1",
45
+ "@storybook/react-webpack5": "7.5.1",
46
46
  "@storybook/test-runner": "0.13.0",
47
47
  "@storybook/testing-library": "0.2.2",
48
48
  "@types/carbon-components-react": "7.55.3",
@@ -52,20 +52,20 @@
52
52
  "@types/react": "18.2.21",
53
53
  "@types/react-dom": "18.2.7",
54
54
  "@types/styled-components": "5.1.27",
55
- "@typescript-eslint/eslint-plugin": "6.7.5",
56
- "@typescript-eslint/parser": "6.7.5",
55
+ "@typescript-eslint/eslint-plugin": "6.9.0",
56
+ "@typescript-eslint/parser": "6.9.0",
57
57
  "axe-playwright": "1.2.3",
58
58
  "babel-loader": "9.1.3",
59
59
  "copyfiles": "2.4.1",
60
60
  "css-loader": "6.8.1",
61
- "eslint": "8.51.0",
61
+ "eslint": "8.52.0",
62
62
  "eslint-config-prettier": "9.0.0",
63
63
  "eslint-import-resolver-typescript": "3.6.1",
64
- "eslint-plugin-import": "2.28.1",
64
+ "eslint-plugin-import": "2.29.0",
65
65
  "eslint-plugin-prettier": "5.0.1",
66
66
  "eslint-plugin-react": "7.33.2",
67
67
  "eslint-plugin-react-hooks": "4.6.0",
68
- "eslint-plugin-storybook": "0.6.14",
68
+ "eslint-plugin-storybook": "0.6.15",
69
69
  "event-source-polyfill": "1.0.31",
70
70
  "husky": "8.0.3",
71
71
  "mixpanel-browser": "2.47.0",
@@ -76,7 +76,7 @@
76
76
  "sass": "1.66.1",
77
77
  "sass-loader": "13.3.2",
78
78
  "serve": "14.2.1",
79
- "storybook": "7.4.6",
79
+ "storybook": "7.5.1",
80
80
  "style-loader": "3.3.3",
81
81
  "styled-components": "6.0.7",
82
82
  "typescript": "5.2.2",
@@ -1 +0,0 @@
1
- export declare const getTitleId: (title: string) => string;
@@ -1,5 +0,0 @@
1
- export const getTitleId = (title) => title
2
- .toLowerCase()
3
- .replace(/[^a-zA-Z0-9]+/g, "-")
4
- .replace(/^-/, "")
5
- .replace(/-$/, "");