@deviceinsight/ng-ui-components 7.22.0 → 7.24.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 +161 -165
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.js +161 -165
  5. package/dist/index.js.map +1 -1
  6. package/dist/style.css +1 -3
  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 +24 -28
package/dist/index.js CHANGED
@@ -56,7 +56,7 @@ var __copyProps = (to, from, except, desc) => {
56
56
  }
57
57
  return to;
58
58
  };
59
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
59
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
60
60
  value: mod,
61
61
  enumerable: true
62
62
  }) : target, mod));
@@ -77,8 +77,10 @@ var setGlobalErrorMessageBoxOptions = (options) => {
77
77
  globalErrorMessageBoxOptions = options;
78
78
  };
79
79
  var storeGroupName = (groupName, toastId) => {
80
- if (groupName) if (groupNamesToToastIds[groupName]) groupNamesToToastIds[groupName] = [...groupNamesToToastIds[groupName], toastId];
81
- else groupNamesToToastIds[groupName] = [toastId];
80
+ if (groupName) {
81
+ if (groupNamesToToastIds[groupName]) groupNamesToToastIds[groupName] = [...groupNamesToToastIds[groupName], toastId];
82
+ else groupNamesToToastIds[groupName] = [toastId];
83
+ }
82
84
  };
83
85
  var messageBoxSuccess = (content, options, groupName) => {
84
86
  const toastId = toast.success(content, {
@@ -254,8 +256,10 @@ function convertToTree({ childNodeKey, idKey, displayNameKey, typeKey, lazyLoada
254
256
  */
255
257
  function patchNode(node, patch) {
256
258
  let patchedChildren;
257
- if (patch.children !== void 0) if (node.children !== void 0) patchedChildren = [...node.children, ...patch.children];
258
- else patchedChildren = [...patch.children];
259
+ if (patch.children !== void 0) {
260
+ if (node.children !== void 0) patchedChildren = [...node.children, ...patch.children];
261
+ else patchedChildren = [...patch.children];
262
+ }
259
263
  return {
260
264
  ...node,
261
265
  ...patch,
@@ -394,9 +398,11 @@ var ValidatedTextInput = class extends React.Component {
394
398
  //#region src/components/colorpicker/ColorTextInput.tsx
395
399
  function ColorTextInput({ value, pattern, onChange, placeholder, style }) {
396
400
  const [text, setText] = useState(value);
397
- useEffect(() => {
401
+ const [lastValue, setLastValue] = useState(value);
402
+ if (value !== lastValue) {
403
+ setLastValue(value);
398
404
  setText(value);
399
- }, [value]);
405
+ }
400
406
  function handleChange(value, valid) {
401
407
  setText(value);
402
408
  if (valid) onChange(value);
@@ -527,9 +533,7 @@ function inputToTzDate(value, pattern, timezone) {
527
533
  var DateInput = forwardRef(({ value, clearable, inline, readOnly, wrapperClassName, onChange, locale, timezone, ...otherProps }, ref) => {
528
534
  const [pattern, setPattern] = useState(dayjs.localeData().longDateFormat("L"));
529
535
  const { t } = useTranslation();
530
- const [valid, setValid] = useState(false);
531
536
  const [popupOpen, setPopupOpen] = useState(false);
532
- const [inputText, setInputText] = useState("");
533
537
  const debouncedSetPopupActive = useMemo(() => debounce(setPopupOpen, 30), []);
534
538
  useEffect(() => {
535
539
  const language = locale ?? i18n.language;
@@ -547,17 +551,22 @@ var DateInput = forwardRef(({ value, clearable, inline, readOnly, wrapperClassNa
547
551
  t,
548
552
  timezone
549
553
  ]);
550
- useEffect(() => {
551
- if (value == null) setInputText("");
552
- else setInputText(formattedDate(value));
553
- }, [formattedDate, value]);
554
- useEffect(() => {
554
+ const [valid, setValid] = useState(() => isInputValid(value, pattern));
555
+ const [inputText, setInputText] = useState(() => value == null ? "" : formattedDate(value));
556
+ const [lastInput, setLastInput] = useState({
557
+ value,
558
+ pattern,
559
+ timezone
560
+ });
561
+ if (!Object.is(value, lastInput.value) || pattern !== lastInput.pattern || timezone !== lastInput.timezone) {
562
+ setLastInput({
563
+ value,
564
+ pattern,
565
+ timezone
566
+ });
567
+ setInputText(value == null ? "" : formattedDate(value));
555
568
  setValid(isInputValid(value, pattern));
556
- }, [pattern, value]);
557
- useEffect(() => {
558
- dayjs.locale(locale ?? i18n.language);
559
- setPattern(dayjs.localeData().longDateFormat("L"));
560
- }, [locale]);
569
+ }
561
570
  const handleInputTextChange = (text) => {
562
571
  setInputText(text);
563
572
  if (text) {
@@ -820,8 +829,9 @@ function RouteLink({ to, confirm, className, title, children, keyboardShortcut,
820
829
  pushRoute();
821
830
  }
822
831
  };
832
+ const href = history.createHref(typeof to === "string" ? { pathname: to } : to);
823
833
  return /* @__PURE__ */ jsx("a", {
824
- href: history.createHref(typeof to === "string" ? { pathname: to } : to),
834
+ href,
825
835
  onClick: handleClickEvent,
826
836
  className: `di route-link ${className || ""}`,
827
837
  title: title ? t(title.id, { defaultValue: title.defaultValue }) : void 0,
@@ -1062,8 +1072,9 @@ var NodeInfo = class extends React.PureComponent {
1062
1072
  }
1063
1073
  render() {
1064
1074
  const { node, node: { name }, leafNode, expanded, isLastChild, onExpand, selectionState, isLoading } = this.props;
1075
+ const selected = selectionState === SelectionState.ALL;
1065
1076
  return /* @__PURE__ */ jsxs("div", {
1066
- className: `node-info ${selectionState === SelectionState.ALL ? "selected" : ""}`,
1077
+ className: `node-info ${selected ? "selected" : ""}`,
1067
1078
  children: [
1068
1079
  isLastChild !== void 0 && /* @__PURE__ */ jsx(Skeleton, { lastChild: isLastChild }),
1069
1080
  /* @__PURE__ */ jsx(NodeImage, {
@@ -1097,7 +1108,6 @@ var Node = class Node extends Component {
1097
1108
  super(..._args);
1098
1109
  this.state = {
1099
1110
  expanded: false,
1100
- selectionState: this.getSelectionState(),
1101
1111
  isLoading: false
1102
1112
  };
1103
1113
  this.toggleExpand = () => {
@@ -1123,28 +1133,23 @@ var Node = class Node extends Component {
1123
1133
  * @param {Props} prevProps
1124
1134
  * @param {State} prevState
1125
1135
  */
1126
- shouldComponentUpdate(prevProps, prevState) {
1127
- const { selectedNodes: prevSelectedNodes, treeSize: prevTreeSize } = prevProps;
1128
- const { expanded: prevExpanded, selectionState: prevSelectionState, isLoading: prevIsLoading } = prevState;
1136
+ shouldComponentUpdate(nextProps, nextState) {
1137
+ const { selectedNodes: nextSelectedNodes, treeSize: nextTreeSize } = nextProps;
1138
+ const { expanded: nextExpanded, isLoading: nextIsLoading } = nextState;
1129
1139
  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() });
1140
+ const { expanded, isLoading } = this.state;
1141
+ const selectionStateChanged = this.getSelectionState(this.props) !== this.getSelectionState(nextProps);
1142
+ if (isLoading !== nextIsLoading) return true;
1143
+ if (treeSize !== nextTreeSize) return true;
1144
+ if (this.isLeaf()) return selectedNodes.includes(node.id) && !nextSelectedNodes.includes(node.id) || !selectedNodes.includes(node.id) && nextSelectedNodes.includes(node.id) || selectionStateChanged;
1145
+ else return selectedNodes.length !== nextSelectedNodes.length || expanded !== nextExpanded || selectionStateChanged;
1141
1146
  }
1142
1147
  isLeaf() {
1143
1148
  const { node } = this.props;
1144
1149
  return node.children === void 0;
1145
1150
  }
1146
- getSelectionState() {
1147
- const { node, selectedNodes } = this.props;
1151
+ getSelectionState(props = this.props) {
1152
+ const { node, selectedNodes } = props;
1148
1153
  if (this.isLeaf()) return selectedNodes.includes(node.id) ? SelectionState.ALL : SelectionState.NONE;
1149
1154
  else {
1150
1155
  const leafIds = getAllLeafIds(node);
@@ -1156,7 +1161,8 @@ var Node = class Node extends Component {
1156
1161
  }
1157
1162
  render() {
1158
1163
  const { node, isLastChild, ...commonNodeProps } = this.props;
1159
- const { expanded, selectionState, isLoading } = this.state;
1164
+ const { expanded, isLoading } = this.state;
1165
+ const selectionState = this.getSelectionState();
1160
1166
  return /* @__PURE__ */ jsxs("div", {
1161
1167
  className: "node",
1162
1168
  children: [/* @__PURE__ */ jsx(NodeInfo, {
@@ -1187,19 +1193,15 @@ var Node = class Node extends Component {
1187
1193
  var TreeView = class extends Component {
1188
1194
  constructor(..._args) {
1189
1195
  super(..._args);
1196
+ this.convert = convertToTree(this.props.dataSetConfig);
1197
+ this.initialTree = this.initTree(this.props.treeData);
1190
1198
  this.state = {
1191
1199
  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 || []
1200
+ tree: this.initialTree,
1201
+ treeSize: getTreeSize(this.initialTree),
1202
+ selectedNodes: this.props.selectedNodes || [],
1203
+ lastSelectedNodes: this.props.selectedNodes || []
1201
1204
  };
1202
- this.convert = convertToTree(this.props.dataSetConfig);
1203
1205
  this.selectNodes = (nodes) => {
1204
1206
  const { onSelect } = this.props;
1205
1207
  const { selectedNodes } = this.state;
@@ -1247,19 +1249,15 @@ var TreeView = class extends Component {
1247
1249
  });
1248
1250
  };
1249
1251
  }
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 });
1252
+ static {
1253
+ this.getDerivedStateFromProps = (props, state) => {
1254
+ const { selectedNodes } = props;
1255
+ if (selectedNodes && selectedNodes.length !== state.lastSelectedNodes.length) return {
1256
+ selectedNodes,
1257
+ lastSelectedNodes: selectedNodes
1258
+ };
1259
+ return null;
1260
+ };
1263
1261
  }
1264
1262
  initTree(treeData) {
1265
1263
  return {
@@ -1336,9 +1334,11 @@ function Pagination({ onChangePage, page, totalPages, onChangeSize, size }) {
1336
1334
  useEffect(() => {
1337
1335
  changePageDebouncedRef.current = debounce(onChangePage, 500);
1338
1336
  }, [onChangePage]);
1339
- useEffect(() => {
1337
+ const [lastPage, setLastPage] = useState(page);
1338
+ if (page !== lastPage) {
1339
+ setLastPage(page);
1340
1340
  setPageRaw(`${page + 1}`);
1341
- }, [page]);
1341
+ }
1342
1342
  function goToFirstPage() {
1343
1343
  onChangePage(0);
1344
1344
  }
@@ -1558,8 +1558,10 @@ var SelectWithSearch = class extends Component {
1558
1558
  value: this.state.inputValue,
1559
1559
  label: this.state.inputValue
1560
1560
  };
1561
- this.setState((prevState) => ({ options: [newItem, ...prevState.options] }));
1562
- this.state.inputValue = null;
1561
+ this.setState((prevState) => ({
1562
+ options: [newItem, ...prevState.options],
1563
+ inputValue: null
1564
+ }));
1563
1565
  onChange(newItem);
1564
1566
  });
1565
1567
  }
@@ -1766,10 +1768,12 @@ var ReactableTableHeader = class extends Component {
1766
1768
  this.getClassName = (columnDef) => {
1767
1769
  const { paginationSettings, tableName } = this.props;
1768
1770
  const className = getClassName(tableName, columnDef.name);
1769
- if (columnDef.sortable) if (columnDef.name === paginationSettings.sort.property) if (paginationSettings.sort.direction === "ASC") return `${className} sortable sortAsc`;
1770
- else return `${className} sortable sortDes`;
1771
- else return `${className} sortable`;
1772
- else return `${className}`;
1771
+ if (columnDef.sortable) {
1772
+ if (columnDef.name === paginationSettings.sort.property) {
1773
+ if (paginationSettings.sort.direction === "ASC") return `${className} sortable sortAsc`;
1774
+ else return `${className} sortable sortDes`;
1775
+ } else return `${className} sortable`;
1776
+ } else return `${className}`;
1773
1777
  };
1774
1778
  this.printLabel = (label) => {
1775
1779
  if (isTranslationDescriptor(label)) return /* @__PURE__ */ jsx(Trans, {
@@ -2057,17 +2061,19 @@ var ReactableWithClientSidePagination = class extends Component {
2057
2061
  };
2058
2062
  this.handleSelectChange = (selected, item) => {
2059
2063
  const { onSelectedItemsChange, selectedItems = [], uniqueItemKey } = this.props;
2060
- if (onSelectedItemsChange) if (selected) onSelectedItemsChange(selectedItems.concat(uniqueItemKey(item)));
2061
- else onSelectedItemsChange(selectedItems.filter((key) => key !== uniqueItemKey(item)));
2062
- else console.warn("ReactableWithClientSidePagination: onSelectedItemsChange property is missing");
2064
+ if (onSelectedItemsChange) {
2065
+ if (selected) onSelectedItemsChange(selectedItems.concat(uniqueItemKey(item)));
2066
+ else onSelectedItemsChange(selectedItems.filter((key) => key !== uniqueItemKey(item)));
2067
+ } else console.warn("ReactableWithClientSidePagination: onSelectedItemsChange property is missing");
2063
2068
  };
2064
2069
  this.handleSelectAllChange = (selectedAll) => {
2065
2070
  const { onSelectedItemsChange, items, selectedItems = [], uniqueItemKey } = this.props;
2066
2071
  const { filteredItems } = this.state;
2067
2072
  const visibleItems = (filteredItems || items || []).map(uniqueItemKey);
2068
- if (onSelectedItemsChange) if (selectedAll) onSelectedItemsChange(uniqWith([...selectedItems, ...visibleItems], isEqual).sort());
2069
- else onSelectedItemsChange(difference(selectedItems, visibleItems));
2070
- else console.warn("ReactableWithClientSidePagination: onSelectedItemsChange property is missing");
2073
+ if (onSelectedItemsChange) {
2074
+ if (selectedAll) onSelectedItemsChange(uniqWith([...selectedItems, ...visibleItems], isEqual).sort());
2075
+ else onSelectedItemsChange(difference(selectedItems, visibleItems));
2076
+ } else console.warn("ReactableWithClientSidePagination: onSelectedItemsChange property is missing");
2071
2077
  };
2072
2078
  this.areSelectedAll = () => {
2073
2079
  const { items, selectedItems, uniqueItemKey } = this.props;
@@ -2083,21 +2089,33 @@ var ReactableWithClientSidePagination = class extends Component {
2083
2089
  this.state = {
2084
2090
  paginationSettings: paginationSettings || DEFAULT_PAGINATION_SETTINGS,
2085
2091
  filterSettings: {},
2086
- filteredItems: null
2092
+ filteredItems: null,
2093
+ lastSettings: paginationSettings
2087
2094
  };
2088
2095
  }
2089
2096
  componentDidUpdate(prevProps) {
2090
2097
  const { items } = this.props;
2091
2098
  const { items: prevItems } = prevProps;
2092
- const settings = this.props.paginationSettings || this.props.initialPaginationSettings;
2093
- const prevSettings = prevProps.paginationSettings || prevProps.initialPaginationSettings;
2094
2099
  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));
2100
+ }
2101
+ static {
2102
+ this.getDerivedStateFromProps = (props, state) => {
2103
+ const settings = props.paginationSettings || props.initialPaginationSettings;
2104
+ if (settings && !isEqual(settings, state.lastSettings)) return {
2105
+ lastSettings: settings,
2106
+ paginationSettings: {
2107
+ ...settings,
2108
+ page: 0
2109
+ }
2110
+ };
2111
+ return null;
2112
+ };
2096
2113
  }
2097
2114
  render() {
2098
2115
  const { uniqueItemKey, isLoading, columnDefs, rowDef, tableName, clickable, selectable, selectedItems, onChangeSize } = this.props;
2116
+ const finalColumnDefs = selectable ? extendColumnDefsWithCheckboxes(columnDefs, this.handleSelectChange, this.handleSelectAllChange, this.areSelectedAll(), selectedItems || [], uniqueItemKey) : columnDefs;
2099
2117
  return /* @__PURE__ */ jsx(Reactable, {
2100
- columnDefs: selectable ? extendColumnDefsWithCheckboxes(columnDefs, this.handleSelectChange, this.handleSelectAllChange, this.areSelectedAll(), selectedItems || [], uniqueItemKey) : columnDefs,
2118
+ columnDefs: finalColumnDefs,
2101
2119
  rowDef,
2102
2120
  uniqueItemKey,
2103
2121
  paginationSettings: this.state.paginationSettings,
@@ -2275,20 +2293,17 @@ var ImageUpload = class extends Component {
2275
2293
  constructor(..._args) {
2276
2294
  super(..._args);
2277
2295
  this.state = {
2278
- dragOverPreview: false,
2296
+ dragOverUrl: void 0,
2279
2297
  file: null
2280
2298
  };
2281
2299
  this.handleDragOver = () => {
2282
- this.setState({ dragOverPreview: true });
2300
+ this.setState({ dragOverUrl: this.props.imageUrl });
2283
2301
  };
2284
2302
  }
2285
- componentDidUpdate(prevProps) {
2286
- if (prevProps.imageUrl !== this.props.imageUrl) this.setState({ dragOverPreview: false });
2287
- }
2288
2303
  render() {
2289
2304
  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, {
2305
+ const { dragOverUrl, file } = this.state;
2306
+ if (imageUrl && !(dragOverUrl !== void 0 && dragOverUrl === imageUrl) && file) return /* @__PURE__ */ jsx(PreviewImage, {
2292
2307
  url: imageUrl,
2293
2308
  imageSize,
2294
2309
  onRemoveFile: () => onRemoveFile?.(file),
@@ -2298,7 +2313,10 @@ var ImageUpload = class extends Component {
2298
2313
  else return /* @__PURE__ */ jsx(FileUpload, {
2299
2314
  ...otherProps,
2300
2315
  onRemoveFile: (file) => {
2301
- this.setState({ file: null });
2316
+ this.setState({
2317
+ file: null,
2318
+ dragOverUrl: void 0
2319
+ });
2302
2320
  onRemoveFile?.(file);
2303
2321
  },
2304
2322
  onSelectFile: (file) => {
@@ -2377,9 +2395,17 @@ var formatTime = (timezone, date) => {
2377
2395
  var DateTimeInput = forwardRef(({ timestamp, timezone, warning, readOnly = false, onChange, ...otherProps }, ref) => {
2378
2396
  const [time, setTime] = useState(formatTime(timezone, timestamp));
2379
2397
  const timeValue = time == null ? formatTime(timezone, timestamp) : time;
2380
- useEffect(() => {
2398
+ const [lastInput, setLastInput] = useState({
2399
+ timestamp,
2400
+ timezone
2401
+ });
2402
+ if (timestamp !== lastInput.timestamp || timezone !== lastInput.timezone) {
2403
+ setLastInput({
2404
+ timestamp,
2405
+ timezone
2406
+ });
2381
2407
  setTime(formatTime(timezone, timestamp));
2382
- }, [timezone, timestamp]);
2408
+ }
2383
2409
  function handleChangeDate(date, fromTextField) {
2384
2410
  const currentDate = dayjs.tz(timestamp, timezone);
2385
2411
  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 +2524,13 @@ var SelectWithSearchAsync = class extends Component {
2498
2524
  const { currentItem } = this.state;
2499
2525
  if (value && (!currentItem || currentItem.value !== value)) {
2500
2526
  if (!this.reloadItemFromCache()) searchById(value).then(this.addBackendItemToCache);
2501
- } else if (!value && currentItem) this.setState({ currentItem: null });
2527
+ }
2528
+ }
2529
+ static {
2530
+ this.getDerivedStateFromProps = (props, state) => {
2531
+ if (!props.value && state.currentItem) return { currentItem: null };
2532
+ return null;
2533
+ };
2502
2534
  }
2503
2535
  render() {
2504
2536
  const { clearable, noResultsMessage, disabled, menuPortalTarget } = this.props;
@@ -2565,7 +2597,7 @@ var MultiMenuItem = class extends React.PureComponent {
2565
2597
  };
2566
2598
  //#endregion
2567
2599
  //#region src/components/periodpicker/components/Inputs.tsx
2568
- var ONE_HOUR = 3600 * 1e3;
2600
+ var ONE_HOUR = 36e5;
2569
2601
  function Inputs({ period, onChange, readOnly, locale, timezone }) {
2570
2602
  const [showWarningTarget, setShowWarningTarget] = useState("");
2571
2603
  const warningTimeoutRef = useRef(void 0);
@@ -2774,7 +2806,7 @@ function createLastXDays(days, timezone) {
2774
2806
  tsEnd: dayjs().endOf("day").valueOf()
2775
2807
  };
2776
2808
  }
2777
- var DAY_TO_MILLIS = 1e3 * 60 * 60 * 24;
2809
+ var DAY_TO_MILLIS = 864e5;
2778
2810
  function periodToDays({ tsStart, tsEnd }) {
2779
2811
  return Math.round((tsEnd - tsStart + 1) / DAY_TO_MILLIS);
2780
2812
  }
@@ -2784,7 +2816,7 @@ function Menu({ onChange, onShowCustomPeriod, periodName, timezone }) {
2784
2816
  const [visible, setVisible] = useState(false);
2785
2817
  const [showDatePicker, setShowDatePicker] = useState(false);
2786
2818
  const [showMonthPicker, setShowMonthPicker] = useState(false);
2787
- const [datePickerDate, setDatePickerDate] = useState(Date.now());
2819
+ const [datePickerDate, setDatePickerDate] = useState(() => Date.now());
2788
2820
  function setPeriod(period) {
2789
2821
  onChange(period);
2790
2822
  setVisible(false);
@@ -3210,17 +3242,18 @@ function sortModifications(modifications) {
3210
3242
  //#endregion
3211
3243
  //#region src/components/svg/SvgImage.tsx
3212
3244
  function useGlobalStyleElement() {
3213
- const styleElementRef = useRef(null);
3245
+ const [styleElement] = useState(() => {
3246
+ const element = document.createElement("style");
3247
+ element.appendChild(document.createTextNode(""));
3248
+ return element;
3249
+ });
3214
3250
  useEffect(() => {
3215
- const styleElement = document.createElement("style");
3216
- styleElement.appendChild(document.createTextNode(""));
3217
3251
  if (document && document.head) document.head.appendChild(styleElement);
3218
- styleElementRef.current = styleElement;
3219
3252
  return () => {
3220
- if (document && document.head && styleElement) document.head.removeChild(styleElement);
3253
+ if (document && document.head) document.head.removeChild(styleElement);
3221
3254
  };
3222
- }, []);
3223
- return styleElementRef.current;
3255
+ }, [styleElement]);
3256
+ return styleElement;
3224
3257
  }
3225
3258
  function SvgImage({ imageData, modifications, onConflict }) {
3226
3259
  const svgWrapperRef = useRef(null);
@@ -3309,9 +3342,10 @@ var getClickConfiguration = (onClick) => {
3309
3342
  var Chart = class extends Component {
3310
3343
  constructor(..._args) {
3311
3344
  super(..._args);
3312
- this.state = {};
3345
+ this.state = { titleApplied: false };
3313
3346
  this.chart = null;
3314
3347
  this.ro = null;
3348
+ this.titleTimeoutId = void 0;
3315
3349
  this.handleChart = (chart) => {
3316
3350
  this.chart = chart;
3317
3351
  this.ro = new ResizeObserver(() => {
@@ -3321,8 +3355,16 @@ var Chart = class extends Component {
3321
3355
  };
3322
3356
  }
3323
3357
  componentDidMount() {
3358
+ this.titleTimeoutId = setTimeout(() => this.setState({ titleApplied: true }), 0);
3359
+ }
3360
+ /**
3361
+ * Builds the Highcharts configuration from the props. Everything here is derived, so it is
3362
+ * rebuilt while rendering rather than mirrored into state.
3363
+ */
3364
+ buildOptions() {
3324
3365
  const { type, title, items, tooltipTitle, valueFormatter, onClick } = this.props;
3325
- this.setState({
3366
+ const { titleApplied } = this.state;
3367
+ return {
3326
3368
  ...initialOptions,
3327
3369
  plotOptions: {
3328
3370
  ...initialOptions.plotOptions,
@@ -3339,44 +3381,12 @@ var Chart = class extends Component {
3339
3381
  ...initialOptions.legend,
3340
3382
  enabled: type === "pie"
3341
3383
  },
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
3384
  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"
3385
+ ...initialOptions.title,
3386
+ text: titleApplied && type !== "column" ? title || "" : ""
3376
3387
  },
3377
- title: { text: type === "column" ? "" : title || "" },
3378
3388
  yAxis: {
3379
- ...this.state.yAxis,
3389
+ ...initialOptions.yAxis,
3380
3390
  enabled: type === "column",
3381
3391
  title: { text: type === "column" ? title || "" : "" }
3382
3392
  },
@@ -3385,35 +3395,20 @@ var Chart = class extends Component {
3385
3395
  innerSize: "50%",
3386
3396
  data: items.map(({ label, value }) => [label, value])
3387
3397
  }]
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
- });
3398
+ };
3407
3399
  }
3408
3400
  componentWillUnmount() {
3401
+ clearTimeout(this.titleTimeoutId);
3409
3402
  if (this.ro && this.chart?.renderTo) this.ro.unobserve(this.chart.renderTo);
3410
3403
  this.chart = null;
3411
3404
  this.ro = null;
3412
3405
  }
3413
3406
  render() {
3407
+ const built = this.buildOptions();
3408
+ const options = this.props.updateOptions ? this.props.updateOptions(built) : built;
3414
3409
  return /* @__PURE__ */ jsx(HighchartsReact, {
3415
3410
  highcharts: Highcharts,
3416
- options: this.props.updateOptions ? this.props.updateOptions(this.state) : this.state,
3411
+ options,
3417
3412
  containerProps: { className: this.props.className },
3418
3413
  callback: this.handleChart
3419
3414
  });
@@ -3510,12 +3505,13 @@ function useLimitStyling(limit, min, max) {
3510
3505
  if (!containerEl) throw new Error(".rc-slider-rail element missing");
3511
3506
  const disabledAreaEl = containerEl?.querySelector(`.disabled-area-element`);
3512
3507
  const sliderWidth = containerEl.getBoundingClientRect().width;
3513
- if (disabledAreaEl) if (limit == null) disabledAreaEl.remove();
3514
- else {
3515
- const width = Math.round((max - limit) / (max - min) * sliderWidth);
3516
- disabledAreaEl.style.width = `${width}px`;
3517
- }
3518
- else if (limit != null) {
3508
+ if (disabledAreaEl) {
3509
+ if (limit == null) disabledAreaEl.remove();
3510
+ else {
3511
+ const width = Math.round((max - limit) / (max - min) * sliderWidth);
3512
+ disabledAreaEl.style.width = `${width}px`;
3513
+ }
3514
+ } else if (limit != null) {
3519
3515
  const width = Math.round((max - limit) / (max - min) * sliderWidth);
3520
3516
  const disabledAreaEl = document.createElement("div");
3521
3517
  disabledAreaEl.classList.add("disabled-area-element");