@deviceinsight/ng-ui-components 7.21.0 → 7.23.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 (84) hide show
  1. package/README.md +104 -9
  2. package/dist/index.cjs +122 -139
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.js +122 -139
  5. package/dist/index.js.map +1 -1
  6. package/dist/style.css +1 -1
  7. package/dist/types/__mocks__/i18n.d.ts.map +1 -1
  8. package/dist/types/components/chart/Chart.d.ts +11 -3
  9. package/dist/types/components/chart/Chart.d.ts.map +1 -1
  10. package/dist/types/components/chart/Chart.stories.d.ts +7 -7
  11. package/dist/types/components/chart/Chart.stories.d.ts.map +1 -1
  12. package/dist/types/components/colorpicker/ColorTextInput.d.ts.map +1 -1
  13. package/dist/types/components/colorpicker/GradientColorPicker.stories.d.ts.map +1 -1
  14. package/dist/types/components/colorpicker/GridColorPicker.stories.d.ts.map +1 -1
  15. package/dist/types/components/contentHeader/ContentHeader.d.ts.map +1 -1
  16. package/dist/types/components/contentHeader/ContentHeader.stories.d.ts.map +1 -1
  17. package/dist/types/components/infobox/InfoBox.d.ts.map +1 -1
  18. package/dist/types/components/infobox/InfoBox.stories.d.ts.map +1 -1
  19. package/dist/types/components/input/DateInput.d.ts.map +1 -1
  20. package/dist/types/components/input/DateInput.stories.d.ts +2 -1
  21. package/dist/types/components/input/DateInput.stories.d.ts.map +1 -1
  22. package/dist/types/components/input/DateTimeInput.d.ts.map +1 -1
  23. package/dist/types/components/input/DateTimeInput.stories.d.ts +12 -11
  24. package/dist/types/components/input/DateTimeInput.stories.d.ts.map +1 -1
  25. package/dist/types/components/input/SelectWithSearch.d.ts.map +1 -1
  26. package/dist/types/components/input/SelectWithSearch.stories.d.ts.map +1 -1
  27. package/dist/types/components/input/SelectWithSearchAsync.d.ts +5 -1
  28. package/dist/types/components/input/SelectWithSearchAsync.d.ts.map +1 -1
  29. package/dist/types/components/input/SelectWithSearchAsync.stories.d.ts.map +1 -1
  30. package/dist/types/components/input/UrnInput.d.ts.map +1 -1
  31. package/dist/types/components/input/UrnInput.stories.d.ts.map +1 -1
  32. package/dist/types/components/input/ValidatedTextInput.d.ts.map +1 -1
  33. package/dist/types/components/input/ValidatedTextInput.stories.d.ts.map +1 -1
  34. package/dist/types/components/link/RouteLink.stories.d.ts.map +1 -1
  35. package/dist/types/components/multiMenu/MultiMenu.stories.d.ts.map +1 -1
  36. package/dist/types/components/multiMenu/components/MultiMenuContext.d.ts.map +1 -1
  37. package/dist/types/components/multiMenu/components/MultiMenuItem.d.ts.map +1 -1
  38. package/dist/types/components/pagination/Pagination.d.ts.map +1 -1
  39. package/dist/types/components/pagination/Pagination.stories.d.ts.map +1 -1
  40. package/dist/types/components/periodpicker/PeriodPicker.stories.d.ts.map +1 -1
  41. package/dist/types/components/periodpicker/components/MonthPicker.d.ts.map +1 -1
  42. package/dist/types/components/periodpicker/periods.d.ts.map +1 -1
  43. package/dist/types/components/prompt/Prompt.stories.d.ts.map +1 -1
  44. package/dist/types/components/reactable/Reactable.d.ts.map +1 -1
  45. package/dist/types/components/reactable/Reactable.stories.d.ts.map +1 -1
  46. package/dist/types/components/reactable/helpers/ReactableTableFilterRow.d.ts.map +1 -1
  47. package/dist/types/components/reactable/helpers/ReactableTableHeader.d.ts +1 -1
  48. package/dist/types/components/reactable/helpers/ReactableTableHeader.d.ts.map +1 -1
  49. package/dist/types/components/reactable/helpers/ReactableTableRow.d.ts.map +1 -1
  50. package/dist/types/components/reactable/helpers/ReactableTextFilter.d.ts.map +1 -1
  51. package/dist/types/components/reactableWithClientSidePagination/ReactableWithClientSidePagination.d.ts +7 -1
  52. package/dist/types/components/reactableWithClientSidePagination/ReactableWithClientSidePagination.d.ts.map +1 -1
  53. package/dist/types/components/reactableWithClientSidePagination/ReactableWithClientSidePagination.stories.d.ts.map +1 -1
  54. package/dist/types/components/slider/RcSliderWithTooltip.d.ts.map +1 -1
  55. package/dist/types/components/slider/Slider.d.ts.map +1 -1
  56. package/dist/types/components/slider/Slider.stories.d.ts.map +1 -1
  57. package/dist/types/components/svg/SvgImage.d.ts.map +1 -1
  58. package/dist/types/components/svg/SvgImage.stories.d.ts.map +1 -1
  59. package/dist/types/components/svg/utils/getMutableNodeList.d.ts.map +1 -1
  60. package/dist/types/components/svg/utils/getSvgElement.d.ts +1 -1
  61. package/dist/types/components/svg/utils/getSvgElement.d.ts.map +1 -1
  62. package/dist/types/components/svg/utils/transformPositionModifications.d.ts +1 -1
  63. package/dist/types/components/svg/utils/transformPositionModifications.d.ts.map +1 -1
  64. package/dist/types/components/svg/utils/validateSvg.d.ts +1 -1
  65. package/dist/types/components/svg/utils/validateSvg.d.ts.map +1 -1
  66. package/dist/types/components/tabs/RouteTabs.stories.d.ts.map +1 -1
  67. package/dist/types/components/treeview/TreeView.d.ts +9 -4
  68. package/dist/types/components/treeview/TreeView.d.ts.map +1 -1
  69. package/dist/types/components/treeview/TreeView.stories.d.ts.map +1 -1
  70. package/dist/types/components/treeview/components/Node.d.ts +2 -5
  71. package/dist/types/components/treeview/components/Node.d.ts.map +1 -1
  72. package/dist/types/components/treeview/components/NodeInfo.d.ts.map +1 -1
  73. package/dist/types/components/upload/FileUpload.d.ts.map +1 -1
  74. package/dist/types/components/upload/FileUpload.stories.d.ts.map +1 -1
  75. package/dist/types/components/upload/ImageUpload.d.ts +2 -2
  76. package/dist/types/components/upload/ImageUpload.d.ts.map +1 -1
  77. package/dist/types/components/upload/ImageUpload.stories.d.ts +11 -11
  78. package/dist/types/components/upload/ImageUpload.stories.d.ts.map +1 -1
  79. package/dist/types/index.d.ts +1 -1
  80. package/dist/types/index.d.ts.map +1 -1
  81. package/dist/types/modules/messageBox/MessageBox.stories.d.ts.map +1 -1
  82. package/dist/types/modules/messageBox/messageBox.d.ts.map +1 -1
  83. package/dist/types/modules/utils/uuidGen.d.ts.map +1 -1
  84. package/package.json +22 -26
package/dist/index.js CHANGED
@@ -394,9 +394,11 @@ var ValidatedTextInput = class extends React.Component {
394
394
  //#region src/components/colorpicker/ColorTextInput.tsx
395
395
  function ColorTextInput({ value, pattern, onChange, placeholder, style }) {
396
396
  const [text, setText] = useState(value);
397
- useEffect(() => {
397
+ const [lastValue, setLastValue] = useState(value);
398
+ if (value !== lastValue) {
399
+ setLastValue(value);
398
400
  setText(value);
399
- }, [value]);
401
+ }
400
402
  function handleChange(value, valid) {
401
403
  setText(value);
402
404
  if (valid) onChange(value);
@@ -527,9 +529,7 @@ function inputToTzDate(value, pattern, timezone) {
527
529
  var DateInput = forwardRef(({ value, clearable, inline, readOnly, wrapperClassName, onChange, locale, timezone, ...otherProps }, ref) => {
528
530
  const [pattern, setPattern] = useState(dayjs.localeData().longDateFormat("L"));
529
531
  const { t } = useTranslation();
530
- const [valid, setValid] = useState(false);
531
532
  const [popupOpen, setPopupOpen] = useState(false);
532
- const [inputText, setInputText] = useState("");
533
533
  const debouncedSetPopupActive = useMemo(() => debounce(setPopupOpen, 30), []);
534
534
  useEffect(() => {
535
535
  const language = locale ?? i18n.language;
@@ -547,17 +547,22 @@ var DateInput = forwardRef(({ value, clearable, inline, readOnly, wrapperClassNa
547
547
  t,
548
548
  timezone
549
549
  ]);
550
- useEffect(() => {
551
- if (value == null) setInputText("");
552
- else setInputText(formattedDate(value));
553
- }, [formattedDate, value]);
554
- useEffect(() => {
550
+ const [valid, setValid] = useState(() => isInputValid(value, pattern));
551
+ const [inputText, setInputText] = useState(() => value == null ? "" : formattedDate(value));
552
+ const [lastInput, setLastInput] = useState({
553
+ value,
554
+ pattern,
555
+ timezone
556
+ });
557
+ if (!Object.is(value, lastInput.value) || pattern !== lastInput.pattern || timezone !== lastInput.timezone) {
558
+ setLastInput({
559
+ value,
560
+ pattern,
561
+ timezone
562
+ });
563
+ setInputText(value == null ? "" : formattedDate(value));
555
564
  setValid(isInputValid(value, pattern));
556
- }, [pattern, value]);
557
- useEffect(() => {
558
- dayjs.locale(locale ?? i18n.language);
559
- setPattern(dayjs.localeData().longDateFormat("L"));
560
- }, [locale]);
565
+ }
561
566
  const handleInputTextChange = (text) => {
562
567
  setInputText(text);
563
568
  if (text) {
@@ -1097,7 +1102,6 @@ var Node = class Node extends Component {
1097
1102
  super(..._args);
1098
1103
  this.state = {
1099
1104
  expanded: false,
1100
- selectionState: this.getSelectionState(),
1101
1105
  isLoading: false
1102
1106
  };
1103
1107
  this.toggleExpand = () => {
@@ -1123,28 +1127,23 @@ var Node = class Node extends Component {
1123
1127
  * @param {Props} prevProps
1124
1128
  * @param {State} prevState
1125
1129
  */
1126
- shouldComponentUpdate(prevProps, prevState) {
1127
- const { selectedNodes: prevSelectedNodes, treeSize: prevTreeSize } = prevProps;
1128
- const { expanded: prevExpanded, selectionState: prevSelectionState, isLoading: prevIsLoading } = prevState;
1130
+ shouldComponentUpdate(nextProps, nextState) {
1131
+ const { selectedNodes: nextSelectedNodes, treeSize: nextTreeSize } = nextProps;
1132
+ const { expanded: nextExpanded, isLoading: nextIsLoading } = nextState;
1129
1133
  const { selectedNodes, node, treeSize } = this.props;
1130
- const { expanded, selectionState, isLoading } = this.state;
1131
- if (prevIsLoading !== isLoading) return true;
1132
- if (prevTreeSize !== treeSize) return true;
1133
- if (this.isLeaf()) return prevSelectedNodes.includes(node.id) && !selectedNodes.includes(node.id) || !prevSelectedNodes.includes(node.id) && selectedNodes.includes(node.id) || prevSelectionState !== selectionState;
1134
- else return prevSelectedNodes.length !== selectedNodes.length || prevExpanded !== expanded || prevSelectionState !== selectionState;
1135
- }
1136
- componentDidMount() {
1137
- this.setState({ selectionState: this.getSelectionState() });
1138
- }
1139
- componentDidUpdate() {
1140
- this.setState({ selectionState: this.getSelectionState() });
1134
+ const { expanded, isLoading } = this.state;
1135
+ const selectionStateChanged = this.getSelectionState(this.props) !== this.getSelectionState(nextProps);
1136
+ if (isLoading !== nextIsLoading) return true;
1137
+ if (treeSize !== nextTreeSize) return true;
1138
+ if (this.isLeaf()) return selectedNodes.includes(node.id) && !nextSelectedNodes.includes(node.id) || !selectedNodes.includes(node.id) && nextSelectedNodes.includes(node.id) || selectionStateChanged;
1139
+ else return selectedNodes.length !== nextSelectedNodes.length || expanded !== nextExpanded || selectionStateChanged;
1141
1140
  }
1142
1141
  isLeaf() {
1143
1142
  const { node } = this.props;
1144
1143
  return node.children === void 0;
1145
1144
  }
1146
- getSelectionState() {
1147
- const { node, selectedNodes } = this.props;
1145
+ getSelectionState(props = this.props) {
1146
+ const { node, selectedNodes } = props;
1148
1147
  if (this.isLeaf()) return selectedNodes.includes(node.id) ? SelectionState.ALL : SelectionState.NONE;
1149
1148
  else {
1150
1149
  const leafIds = getAllLeafIds(node);
@@ -1156,7 +1155,8 @@ var Node = class Node extends Component {
1156
1155
  }
1157
1156
  render() {
1158
1157
  const { node, isLastChild, ...commonNodeProps } = this.props;
1159
- const { expanded, selectionState, isLoading } = this.state;
1158
+ const { expanded, isLoading } = this.state;
1159
+ const selectionState = this.getSelectionState();
1160
1160
  return /* @__PURE__ */ jsxs("div", {
1161
1161
  className: "node",
1162
1162
  children: [/* @__PURE__ */ jsx(NodeInfo, {
@@ -1187,19 +1187,15 @@ var Node = class Node extends Component {
1187
1187
  var TreeView = class extends Component {
1188
1188
  constructor(..._args) {
1189
1189
  super(..._args);
1190
+ this.convert = convertToTree(this.props.dataSetConfig);
1191
+ this.initialTree = this.initTree(this.props.treeData);
1190
1192
  this.state = {
1191
1193
  treeData: this.props.treeData,
1192
- tree: {
1193
- id: "virtualRootNode",
1194
- name: "",
1195
- children: [],
1196
- path: "/",
1197
- originalNode: {}
1198
- },
1199
- treeSize: 0,
1200
- selectedNodes: this.props.selectedNodes || []
1194
+ tree: this.initialTree,
1195
+ treeSize: getTreeSize(this.initialTree),
1196
+ selectedNodes: this.props.selectedNodes || [],
1197
+ lastSelectedNodes: this.props.selectedNodes || []
1201
1198
  };
1202
- this.convert = convertToTree(this.props.dataSetConfig);
1203
1199
  this.selectNodes = (nodes) => {
1204
1200
  const { onSelect } = this.props;
1205
1201
  const { selectedNodes } = this.state;
@@ -1247,19 +1243,15 @@ var TreeView = class extends Component {
1247
1243
  });
1248
1244
  };
1249
1245
  }
1250
- componentDidMount() {
1251
- const { treeData } = this.props;
1252
- const tree = this.initTree(treeData);
1253
- const treeSize = getTreeSize(tree);
1254
- this.setState({
1255
- tree,
1256
- treeSize
1257
- });
1258
- }
1259
- componentDidUpdate(prevProps) {
1260
- const { selectedNodes: prevNodes } = prevProps;
1261
- const { selectedNodes } = this.props;
1262
- if (selectedNodes && prevNodes && prevNodes.length !== selectedNodes.length) this.setState({ selectedNodes });
1246
+ static {
1247
+ this.getDerivedStateFromProps = (props, state) => {
1248
+ const { selectedNodes } = props;
1249
+ if (selectedNodes && selectedNodes.length !== state.lastSelectedNodes.length) return {
1250
+ selectedNodes,
1251
+ lastSelectedNodes: selectedNodes
1252
+ };
1253
+ return null;
1254
+ };
1263
1255
  }
1264
1256
  initTree(treeData) {
1265
1257
  return {
@@ -1336,9 +1328,11 @@ function Pagination({ onChangePage, page, totalPages, onChangeSize, size }) {
1336
1328
  useEffect(() => {
1337
1329
  changePageDebouncedRef.current = debounce(onChangePage, 500);
1338
1330
  }, [onChangePage]);
1339
- useEffect(() => {
1331
+ const [lastPage, setLastPage] = useState(page);
1332
+ if (page !== lastPage) {
1333
+ setLastPage(page);
1340
1334
  setPageRaw(`${page + 1}`);
1341
- }, [page]);
1335
+ }
1342
1336
  function goToFirstPage() {
1343
1337
  onChangePage(0);
1344
1338
  }
@@ -1558,8 +1552,10 @@ var SelectWithSearch = class extends Component {
1558
1552
  value: this.state.inputValue,
1559
1553
  label: this.state.inputValue
1560
1554
  };
1561
- this.setState((prevState) => ({ options: [newItem, ...prevState.options] }));
1562
- this.state.inputValue = null;
1555
+ this.setState((prevState) => ({
1556
+ options: [newItem, ...prevState.options],
1557
+ inputValue: null
1558
+ }));
1563
1559
  onChange(newItem);
1564
1560
  });
1565
1561
  }
@@ -2083,16 +2079,27 @@ var ReactableWithClientSidePagination = class extends Component {
2083
2079
  this.state = {
2084
2080
  paginationSettings: paginationSettings || DEFAULT_PAGINATION_SETTINGS,
2085
2081
  filterSettings: {},
2086
- filteredItems: null
2082
+ filteredItems: null,
2083
+ lastSettings: paginationSettings
2087
2084
  };
2088
2085
  }
2089
2086
  componentDidUpdate(prevProps) {
2090
2087
  const { items } = this.props;
2091
2088
  const { items: prevItems } = prevProps;
2092
- const settings = this.props.paginationSettings || this.props.initialPaginationSettings;
2093
- const prevSettings = prevProps.paginationSettings || prevProps.initialPaginationSettings;
2094
2089
  if (items && prevItems && items.length !== prevItems.length) this.calculatePageNumber(items, this.state.paginationSettings);
2095
- if (settings && !isEqual(settings, prevSettings)) this.setState({ paginationSettings: settings }, () => this.handleChangePage(0));
2090
+ }
2091
+ static {
2092
+ this.getDerivedStateFromProps = (props, state) => {
2093
+ const settings = props.paginationSettings || props.initialPaginationSettings;
2094
+ if (settings && !isEqual(settings, state.lastSettings)) return {
2095
+ lastSettings: settings,
2096
+ paginationSettings: {
2097
+ ...settings,
2098
+ page: 0
2099
+ }
2100
+ };
2101
+ return null;
2102
+ };
2096
2103
  }
2097
2104
  render() {
2098
2105
  const { uniqueItemKey, isLoading, columnDefs, rowDef, tableName, clickable, selectable, selectedItems, onChangeSize } = this.props;
@@ -2275,20 +2282,17 @@ var ImageUpload = class extends Component {
2275
2282
  constructor(..._args) {
2276
2283
  super(..._args);
2277
2284
  this.state = {
2278
- dragOverPreview: false,
2285
+ dragOverUrl: void 0,
2279
2286
  file: null
2280
2287
  };
2281
2288
  this.handleDragOver = () => {
2282
- this.setState({ dragOverPreview: true });
2289
+ this.setState({ dragOverUrl: this.props.imageUrl });
2283
2290
  };
2284
2291
  }
2285
- componentDidUpdate(prevProps) {
2286
- if (prevProps.imageUrl !== this.props.imageUrl) this.setState({ dragOverPreview: false });
2287
- }
2288
2292
  render() {
2289
2293
  const { accept, imageUrl, imageSize, onSelectFile, onRemoveFile, onDownloadFile, ...otherProps } = this.props;
2290
- const { dragOverPreview, file } = this.state;
2291
- if (imageUrl && !dragOverPreview && file) return /* @__PURE__ */ jsx(PreviewImage, {
2294
+ const { dragOverUrl, file } = this.state;
2295
+ if (imageUrl && !(dragOverUrl !== void 0 && dragOverUrl === imageUrl) && file) return /* @__PURE__ */ jsx(PreviewImage, {
2292
2296
  url: imageUrl,
2293
2297
  imageSize,
2294
2298
  onRemoveFile: () => onRemoveFile?.(file),
@@ -2298,7 +2302,10 @@ var ImageUpload = class extends Component {
2298
2302
  else return /* @__PURE__ */ jsx(FileUpload, {
2299
2303
  ...otherProps,
2300
2304
  onRemoveFile: (file) => {
2301
- this.setState({ file: null });
2305
+ this.setState({
2306
+ file: null,
2307
+ dragOverUrl: void 0
2308
+ });
2302
2309
  onRemoveFile?.(file);
2303
2310
  },
2304
2311
  onSelectFile: (file) => {
@@ -2377,9 +2384,17 @@ var formatTime = (timezone, date) => {
2377
2384
  var DateTimeInput = forwardRef(({ timestamp, timezone, warning, readOnly = false, onChange, ...otherProps }, ref) => {
2378
2385
  const [time, setTime] = useState(formatTime(timezone, timestamp));
2379
2386
  const timeValue = time == null ? formatTime(timezone, timestamp) : time;
2380
- useEffect(() => {
2387
+ const [lastInput, setLastInput] = useState({
2388
+ timestamp,
2389
+ timezone
2390
+ });
2391
+ if (timestamp !== lastInput.timestamp || timezone !== lastInput.timezone) {
2392
+ setLastInput({
2393
+ timestamp,
2394
+ timezone
2395
+ });
2381
2396
  setTime(formatTime(timezone, timestamp));
2382
- }, [timezone, timestamp]);
2397
+ }
2383
2398
  function handleChangeDate(date, fromTextField) {
2384
2399
  const currentDate = dayjs.tz(timestamp, timezone);
2385
2400
  onChange(dayjs.tz(date, timezone).set("hour", currentDate.hour()).set("minute", currentDate.minute()).set("second", currentDate.second()).set("millisecond", currentDate.millisecond()).valueOf(), fromTextField);
@@ -2498,7 +2513,13 @@ var SelectWithSearchAsync = class extends Component {
2498
2513
  const { currentItem } = this.state;
2499
2514
  if (value && (!currentItem || currentItem.value !== value)) {
2500
2515
  if (!this.reloadItemFromCache()) searchById(value).then(this.addBackendItemToCache);
2501
- } else if (!value && currentItem) this.setState({ currentItem: null });
2516
+ }
2517
+ }
2518
+ static {
2519
+ this.getDerivedStateFromProps = (props, state) => {
2520
+ if (!props.value && state.currentItem) return { currentItem: null };
2521
+ return null;
2522
+ };
2502
2523
  }
2503
2524
  render() {
2504
2525
  const { clearable, noResultsMessage, disabled, menuPortalTarget } = this.props;
@@ -2784,7 +2805,7 @@ function Menu({ onChange, onShowCustomPeriod, periodName, timezone }) {
2784
2805
  const [visible, setVisible] = useState(false);
2785
2806
  const [showDatePicker, setShowDatePicker] = useState(false);
2786
2807
  const [showMonthPicker, setShowMonthPicker] = useState(false);
2787
- const [datePickerDate, setDatePickerDate] = useState(Date.now());
2808
+ const [datePickerDate, setDatePickerDate] = useState(() => Date.now());
2788
2809
  function setPeriod(period) {
2789
2810
  onChange(period);
2790
2811
  setVisible(false);
@@ -3210,17 +3231,18 @@ function sortModifications(modifications) {
3210
3231
  //#endregion
3211
3232
  //#region src/components/svg/SvgImage.tsx
3212
3233
  function useGlobalStyleElement() {
3213
- const styleElementRef = useRef(null);
3234
+ const [styleElement] = useState(() => {
3235
+ const element = document.createElement("style");
3236
+ element.appendChild(document.createTextNode(""));
3237
+ return element;
3238
+ });
3214
3239
  useEffect(() => {
3215
- const styleElement = document.createElement("style");
3216
- styleElement.appendChild(document.createTextNode(""));
3217
3240
  if (document && document.head) document.head.appendChild(styleElement);
3218
- styleElementRef.current = styleElement;
3219
3241
  return () => {
3220
- if (document && document.head && styleElement) document.head.removeChild(styleElement);
3242
+ if (document && document.head) document.head.removeChild(styleElement);
3221
3243
  };
3222
- }, []);
3223
- return styleElementRef.current;
3244
+ }, [styleElement]);
3245
+ return styleElement;
3224
3246
  }
3225
3247
  function SvgImage({ imageData, modifications, onConflict }) {
3226
3248
  const svgWrapperRef = useRef(null);
@@ -3309,9 +3331,10 @@ var getClickConfiguration = (onClick) => {
3309
3331
  var Chart = class extends Component {
3310
3332
  constructor(..._args) {
3311
3333
  super(..._args);
3312
- this.state = {};
3334
+ this.state = { titleApplied: false };
3313
3335
  this.chart = null;
3314
3336
  this.ro = null;
3337
+ this.titleTimeoutId = void 0;
3315
3338
  this.handleChart = (chart) => {
3316
3339
  this.chart = chart;
3317
3340
  this.ro = new ResizeObserver(() => {
@@ -3321,8 +3344,16 @@ var Chart = class extends Component {
3321
3344
  };
3322
3345
  }
3323
3346
  componentDidMount() {
3347
+ this.titleTimeoutId = setTimeout(() => this.setState({ titleApplied: true }), 0);
3348
+ }
3349
+ /**
3350
+ * Builds the Highcharts configuration from the props. Everything here is derived, so it is
3351
+ * rebuilt while rendering rather than mirrored into state.
3352
+ */
3353
+ buildOptions() {
3324
3354
  const { type, title, items, tooltipTitle, valueFormatter, onClick } = this.props;
3325
- this.setState({
3355
+ const { titleApplied } = this.state;
3356
+ return {
3326
3357
  ...initialOptions,
3327
3358
  plotOptions: {
3328
3359
  ...initialOptions.plotOptions,
@@ -3339,44 +3370,12 @@ var Chart = class extends Component {
3339
3370
  ...initialOptions.legend,
3340
3371
  enabled: type === "pie"
3341
3372
  },
3342
- yAxis: {
3343
- ...initialOptions.yAxis,
3344
- enabled: type === "column",
3345
- title: { text: title || "" }
3346
- },
3347
- series: [{
3348
- type,
3349
- innerSize: "50%",
3350
- data: items.map(({ label, value }) => [label, value])
3351
- }]
3352
- });
3353
- setTimeout(() => {
3354
- this.setState({ title: {
3355
- ...initialOptions.title,
3356
- text: type === "column" ? "" : title || ""
3357
- } });
3358
- }, 0);
3359
- }
3360
- componentDidUpdate(prevProps) {
3361
- const { type, title, items, tooltipTitle, valueFormatter, onClick } = this.props;
3362
- if (title !== prevProps.title) this.setState({
3363
3373
  title: {
3364
- ...this.state.title,
3365
- text: type === "column" ? "" : title || ""
3366
- },
3367
- yAxis: {
3368
- ...this.state.yAxis,
3369
- title: { text: title || "" }
3370
- }
3371
- });
3372
- if (type !== prevProps.type) this.setState({
3373
- legend: {
3374
- ...this.state.legend,
3375
- enabled: type === "pie"
3374
+ ...initialOptions.title,
3375
+ text: titleApplied && type !== "column" ? title || "" : ""
3376
3376
  },
3377
- title: { text: type === "column" ? "" : title || "" },
3378
3377
  yAxis: {
3379
- ...this.state.yAxis,
3378
+ ...initialOptions.yAxis,
3380
3379
  enabled: type === "column",
3381
3380
  title: { text: type === "column" ? title || "" : "" }
3382
3381
  },
@@ -3385,35 +3384,19 @@ var Chart = class extends Component {
3385
3384
  innerSize: "50%",
3386
3385
  data: items.map(({ label, value }) => [label, value])
3387
3386
  }]
3388
- });
3389
- if (!isEqual(items, prevProps.items)) this.setState({ series: [{
3390
- type,
3391
- innerSize: "50%",
3392
- data: items.map(({ label, value }) => [label, value])
3393
- }] });
3394
- if (tooltipTitle !== prevProps.tooltipTitle || valueFormatter !== prevProps.valueFormatter || onClick !== prevProps.onClick) this.setState({
3395
- tooltip: {
3396
- ...initialOptions.tooltip,
3397
- formatter() {
3398
- const format = valueFormatter || ((value) => value);
3399
- return createTooltip(tooltipTitle || "", this.point.name, format(this.point.y));
3400
- }
3401
- },
3402
- plotOptions: {
3403
- ...initialOptions.plotOptions,
3404
- ...getClickConfiguration(onClick)
3405
- }
3406
- });
3387
+ };
3407
3388
  }
3408
3389
  componentWillUnmount() {
3390
+ clearTimeout(this.titleTimeoutId);
3409
3391
  if (this.ro && this.chart?.renderTo) this.ro.unobserve(this.chart.renderTo);
3410
3392
  this.chart = null;
3411
3393
  this.ro = null;
3412
3394
  }
3413
3395
  render() {
3396
+ const built = this.buildOptions();
3414
3397
  return /* @__PURE__ */ jsx(HighchartsReact, {
3415
3398
  highcharts: Highcharts,
3416
- options: this.props.updateOptions ? this.props.updateOptions(this.state) : this.state,
3399
+ options: this.props.updateOptions ? this.props.updateOptions(built) : built,
3417
3400
  containerProps: { className: this.props.className },
3418
3401
  callback: this.handleChart
3419
3402
  });