impact-chatbot 2.3.86 → 2.3.88

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.
@@ -1,5 +1,7 @@
1
- declare const ChipsContent: ({ bodyText, props }: {
1
+ declare const ChipsContent: ({ bodyText, props, botData, isFormDisabled }: {
2
2
  bodyText: any;
3
3
  props: any;
4
+ botData: any;
5
+ isFormDisabled?: boolean;
4
6
  }) => import("react/jsx-runtime").JSX.Element;
5
7
  export default ChipsContent;
package/dist/index.cjs.js CHANGED
@@ -107,6 +107,18 @@ const getAgentVisibilityData = () => {
107
107
  console.error("getSmartBotVisibilityData error", error);
108
108
  }
109
109
  };
110
+ const getHideNavbotData = async (applicationCode) => {
111
+ try {
112
+ let { data } = await tenantConfigActions.tenantConfigApiCache(applicationCode, {
113
+ attribute_name: "hide_navbot",
114
+ })();
115
+ return data?.data?.[0]?.attribute_value?.value;
116
+ }
117
+ catch (error) {
118
+ console.error("getHideNavbotData error", error);
119
+ return false;
120
+ }
121
+ };
110
122
  const getAgentExceptionUserList = (applicationCode) => {
111
123
  try {
112
124
  return tenantConfigActions.tenantConfigApiCache(applicationCode, {
@@ -1154,13 +1166,6 @@ const resolveInternalPath = (href) => {
1154
1166
  return null;
1155
1167
  }
1156
1168
  };
1157
- /**
1158
- * Minimizes the chat window so the user can see the screen they navigated to.
1159
- * SmartBot (index.tsx) listens for this event and sets partialClose.
1160
- */
1161
- const minimizeChatBot = () => {
1162
- window.dispatchEvent(new CustomEvent("smartBotMinimize"));
1163
- };
1164
1169
  /**
1165
1170
  * Anchor rendered inside chatbot markdown. Internal links are navigated through
1166
1171
  * react-router so the chatbot is not remounted by a full page load.
@@ -1179,7 +1184,6 @@ const MarkdownLink = ({ href, children, ...props }) => {
1179
1184
  if (currentPath !== internalPath) {
1180
1185
  navigate(internalPath);
1181
1186
  }
1182
- minimizeChatBot();
1183
1187
  };
1184
1188
  return (jsxRuntime.jsx("a", { href: href, target: "_self", onClick: handleClick, ...props, children: children }));
1185
1189
  };
@@ -1282,7 +1286,6 @@ const TextRenderer = ({ text, thinking }) => {
1282
1286
  if (currentPath !== internalPath) {
1283
1287
  navigate(internalPath);
1284
1288
  }
1285
- minimizeChatBot();
1286
1289
  };
1287
1290
  // If the input contains rich HTML, render it directly with DOMPurify sanitization
1288
1291
  if (containsRichHtml(text)) {
@@ -5150,17 +5153,26 @@ const TextContent = ({ bodyText, botData }) => {
5150
5153
  return (jsxRuntime.jsx("div", { children: renderTextContent() }));
5151
5154
  };
5152
5155
 
5153
- const ChipsContent = ({ bodyText, props }) => {
5156
+ const ChipsContent = ({ bodyText, props, botData, isFormDisabled = false }) => {
5154
5157
  const classes = useStyles$a();
5155
5158
  const globalClasses = globalStyles();
5156
- return (jsxRuntime.jsx("div", { className: `${globalClasses.flexRow} ${globalClasses.flexWrap} ${globalClasses.gap} ${globalClasses.verticalAlignCenter}`, children: bodyText.map((data, index) => {
5157
- const callBack = data.interactable && props
5158
- ? Object.entries(props).filter((entry) => entry[0] === data.actionName)?.[0]?.[1]
5159
- : null;
5160
- return (jsxRuntime.jsx(material.Typography, { component: "span", variant: "body1", className: `${classes.gptChips} ${data.interactable ? globalClasses.cursorPointer : ""}`, onClick: () => {
5161
- callBack && callBack(data);
5162
- }, children: data.displayText }, index));
5163
- }) }));
5159
+ // Suggested-question chips are one-shot: once the user has clicked one of them
5160
+ // or asked a new question the block disappears. isFormDisabled is true for
5161
+ // every bot message except the latest, so it flips exactly when the user
5162
+ // moves past these chips. Only chips that opt in via isQuestionsDisabled
5163
+ // behave this way; all other chips stay visible.
5164
+ if (botData?.isQuestionsDisabled && isFormDisabled) {
5165
+ return null;
5166
+ }
5167
+ const showHeaderTitle = !botData?.noShowHeaderTitle && Boolean(botData?.headerTitle?.length);
5168
+ return (jsxRuntime.jsxs(React.Fragment, { children: [showHeaderTitle && (jsxRuntime.jsx("div", { className: `${classes.chatbotText} ${classes.boldText} ${classes.combinedBlockHeaderTitle}`, children: botData.headerTitle })), jsxRuntime.jsx("div", { className: `${globalClasses.flexRow} ${globalClasses.flexWrap} ${globalClasses.gap} ${globalClasses.verticalAlignCenter}`, children: bodyText.map((data, index) => {
5169
+ const callBack = data.interactable && props
5170
+ ? Object.entries(props).filter((entry) => entry[0] === data.actionName)?.[0]?.[1]
5171
+ : null;
5172
+ return (jsxRuntime.jsx(material.Typography, { component: "span", variant: "body1", className: `${classes.gptChips} ${data.interactable ? globalClasses.cursorPointer : ""}`, onClick: () => {
5173
+ callBack && callBack(data);
5174
+ }, children: data.displayText }, index));
5175
+ }) })] }));
5164
5176
  };
5165
5177
 
5166
5178
  /**
@@ -6157,7 +6169,8 @@ const TableContent = ({ bodyText }) => {
6157
6169
  };
6158
6170
 
6159
6171
  const GraphContent = ({ bodyText }) => {
6160
- const { chartOptions } = bodyText || {};
6172
+ const { chartOptions, title } = bodyText || {};
6173
+ const classes = useStyles$a();
6161
6174
  const chartRef = React.useRef(null);
6162
6175
  const handleChartRef = (ref) => {
6163
6176
  chartRef.current = ref;
@@ -6168,7 +6181,7 @@ const GraphContent = ({ bodyText }) => {
6168
6181
  const options = {
6169
6182
  ...chartOptions,
6170
6183
  };
6171
- return (jsxRuntime.jsx(material.Grid, { container: true, children: jsxRuntime.jsx(material.Grid, { item: true, xs: 12, children: jsxRuntime.jsx(CoreChart, { options: options, handleChartRef: handleChartRef }) }) }));
6184
+ return (jsxRuntime.jsxs(material.Grid, { container: true, children: [Boolean(title?.length) && (jsxRuntime.jsx(material.Grid, { item: true, xs: 12, children: jsxRuntime.jsx("div", { className: `${classes.chatbotText} ${classes.boldText} ${classes.combinedBlockHeaderTitle}`, children: title }) })), jsxRuntime.jsx(material.Grid, { item: true, xs: 12, children: jsxRuntime.jsx(CoreChart, { options: options, handleChartRef: handleChartRef }) })] }));
6172
6185
  };
6173
6186
 
6174
6187
  const SelectableChips = ({ bodyText, chipType, props, utilityData }) => {
@@ -7556,7 +7569,6 @@ const STEP_FORM_TIMEOUT_KEY = "__stepFormTimedOut";
7556
7569
  */
7557
7570
  const StepFormContent = ({ formData, messageIndex = 0, isFormDisabled = false, showSavedFilters = true, preSelectedFilters = null, botProps = null, currentMode = "", agentId = "", sessionId = "", }) => {
7558
7571
  const dispatch = reactRedux.useDispatch();
7559
- const classes = useStyles$a();
7560
7572
  const savedFilterSets = reactRedux.useSelector((state) => state.smartBotReducer.savedFilterSets);
7561
7573
  const persistedFormValues = reactRedux.useSelector((state) => state.smartBotReducer.persistedFormValues);
7562
7574
  const chatbotContext = reactRedux.useSelector((state) => state.smartBotReducer.chatbotContext);
@@ -7829,13 +7841,13 @@ const StepFormContent = ({ formData, messageIndex = 0, isFormDisabled = false, s
7829
7841
  case "text":
7830
7842
  return jsxRuntime.jsx(TextContent, { bodyText: parsedData.bodyText, botData: parsedData }, key);
7831
7843
  case "chips":
7832
- return parsedData.isMultiSelect ? (jsxRuntime.jsx(SelectableChips, { bodyText: parsedData.bodyText, chipType: "selectable", utilityData: parsedData.utilityData, props: botProps }, key)) : (jsxRuntime.jsx(ChipsContent, { bodyText: parsedData.bodyText, props: botProps }, key));
7844
+ return parsedData.isMultiSelect ? (jsxRuntime.jsx(SelectableChips, { bodyText: parsedData.bodyText, chipType: "selectable", utilityData: parsedData.utilityData, props: botProps }, key)) : (jsxRuntime.jsx(ChipsContent, { bodyText: parsedData.bodyText, props: botProps, botData: parsedData, isFormDisabled: isFormDisabled }, key));
7833
7845
  case "questions":
7834
7846
  return jsxRuntime.jsx(QuestionsContent, { bodyText: parsedData.bodyText, props: botProps }, key);
7835
7847
  case "html":
7836
7848
  return jsxRuntime.jsx(HtmlContent, { bodyText: parsedData.bodyText }, key);
7837
7849
  case "table":
7838
- return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, key);
7850
+ return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, parsedData.bodyText?.table_name || key);
7839
7851
  case "graph":
7840
7852
  return jsxRuntime.jsx(GraphContent, { bodyText: parsedData.bodyText }, key);
7841
7853
  case "slider":
@@ -7870,17 +7882,11 @@ const StepFormContent = ({ formData, messageIndex = 0, isFormDisabled = false, s
7870
7882
  const body = renderItem(parsedData, index);
7871
7883
  if (!body)
7872
7884
  return;
7873
- // Skip the block header when it is just a repeat of the label the widget
7874
- // renders itself (parseResponse derives headerTitle from label for inputs).
7875
- const showHeaderTitle = !parsedData?.noShowHeaderTitle &&
7876
- Boolean(parsedData?.headerTitle?.length) &&
7877
- parsedData.headerTitle !== parsedData?.bodyText?.label;
7878
- const rendered = showHeaderTitle ? (jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx("div", { className: `${classes.chatbotText} ${classes.boldText} ${classes.combinedBlockHeaderTitle}`, children: parsedData.headerTitle }), body] }, `step-form-block-${index}`)) : (body);
7879
7885
  if (parsedData.bodyType === "button") {
7880
- buttonItems.push(rendered);
7886
+ buttonItems.push(body);
7881
7887
  }
7882
7888
  else {
7883
- formFields.push(rendered);
7889
+ formFields.push(body);
7884
7890
  }
7885
7891
  }
7886
7892
  catch (error) {
@@ -8390,7 +8396,10 @@ const renderWidgetItem = (item, index, isFormDisabled) => {
8390
8396
  case "text":
8391
8397
  return jsxRuntime.jsx(TextContent, { bodyText: parsedData.bodyText, botData: parsedData }, key);
8392
8398
  case "table":
8393
- return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, key);
8399
+ // Key on table_name so a different table never reuses a mounted grid.
8400
+ // ag-grid captures its fetch callback once at init, so a reused grid
8401
+ // would keep querying the previous table's table_name.
8402
+ return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, parsedData.bodyText?.table_name || key);
8394
8403
  case "graph":
8395
8404
  return jsxRuntime.jsx(GraphContent, { bodyText: parsedData.bodyText }, key);
8396
8405
  case "radio":
@@ -10339,7 +10348,6 @@ let instanceCounter = 0;
10339
10348
  let activeTabularInstanceId = null;
10340
10349
  const TabularContent = ({ steps: initialSteps, currentTabValue, children, questions: initialQuestions = [], questionsStepsMap: initialQuestionsStepsMap = {}, stepFormDataMap: initialStepFormDataMap = {}, isFormDisabled = false, sessionId: propSessionId = "", botProps = null, currentMode = "", agentId = "" }) => {
10341
10350
  const dispatch = reactRedux.useDispatch();
10342
- const chatClasses = useStyles$a();
10343
10351
  const stepFormStreamData = reactRedux.useSelector((state) => state.smartBotReducer.stepFormStreamData);
10344
10352
  const thinkingContext = reactRedux.useSelector((state) => state.smartBotReducer.thinkingContext);
10345
10353
  const streamStartTimeRef = React.useRef(thinkingContext?.streamStartTime);
@@ -10428,13 +10436,13 @@ const TabularContent = ({ steps: initialSteps, currentTabValue, children, questi
10428
10436
  case "text":
10429
10437
  return jsxRuntime.jsx(TextContent, { bodyText: parsedData.bodyText, botData: parsedData }, key);
10430
10438
  case "chips":
10431
- return parsedData.isMultiSelect ? (jsxRuntime.jsx(SelectableChips, { bodyText: parsedData.bodyText, chipType: "selectable", utilityData: parsedData.utilityData, props: botProps }, key)) : (jsxRuntime.jsx(ChipsContent, { bodyText: parsedData.bodyText, props: botProps }, key));
10439
+ return parsedData.isMultiSelect ? (jsxRuntime.jsx(SelectableChips, { bodyText: parsedData.bodyText, chipType: "selectable", utilityData: parsedData.utilityData, props: botProps }, key)) : (jsxRuntime.jsx(ChipsContent, { bodyText: parsedData.bodyText, props: botProps, botData: parsedData, isFormDisabled: isFormDisabled }, key));
10432
10440
  case "questions":
10433
10441
  return jsxRuntime.jsx(QuestionsContent, { bodyText: parsedData.bodyText, props: botProps }, key);
10434
10442
  case "image":
10435
10443
  return jsxRuntime.jsx(ImageContent, { bodyText: parsedData.bodyText }, key);
10436
10444
  case "table":
10437
- return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, key);
10445
+ return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, parsedData.bodyText?.table_name || key);
10438
10446
  case "graph":
10439
10447
  return jsxRuntime.jsx(GraphContent, { bodyText: parsedData.bodyText }, key);
10440
10448
  case "radio":
@@ -10465,13 +10473,7 @@ const TabularContent = ({ steps: initialSteps, currentTabValue, children, questi
10465
10473
  if (!parsedData)
10466
10474
  return null;
10467
10475
  const key = `restream-widget-${index}`;
10468
- const body = renderWidgetBody(parsedData, key);
10469
- if (!body)
10470
- return null;
10471
- const showHeaderTitle = !parsedData?.noShowHeaderTitle && Boolean(parsedData?.headerTitle?.length);
10472
- if (!showHeaderTitle)
10473
- return body;
10474
- return (jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx("div", { className: `${chatClasses.chatbotText} ${chatClasses.boldText} ${chatClasses.combinedBlockHeaderTitle}`, children: parsedData.headerTitle }), body] }, `restream-widget-block-${index}`));
10476
+ return renderWidgetBody(parsedData, key);
10475
10477
  }
10476
10478
  catch (e) {
10477
10479
  console.error("[TabularContent] renderWidget error:", e);
@@ -10835,19 +10837,10 @@ const resetActiveTabularInstance = () => {
10835
10837
  };
10836
10838
 
10837
10839
  const CombinedContent = ({ botData, props }) => {
10838
- const classes = useStyles$a();
10839
10840
  const isFormDisabled = botData?.isFormDisabled || false;
10840
10841
  const isTabEnabled = botData?.utilityData?.isTabEnabled;
10841
10842
  // Get the array of content items from bodyText
10842
10843
  const contentItems = Array.isArray(botData.bodyText) ? botData.bodyText : [];
10843
- // Renders the optional block-level header title above a content item.
10844
- const renderHeaderTitle = (parsedData) => {
10845
- const showHeaderTitle = !parsedData?.noShowHeaderTitle &&
10846
- Boolean(parsedData?.headerTitle?.length);
10847
- if (!showHeaderTitle)
10848
- return null;
10849
- return (jsxRuntime.jsx("div", { className: `${classes.chatbotText} ${classes.boldText} ${classes.combinedBlockHeaderTitle}`, children: parsedData.headerTitle }));
10850
- };
10851
10844
  // Function to render individual content based on its type
10852
10845
  const renderIndividualContent = (parsedData, index) => {
10853
10846
  const key = `combined-content-${index}`;
@@ -10859,12 +10852,12 @@ const CombinedContent = ({ botData, props }) => {
10859
10852
  return (jsxRuntime.jsx(SelectableChips, { bodyText: parsedData.bodyText, chipType: "selectable", utilityData: parsedData.utilityData, props: props }, key));
10860
10853
  }
10861
10854
  else {
10862
- return jsxRuntime.jsx(ChipsContent, { bodyText: parsedData.bodyText, props: props }, key);
10855
+ return (jsxRuntime.jsx(ChipsContent, { bodyText: parsedData.bodyText, props: props, botData: parsedData, isFormDisabled: isFormDisabled }, key));
10863
10856
  }
10864
10857
  case "questions":
10865
10858
  return jsxRuntime.jsx(QuestionsContent, { bodyText: parsedData.bodyText, props: props }, key);
10866
10859
  case "table":
10867
- return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, key);
10860
+ return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, parsedData.bodyText?.table_name || key);
10868
10861
  case "graph":
10869
10862
  return jsxRuntime.jsx(GraphContent, { bodyText: parsedData.bodyText }, key);
10870
10863
  case "slider":
@@ -10900,8 +10893,8 @@ const CombinedContent = ({ botData, props }) => {
10900
10893
  if (!parsedData) {
10901
10894
  return null;
10902
10895
  }
10903
- // Render the parsed content, preceded by the block's header title when present
10904
- return (jsxRuntime.jsxs(React.Fragment, { children: [renderHeaderTitle(parsedData), renderIndividualContent(parsedData, index)] }, `combined-block-${index}`));
10896
+ // Render the parsed content
10897
+ return renderIndividualContent(parsedData, index);
10905
10898
  }
10906
10899
  catch (error) {
10907
10900
  console.error(`Error parsing combined content item at index ${index}:`, error);
@@ -15314,9 +15307,11 @@ const SmartBot = (props) => {
15314
15307
  skipHierarchyCall: true,
15315
15308
  })();
15316
15309
  let showAgentIcon = await getAgentVisibilityData();
15310
+ let appCode = utils$2.getApplicationCodeFromURL(applicationName);
15311
+ let hideNavbot = await getHideNavbotData(appCode);
15312
+ const filterNavigationTab = (tabs) => hideNavbot ? tabs.filter((tab) => tab.name !== "Navigation") : tabs;
15317
15313
  if (!lodash.isEmpty(accessDataResponse) &&
15318
15314
  showAgentIcon?.data?.data[0]?.attribute_value?.value) {
15319
- let appCode = utils$2.getApplicationCodeFromURL(applicationName);
15320
15315
  let list = await getAgentExceptionUserList(appCode);
15321
15316
  let isWhitelisted = false;
15322
15317
  if (list?.data?.data[0]?.attribute_value?.allow_all) {
@@ -15528,7 +15523,7 @@ const SmartBot = (props) => {
15528
15523
  icon: jsxRuntime.jsx(SvgNavigationIcon, {}),
15529
15524
  }
15530
15525
  ];
15531
- setTabList(tabListData);
15526
+ setTabList(filterNavigationTab(tabListData));
15532
15527
  }
15533
15528
  else {
15534
15529
  setCurrentMode("navigation");