xmlui 0.9.13 → 0.9.15

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 (35) hide show
  1. package/dist/{apiInterceptorWorker-BUaYCWe6.mjs → apiInterceptorWorker-DHw39GG3.mjs} +1 -1
  2. package/dist/{index-DiCe0Ajo.mjs → index-DFC3vDn-.mjs} +487 -232
  3. package/dist/index.css +331 -306
  4. package/dist/scripts/bin/build-lib.js +1 -1
  5. package/dist/scripts/src/components/Card/Card.js +17 -1
  6. package/dist/scripts/src/components/Card/CardNative.js +2 -3
  7. package/dist/scripts/src/components/DatePicker/DatePickerNative.js +2 -2
  8. package/dist/scripts/src/components/List/List.js +10 -3
  9. package/dist/scripts/src/components/List/ListNative.js +8 -5
  10. package/dist/scripts/src/components/Markdown/Markdown.js +10 -9
  11. package/dist/scripts/src/components/Option/Option.js +0 -1
  12. package/dist/scripts/src/components/Select/Select.js +3 -2
  13. package/dist/scripts/src/components/Select/SelectNative.js +1 -1
  14. package/dist/scripts/src/components/Table/Table.js +7 -1
  15. package/dist/scripts/src/components/Table/TableNative.js +2 -1
  16. package/dist/scripts/src/components/Tabs/Tabs.js +6 -5
  17. package/dist/scripts/src/components/Tabs/TabsNative.js +6 -3
  18. package/dist/scripts/src/components-core/LoaderComponent.js +14 -0
  19. package/dist/scripts/src/components-core/abstractions/containers.js +1 -0
  20. package/dist/scripts/src/components-core/loader/ApiLoader.js +4 -5
  21. package/dist/scripts/src/components-core/loader/DataLoader.js +4 -4
  22. package/dist/scripts/src/components-core/loader/ExternalDataLoader.js +4 -7
  23. package/dist/scripts/src/components-core/loader/Loader.js +23 -11
  24. package/dist/scripts/src/components-core/loader/MockLoaderRenderer.js +3 -3
  25. package/dist/scripts/src/components-core/loader/PageableLoader.js +14 -4
  26. package/dist/scripts/src/components-core/rendering/reducer.js +9 -3
  27. package/dist/scripts/src/components-core/theming/themes/root.js +4 -1
  28. package/dist/scripts/src/components-core/theming/transformThemeVars.js +8 -0
  29. package/dist/style.css +331 -298
  30. package/dist/xmlui-metadata.mjs +214 -164
  31. package/dist/xmlui-metadata.umd.js +214 -164
  32. package/dist/xmlui-standalone.umd.js +5006 -2914
  33. package/dist/xmlui.d.ts +57 -1
  34. package/dist/xmlui.mjs +6 -4
  35. package/package.json +2 -2
@@ -99,7 +99,7 @@ const buildLib = (_a) => __awaiter(void 0, [_a], void 0, function* ({ watchMode,
99
99
  output: {
100
100
  footer: (chunk) => {
101
101
  if (chunk.name === "index" && chunk.fileName === umdFileName) {
102
- return `if(typeof window.xmlui !== "undefined"){window.xmlui.standalone.registerExtension(window['${env.npm_package_name}']);}`;
102
+ return `if(typeof window.xmlui !== "undefined"){window.xmlui.standalone.registerExtension(window['${env.npm_package_name}'].default || window['${env.npm_package_name}']);}`;
103
103
  }
104
104
  return "";
105
105
  },
@@ -26,6 +26,11 @@ exports.CardMd = (0, ComponentDefs_1.createMetadata)({
26
26
  valueType: "boolean",
27
27
  defaultValue: CardNative_1.defaultProps.showAvatar,
28
28
  },
29
+ avatarSize: {
30
+ description: `This prop sets the size of the avatar. The default value is \`sm\`.`,
31
+ availableValues: ["xs", "sm", "md", "lg"],
32
+ valueType: "string",
33
+ },
29
34
  title: {
30
35
  description: `This prop sets the prestyled title.`,
31
36
  valueType: "string",
@@ -58,10 +63,21 @@ exports.CardMd = (0, ComponentDefs_1.createMetadata)({
58
63
  [`borderRadius-${COMP}`]: "$borderRadius",
59
64
  [`boxShadow-${COMP}`]: "none",
60
65
  [`backgroundColor-${COMP}`]: "$color-surface-raised",
66
+ [`gap-${COMP}`]: "var(--stack-gap-default)",
67
+ [`gap-title-${COMP}`]: "$gap-normal",
68
+ [`gap-avatar-${COMP}`]: "$gap-normal",
69
+ [`verticalAlignment-title-${COMP}`]: "center",
61
70
  },
71
+ themeVarDescriptions: {
72
+ [`gap-${COMP}`]: "The gap between the component's children.",
73
+ [`gap-title-${COMP}`]: "The gap between the title and the subtitle",
74
+ [`gap-avatar-${COMP}`]: "The gap between the avatar and the title panel",
75
+ [`horizontalAlignment-title-${COMP}`]: "The horizontal alignment of panel with the title and subtitle",
76
+ [`verticalAlignment-title-${COMP}`]: "The vertical alignment of the title and subtitle to the avatar",
77
+ }
62
78
  });
63
79
  exports.cardComponentRenderer = (0, renderers_1.createComponentRenderer)("Card", exports.CardMd, ({ node, extractValue, renderChild, layoutCss }) => {
64
- return ((0, jsx_runtime_1.jsx)(CardNative_1.Card, { style: layoutCss, title: extractValue.asOptionalString(node.props.title), linkTo: extractValue.asOptionalString(node.props.linkTo), subtitle: extractValue.asOptionalString(node.props.subtitle), avatarUrl: extractValue.asOptionalString(node.props.avatarUrl), showAvatar: extractValue.asOptionalBoolean(node.props.showAvatar), orientation: extractValue.asOptionalString(node.props.orientation), children: renderChild(node.children, {
80
+ return ((0, jsx_runtime_1.jsx)(CardNative_1.Card, { style: layoutCss, title: extractValue.asOptionalString(node.props.title), linkTo: extractValue.asOptionalString(node.props.linkTo), subtitle: extractValue.asOptionalString(node.props.subtitle), avatarUrl: extractValue.asOptionalString(node.props.avatarUrl), showAvatar: extractValue.asOptionalBoolean(node.props.showAvatar), avatarSize: extractValue.asOptionalString(node.props.avatarSize), orientation: extractValue.asOptionalString(node.props.orientation), children: renderChild(node.children, {
65
81
  type: "Stack",
66
82
  orientation: "vertical",
67
83
  }) }));
@@ -11,13 +11,12 @@ const Card_module_scss_1 = __importDefault(require("./Card.module.scss"));
11
11
  const AvatarNative_1 = require("../Avatar/AvatarNative");
12
12
  const LinkNative_1 = require("../Link/LinkNative");
13
13
  const HeadingNative_1 = require("../Heading/HeadingNative");
14
- const StackNative_1 = require("../Stack/StackNative");
15
14
  const TextNative_1 = require("../Text/TextNative");
16
15
  exports.defaultProps = {
17
16
  orientation: "vertical",
18
17
  showAvatar: false,
19
18
  };
20
- exports.Card = (0, react_1.forwardRef)(function Card({ children, orientation = exports.defaultProps.orientation, style, title, subtitle, linkTo, avatarUrl, showAvatar = !!avatarUrl || exports.defaultProps.showAvatar, onClick, }, forwardedRef) {
19
+ exports.Card = (0, react_1.forwardRef)(function Card({ children, orientation = exports.defaultProps.orientation, style, title, subtitle, linkTo, avatarUrl, showAvatar = !!avatarUrl || exports.defaultProps.showAvatar, avatarSize, onClick, }, forwardedRef) {
21
20
  const titleProps = {
22
21
  level: "h2",
23
22
  };
@@ -25,5 +24,5 @@ exports.Card = (0, react_1.forwardRef)(function Card({ children, orientation = e
25
24
  [Card_module_scss_1.default.isClickable]: !!onClick,
26
25
  [Card_module_scss_1.default.vertical]: orientation === "vertical",
27
26
  [Card_module_scss_1.default.horizontal]: orientation === "horizontal",
28
- }), style: style, onClick: onClick, children: [[title, subtitle, avatarUrl, showAvatar].some(Boolean) && ((0, jsx_runtime_1.jsxs)(StackNative_1.Stack, { orientation: "horizontal", verticalAlignment: "center", style: { gap: "1rem" }, children: [showAvatar && (0, jsx_runtime_1.jsx)(AvatarNative_1.Avatar, { url: avatarUrl, name: title }), (0, jsx_runtime_1.jsxs)(StackNative_1.Stack, { orientation: "vertical", children: [linkTo ? (title ? ((0, jsx_runtime_1.jsx)(LinkNative_1.LocalLink, { to: linkTo + "", children: (0, jsx_runtime_1.jsx)(HeadingNative_1.Heading, Object.assign({}, titleProps, { children: title })) })) : null) : title ? ((0, jsx_runtime_1.jsx)(HeadingNative_1.Heading, Object.assign({}, titleProps, { children: title }))) : null, subtitle !== undefined && (0, jsx_runtime_1.jsx)(TextNative_1.Text, { variant: "small", children: subtitle })] })] })), children] }));
27
+ }), style: style, onClick: onClick, children: [[title, subtitle, avatarUrl, showAvatar].some(Boolean) && ((0, jsx_runtime_1.jsxs)("div", { className: Card_module_scss_1.default.avatarWrapper, children: [showAvatar && (0, jsx_runtime_1.jsx)(AvatarNative_1.Avatar, { url: avatarUrl, name: title, size: avatarSize }), (0, jsx_runtime_1.jsxs)("div", { className: Card_module_scss_1.default.titleWrapper, children: [linkTo ? (title ? ((0, jsx_runtime_1.jsx)(LinkNative_1.LocalLink, { to: linkTo + "", children: (0, jsx_runtime_1.jsx)(HeadingNative_1.Heading, Object.assign({}, titleProps, { children: title })) })) : null) : title ? ((0, jsx_runtime_1.jsx)(HeadingNative_1.Heading, Object.assign({}, titleProps, { children: title }))) : null, subtitle !== undefined && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(TextNative_1.Text, { variant: "small", children: subtitle }) }))] })] })), children] }));
29
28
  });
@@ -176,12 +176,12 @@ exports.DatePicker = (0, react_1.forwardRef)(function DatePicker({ id, initialVa
176
176
  setOpen(false);
177
177
  }
178
178
  }, [onDidChange, updateState, mode, dateFormat]);
179
- return inline ? ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { className: DatePicker_module_scss_1.default.inlinePickerMenu, children: (0, jsx_runtime_1.jsx)(react_day_picker_1.DayPicker, { fixedWeeks: true, fromDate: startDate, toDate: endDate, disabled: disabled, weekStartsOn: _weekStartsOn, showWeekNumber: showWeekNumber, showOutsideDays: true, classNames: DatePicker_module_scss_1.default, mode: mode === "single" ? "single" : "range", selected: selected, onSelect: handleSelect, initialFocus: !inline, numberOfMonths: mode === "range" ? 2 : 1 }) }) })) : ((0, jsx_runtime_1.jsxs)(ReactDropdownMenu.Root, { open: open, onOpenChange: setOpen, modal: false, children: [(0, jsx_runtime_1.jsx)(ReactDropdownMenu.Trigger, { asChild: true, children: (0, jsx_runtime_1.jsxs)("button", { disabled: !enabled, id: id, ref: ref, style: style, className: (0, classnames_1.default)(DatePicker_module_scss_1.default.datePicker, {
179
+ return inline ? ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { className: DatePicker_module_scss_1.default.inlinePickerMenu, children: (0, jsx_runtime_1.jsx)(react_day_picker_1.DayPicker, { required: undefined, captionLayout: "dropdown", fixedWeeks: true, startMonth: startDate, endMonth: endDate, disabled: disabled, weekStartsOn: _weekStartsOn, showWeekNumber: showWeekNumber, showOutsideDays: true, classNames: DatePicker_module_scss_1.default, mode: mode === "single" ? "single" : "range", selected: selected, onSelect: handleSelect, autoFocus: !inline, numberOfMonths: mode === "range" ? 2 : 1 }) }) })) : ((0, jsx_runtime_1.jsxs)(ReactDropdownMenu.Root, { open: open, onOpenChange: setOpen, modal: false, children: [(0, jsx_runtime_1.jsx)(ReactDropdownMenu.Trigger, { asChild: true, children: (0, jsx_runtime_1.jsxs)("button", { disabled: !enabled, id: id, ref: ref, style: style, className: (0, classnames_1.default)(DatePicker_module_scss_1.default.datePicker, {
180
180
  [DatePicker_module_scss_1.default.disabled]: !enabled,
181
181
  [DatePicker_module_scss_1.default.error]: validationStatus === "error",
182
182
  [DatePicker_module_scss_1.default.warning]: validationStatus === "warning",
183
183
  [DatePicker_module_scss_1.default.valid]: validationStatus === "valid",
184
- }), onFocus: handleOnButtonFocus, onBlur: handleOnButtonBlur, children: [(0, jsx_runtime_1.jsx)(InputAdornment_1.Adornment, { text: startText, iconName: startIcon, className: DatePicker_module_scss_1.default.adornment }), (0, jsx_runtime_1.jsx)("div", { className: DatePicker_module_scss_1.default.datePickerValue, children: mode === "single" && selected ? ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, date_fns_1.format)(selected, dateFormat) })) : mode === "range" && typeof selected === "object" && selected.from ? (selected.to ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, date_fns_1.format)(selected.from, dateFormat), " - ", (0, date_fns_1.format)(selected.to, dateFormat)] })) : ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, date_fns_1.format)(selected.from, dateFormat) }))) : placeholder ? ((0, jsx_runtime_1.jsx)("span", { className: DatePicker_module_scss_1.default.placeholder, children: placeholder })) : ((0, jsx_runtime_1.jsx)("span", { children: "\u00A0" })) }), (0, jsx_runtime_1.jsx)(InputAdornment_1.Adornment, { text: endText, iconName: endIcon, className: DatePicker_module_scss_1.default.adornment })] }) }), (0, jsx_runtime_1.jsx)(ReactDropdownMenu.Portal, { container: root, children: (0, jsx_runtime_1.jsx)(ReactDropdownMenu.Content, { align: "start", className: DatePicker_module_scss_1.default.datePickerMenu, onFocus: handleOnMenuFocus, onBlur: handleOnMenuBlur, onInteractOutside: handleOnMenuBlur, children: (0, jsx_runtime_1.jsx)(react_day_picker_1.DayPicker, { fixedWeeks: true, fromDate: startDate, toDate: endDate, disabled: disabled, weekStartsOn: _weekStartsOn, showWeekNumber: showWeekNumber, showOutsideDays: true, classNames: DatePicker_module_scss_1.default, mode: mode === "single" ? "single" : "range", selected: selected, onSelect: handleSelect, initialFocus: true, numberOfMonths: mode === "range" ? 2 : 1 }) }) })] }));
184
+ }), onFocus: handleOnButtonFocus, onBlur: handleOnButtonBlur, children: [(0, jsx_runtime_1.jsx)(InputAdornment_1.Adornment, { text: startText, iconName: startIcon, className: DatePicker_module_scss_1.default.adornment }), (0, jsx_runtime_1.jsx)("div", { className: DatePicker_module_scss_1.default.datePickerValue, children: mode === "single" && selected ? ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, date_fns_1.format)(selected, dateFormat) })) : mode === "range" && typeof selected === "object" && selected.from ? (selected.to ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, date_fns_1.format)(selected.from, dateFormat), " - ", (0, date_fns_1.format)(selected.to, dateFormat)] })) : ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, date_fns_1.format)(selected.from, dateFormat) }))) : placeholder ? ((0, jsx_runtime_1.jsx)("span", { className: DatePicker_module_scss_1.default.placeholder, children: placeholder })) : ((0, jsx_runtime_1.jsx)("span", { children: "\u00A0" })) }), (0, jsx_runtime_1.jsx)(InputAdornment_1.Adornment, { text: endText, iconName: endIcon, className: DatePicker_module_scss_1.default.adornment })] }) }), (0, jsx_runtime_1.jsx)(ReactDropdownMenu.Portal, { container: root, children: (0, jsx_runtime_1.jsx)(ReactDropdownMenu.Content, { align: "start", sideOffset: 5, className: DatePicker_module_scss_1.default.datePickerMenu, onFocus: handleOnMenuFocus, onBlur: handleOnMenuBlur, onInteractOutside: handleOnMenuBlur, children: (0, jsx_runtime_1.jsx)(react_day_picker_1.DayPicker, { required: undefined, fixedWeeks: true, classNames: DatePicker_module_scss_1.default, captionLayout: "dropdown", startMonth: startDate, endMonth: endDate, disabled: disabled, weekStartsOn: _weekStartsOn, showWeekNumber: showWeekNumber, showOutsideDays: true, mode: mode === "single" ? "single" : "range", selected: selected, onSelect: handleSelect, autoFocus: !inline, numberOfMonths: mode === "range" ? 2 : 1 }) }) })] }));
185
185
  });
186
186
  const isoRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/;
187
187
  const parseISODate = (dateString) => {
@@ -71,7 +71,7 @@ exports.ListMd = (0, ComponentDefs_1.createMetadata)({
71
71
  defaultValue: true,
72
72
  },
73
73
  },
74
- childrenAsTemplate: 'itemTemplate',
74
+ childrenAsTemplate: "itemTemplate",
75
75
  apis: {
76
76
  scrollToTop: (0, ComponentDefs_1.d)("This method scrolls the list to the top."),
77
77
  scrollToBottom: (0, ComponentDefs_1.d)("This method scrolls the list to the bottom."),
@@ -80,6 +80,9 @@ exports.ListMd = (0, ComponentDefs_1.createMetadata)({
80
80
  },
81
81
  contextVars: {
82
82
  $item: (0, ComponentDefs_1.d)(`This property represents the value of an item in the data list.`),
83
+ $itemIndex: (0, metadata_helpers_1.dComponent)("This integer value represents the current row index (zero-based) while rendering children."),
84
+ $isFirst: (0, metadata_helpers_1.dComponent)("This boolean value indicates if the component renders its first item."),
85
+ $isLast: (0, metadata_helpers_1.dComponent)("This boolean value indicates if the component renders its last item."),
83
86
  },
84
87
  themeVars: (0, themeVars_1.parseScssVar)(List_module_scss_1.default.themeVars),
85
88
  });
@@ -87,8 +90,12 @@ exports.dynamicHeightListComponentRenderer = (0, renderers_1.createComponentRend
87
90
  const itemTemplate = node.props.itemTemplate;
88
91
  const hideEmptyGroups = extractValue.asOptionalBoolean(node.props.hideEmptyGroups, true);
89
92
  return ((0, jsx_runtime_1.jsx)(ListNative_1.ListNative, { registerComponentApi: registerComponentApi, style: layoutCss, loading: extractValue.asOptionalBoolean(node.props.loading), items: extractValue(node.props.items) || extractValue(node.props.data), limit: extractValue(node.props.limit), groupBy: extractValue(node.props.groupBy), orderBy: extractValue(node.props.orderBy), availableGroups: extractValue(node.props.availableGroups), scrollAnchor: node.props.scrollAnchor, pageInfo: extractValue(node.props.pageInfo), idKey: extractValue(node.props.idKey), requestFetchPrevPage: lookupEventHandler("requestFetchPrevPage"), requestFetchNextPage: lookupEventHandler("requestFetchNextPage"), emptyListPlaceholder: renderChild(node.props.emptyListTemplate), groupsInitiallyExpanded: extractValue.asOptionalBoolean(node.props.groupsInitiallyExpanded), defaultGroups: extractValue(node.props.defaultGroups), borderCollapse: extractValue.asOptionalBoolean(node.props.borderCollapse, true), itemRenderer: itemTemplate &&
90
- ((item, key) => {
91
- return ((0, jsx_runtime_1.jsx)(container_helpers_1.MemoizedItem, { node: itemTemplate, item: item, renderChild: renderChild, layoutContext: layoutContext }, key));
93
+ ((item, key, rowIndex, count) => {
94
+ return ((0, jsx_runtime_1.jsx)(container_helpers_1.MemoizedItem, { node: itemTemplate, item: item, renderChild: renderChild, layoutContext: layoutContext, contextVars: {
95
+ $itemIndex: rowIndex,
96
+ $isFirst: rowIndex === 0,
97
+ $isLast: rowIndex === count - 1,
98
+ } }, key));
92
99
  }), sectionRenderer: node.props.groupBy
93
100
  ? (item, key) => {
94
101
  var _a, _b, _c;
@@ -334,7 +334,7 @@ exports.ListNative = (0, react_1.forwardRef)(function DynamicHeightList({ items
334
334
  if (rows.length) {
335
335
  (_a = virtualizerRef.current) === null || _a === void 0 ? void 0 : _a.scrollToIndex(rows.length + 1, {
336
336
  align: "end",
337
- offset: scrollPaddingTop
337
+ offset: scrollPaddingTop,
338
338
  });
339
339
  }
340
340
  });
@@ -367,6 +367,7 @@ exports.ListNative = (0, react_1.forwardRef)(function DynamicHeightList({ items
367
367
  });
368
368
  }, [registerComponentApi, scrollToBottom, scrollToId, scrollToIndex, scrollToTop]);
369
369
  const rowTypeContextValue = (0, react_1.useCallback)((index) => rows[index]._row_type, [rows]);
370
+ const rowCount = (_a = rows === null || rows === void 0 ? void 0 : rows.length) !== null && _a !== void 0 ? _a : 0;
370
371
  return ((0, jsx_runtime_1.jsx)(ListItemTypeContext.Provider, { value: rowTypeContextValue, children: (0, jsx_runtime_1.jsx)(exports.ListContext.Provider, { value: expandContextValue, children: (0, jsx_runtime_1.jsxs)("div", { ref: rootRef, style: style, className: (0, classnames_1.default)(List_module_scss_1.default.outerWrapper, {
371
372
  [List_module_scss_1.default.hasOutsideScroll]: hasOutsideScroll,
372
373
  }), children: [loading && rows.length === 0 && ((0, jsx_runtime_1.jsx)("div", { className: List_module_scss_1.default.loadingWrapper, children: (0, jsx_runtime_1.jsx)(SpinnerNative_1.Spinner, {}) })), !loading &&
@@ -375,7 +376,9 @@ exports.ListNative = (0, react_1.forwardRef)(function DynamicHeightList({ items
375
376
  [List_module_scss_1.default.reverse]: scrollAnchor === "bottom",
376
377
  [List_module_scss_1.default.borderCollapse]: borderCollapse,
377
378
  [List_module_scss_1.default.sectioned]: groupBy !== undefined,
378
- }), "data-list-container": true, children: (0, jsx_runtime_1.jsx)(virtua_1.Virtualizer, { ref: virtualizerRef, scrollRef: scrollElementRef, shift: shift, onScroll: onScroll, startMargin: hasOutsideScroll ? ((((_a = parentRef.current) === null || _a === void 0 ? void 0 : _a.offsetTop) - ((_b = scrollRef.current) === null || _b === void 0 ? void 0 : _b.offsetTop)) || 0) : 0, item: Item, count: (_c = rows.length) !== null && _c !== void 0 ? _c : 0, children: (rowIndex) => {
379
+ }), "data-list-container": true, children: (0, jsx_runtime_1.jsx)(virtua_1.Virtualizer, { ref: virtualizerRef, scrollRef: scrollElementRef, shift: shift, onScroll: onScroll, startMargin: hasOutsideScroll
380
+ ? ((_b = parentRef.current) === null || _b === void 0 ? void 0 : _b.offsetTop) - ((_c = scrollRef.current) === null || _c === void 0 ? void 0 : _c.offsetTop) || 0
381
+ : 0, item: Item, count: rowCount, children: (rowIndex) => {
379
382
  const row = rows[rowIndex];
380
383
  const key = row[idKey];
381
384
  switch (row._row_type) {
@@ -384,12 +387,12 @@ exports.ListNative = (0, react_1.forwardRef)(function DynamicHeightList({ items
384
387
  case RowType.SECTION_FOOTER:
385
388
  return ((0, jsx_runtime_1.jsx)(react_1.Fragment, { children: (sectionFooterRenderer === null || sectionFooterRenderer === void 0 ? void 0 : sectionFooterRenderer(row, key)) || (0, jsx_runtime_1.jsx)("div", {}) }, key));
386
389
  default:
387
- return (0, jsx_runtime_1.jsx)(react_1.Fragment, { children: itemRenderer(row, key) || (0, jsx_runtime_1.jsx)("div", {}) }, key);
390
+ return ((0, jsx_runtime_1.jsx)(react_1.Fragment, { children: itemRenderer(row, key, rowIndex, rowCount) || (0, jsx_runtime_1.jsx)("div", {}) }, key));
388
391
  }
389
392
  } }) }))] }) }) }));
390
393
  });
391
394
  // --- Helper function for List item rendering
392
- function MemoizedSection({ node, renderChild, item, }) {
395
+ function MemoizedSection({ node, renderChild, item, contextVars = constants_1.EMPTY_OBJECT, }) {
393
396
  const { isExpanded, toggleExpanded } = (0, react_1.useContext)(exports.ListContext);
394
397
  const id = item.id;
395
398
  const expanded = isExpanded(id);
@@ -401,5 +404,5 @@ function MemoizedSection({ node, renderChild, item, }) {
401
404
  },
402
405
  };
403
406
  }, [expanded, id, toggleExpanded]);
404
- return ((0, jsx_runtime_1.jsx)(container_helpers_1.MemoizedItem, { node: node, renderChild: renderChild, item: item, context: sectionContext, itemKey: "$group", contextKey: "$group" }));
407
+ return ((0, jsx_runtime_1.jsx)(container_helpers_1.MemoizedItem, { node: node, renderChild: renderChild, item: item, context: sectionContext, itemKey: "$group", contextKey: "$group", contextVars: Object.assign(Object.assign({}, contextVars), { $isFirst: item.index === 0, $isLast: item.index === item.count - 1 }) }));
405
408
  }
@@ -28,18 +28,19 @@ exports.MarkdownMd = (0, ComponentDefs_1.createMetadata)({
28
28
  defaultThemeVars: {
29
29
  "backgroundColor-Admonition": "$color-warn-300",
30
30
  "borderRadius-Admonition": "$space-4",
31
- "iconSize-Admonition": "1.5rem",
32
- "padding-Admonition": "1rem",
33
- "marginBottom-Admonition": "1rem",
34
- "marginLeft-Admonition-content": ".5rem",
31
+ "iconSize-Admonition": "$space-6",
32
+ "padding-Admonition": "$space-4",
33
+ "marginBottom-Admonition": "$space-4",
34
+ "marginLeft-Admonition-content": "$space-2",
35
35
  "backgroundColor-Blockquote": "$color-warn-200",
36
36
  "accentWidth-Blockquote": "3px",
37
37
  "accentColor-Blockquote": "$color-surface-500",
38
- "padding-Blockquote": ".5rem",
39
- "marginBottom-Blockquote": "1rem",
40
- "marginBottom-Text-codefence": ".5rem",
41
- "marginBottom-Text-markdown": ".5rem",
42
- "marginTop-HtmlLi": "-0.5rem",
38
+ "padding-Blockquote": "$space-2",
39
+ "marginBottom-Blockquote": "$space-4",
40
+ "marginBottom-Text-codefence": "$space-2",
41
+ "marginBottom-Text-markdown": "$space-2",
42
+ "marginTop-HtmlLi": "$space-2",
43
+ "marginBottom-HtmlLi": "$space-2",
43
44
  light: {
44
45
  // --- No light-specific theme vars
45
46
  },
@@ -21,7 +21,6 @@ exports.OptionMd = (0, ComponentDefs_1.createMetadata)({
21
21
  enabled: (0, metadata_helpers_1.dEnabled)(),
22
22
  optionTemplate: (0, ComponentDefs_1.d)("This property is used to define a custom option template"),
23
23
  },
24
- childrenAsTemplate: "optionTemplate"
25
24
  });
26
25
  const OptionNative = (0, react_1.memo)((props) => {
27
26
  const OptionType = (0, OptionTypeProvider_1.useOptionType)();
@@ -11,7 +11,8 @@ const renderers_1 = require("../../components-core/renderers");
11
11
  const themeVars_1 = require("../../components-core/theming/themeVars");
12
12
  const metadata_helpers_1 = require("../metadata-helpers");
13
13
  const container_helpers_1 = require("../container-helpers");
14
- const SelectNative_1 = require("../Select/SelectNative");
14
+ const SelectNative_1 = require("./SelectNative");
15
+ const react_select_1 = require("@radix-ui/react-select");
15
16
  const COMP = "Select";
16
17
  exports.SelectMd = (0, ComponentDefs_1.createMetadata)({
17
18
  description: "Provides a dropdown with a list of options to choose from.",
@@ -88,7 +89,7 @@ exports.selectComponentRenderer = (0, renderers_1.createComponentRenderer)(COMP,
88
89
  }
89
90
  : undefined, optionRenderer: node.props.optionTemplate
90
91
  ? (item) => {
91
- return ((0, jsx_runtime_1.jsx)(container_helpers_1.MemoizedItem, { node: node.props.optionTemplate, item: item, renderChild: renderChild }));
92
+ return ((0, jsx_runtime_1.jsx)(container_helpers_1.MemoizedItem, { node: node.props.optionTemplate, item: item, renderChild: (...args) => ((0, jsx_runtime_1.jsx)(react_select_1.SelectItemText, { children: renderChild(...args) })) }));
92
93
  }
93
94
  : undefined, valueRenderer: node.props.valueTemplate
94
95
  ? (item, removeItem) => {
@@ -224,7 +224,7 @@ const SelectOption = react_1.default.forwardRef((option, ref) => {
224
224
  return () => onOptionRemove(option);
225
225
  }, [option, onOptionAdd, onOptionRemove]);
226
226
  return ((0, jsx_runtime_1.jsx)(react_select_1.Item, { ref: ref, className: Select_module_scss_1.default.selectItem, value: value + "", disabled: !enabled, children: (0, jsx_runtime_1.jsx)("div", { className: Select_module_scss_1.default.selectItemContent, children: optionRenderer ? (optionRenderer({
227
- label: (0, jsx_runtime_1.jsx)(react_select_1.ItemText, { children: label }),
227
+ label,
228
228
  value,
229
229
  enabled,
230
230
  })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_select_1.ItemText, { className: Select_module_scss_1.default.selectItemContent, children: optionLabelRenderer ? optionLabelRenderer({ value, label }) : label }), (0, jsx_runtime_1.jsx)("span", { className: Select_module_scss_1.default.selectItemIndicator, children: (0, jsx_runtime_1.jsx)(react_select_1.ItemIndicator, { children: (0, jsx_runtime_1.jsx)(IconNative_1.default, { name: "checkmark" }) }) })] })) }) }));
@@ -74,6 +74,12 @@ exports.TableMd = (0, ComponentDefs_1.createMetadata)({
74
74
  valueType: "boolean",
75
75
  defaultValue: false,
76
76
  },
77
+ noBottomBorder: {
78
+ description: `This property indicates whether the table should have a bottom border. When set to ` +
79
+ `\`true\`, the table does not have a bottom border. Otherwise, it has a bottom border.`,
80
+ valueType: "boolean",
81
+ defaultValue: false,
82
+ }
77
83
  },
78
84
  events: {
79
85
  sortingDidChange: (0, ComponentDefs_1.d)(`This event is fired when the table data sorting has changed. It has two arguments: ` +
@@ -175,7 +181,7 @@ const TableWithColumns = (0, react_1.forwardRef)(({ extractValue, node, renderCh
175
181
  const tableContent = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TableContext_1.TableContext.Provider, { value: tableContextValue, children: renderChild(node.children) }, tableKey), (0, jsx_runtime_1.jsx)(TableContext_1.TableContext.Provider, { value: columnRefresherContextValue, children: renderChild(node.children) }), (0, jsx_runtime_1.jsx)(TableNative_1.Table, { ref: ref, data: data, columns: columns, pageSizes: extractValue(node.props.pageSizes), rowsSelectable: extractValue.asOptionalBoolean(node.props.rowsSelectable), registerComponentApi: registerComponentApi, noDataRenderer: node.props.noDataTemplate &&
176
182
  (() => {
177
183
  return renderChild(node.props.noDataTemplate);
178
- }), hideNoDataView: node.props.noDataTemplate === null || node.props.noDataTemplate === "", loading: extractValue.asOptionalBoolean(node.props.loading), isPaginated: extractValue.asOptionalBoolean((_a = node.props) === null || _a === void 0 ? void 0 : _a.isPaginated), headerHeight: extractValue.asSize(node.props.headerHeight), rowDisabledPredicate: lookupSyncCallback(node.props.rowDisabledPredicate), sortBy: extractValue((_b = node.props) === null || _b === void 0 ? void 0 : _b.sortBy), sortingDirection: extractValue((_c = node.props) === null || _c === void 0 ? void 0 : _c.sortDirection), iconSortAsc: extractValue.asOptionalString((_d = node.props) === null || _d === void 0 ? void 0 : _d.iconSortAsc), iconSortDesc: extractValue.asOptionalString((_e = node.props) === null || _e === void 0 ? void 0 : _e.iconSortDesc), iconNoSort: extractValue.asOptionalString((_f = node.props) === null || _f === void 0 ? void 0 : _f.iconNoSort), sortingDidChange: lookupEventHandler("sortingDidChange"), onSelectionDidChange: lookupEventHandler("selectionDidChange"), willSort: lookupEventHandler("willSort"), style: layoutCss, uid: node.uid, autoFocus: extractValue.asOptionalBoolean(node.props.autoFocus), hideHeader: extractValue.asOptionalBoolean(node.props.hideHeader), enableMultiRowSelection: extractValue.asOptionalBoolean(node.props.enableMultiRowSelection), alwaysShowSelectionHeader: extractValue.asOptionalBoolean(node.props.alwaysShowSelectionHeader) })] }));
184
+ }), hideNoDataView: node.props.noDataTemplate === null || node.props.noDataTemplate === "", loading: extractValue.asOptionalBoolean(node.props.loading), isPaginated: extractValue.asOptionalBoolean((_a = node.props) === null || _a === void 0 ? void 0 : _a.isPaginated), headerHeight: extractValue.asSize(node.props.headerHeight), rowDisabledPredicate: lookupSyncCallback(node.props.rowDisabledPredicate), sortBy: extractValue((_b = node.props) === null || _b === void 0 ? void 0 : _b.sortBy), sortingDirection: extractValue((_c = node.props) === null || _c === void 0 ? void 0 : _c.sortDirection), iconSortAsc: extractValue.asOptionalString((_d = node.props) === null || _d === void 0 ? void 0 : _d.iconSortAsc), iconSortDesc: extractValue.asOptionalString((_e = node.props) === null || _e === void 0 ? void 0 : _e.iconSortDesc), iconNoSort: extractValue.asOptionalString((_f = node.props) === null || _f === void 0 ? void 0 : _f.iconNoSort), sortingDidChange: lookupEventHandler("sortingDidChange"), onSelectionDidChange: lookupEventHandler("selectionDidChange"), willSort: lookupEventHandler("willSort"), style: layoutCss, uid: node.uid, autoFocus: extractValue.asOptionalBoolean(node.props.autoFocus), hideHeader: extractValue.asOptionalBoolean(node.props.hideHeader), enableMultiRowSelection: extractValue.asOptionalBoolean(node.props.enableMultiRowSelection), alwaysShowSelectionHeader: extractValue.asOptionalBoolean(node.props.alwaysShowSelectionHeader), noBottomBorder: extractValue.asOptionalBoolean(node.props.noBottomBorder) })] }));
179
185
  if (selectionContext === null) {
180
186
  return (0, jsx_runtime_1.jsx)(SelectionStoreNative_1.StandaloneSelectionStore, { children: tableContent });
181
187
  }
@@ -73,7 +73,7 @@ const getCommonPinningStyles = (column) => {
73
73
  };
74
74
  };
75
75
  // eslint-disable-next-line react/display-name
76
- exports.Table = (0, react_1.forwardRef)(({ data = constants_1.EMPTY_ARRAY, columns = constants_1.EMPTY_ARRAY, isPaginated = false, loading = false, headerHeight, rowsSelectable = false, enableMultiRowSelection = true, pageSizes = DEFAULT_PAGE_SIZES, rowDisabledPredicate = defaultIsRowDisabled, sortBy, sortingDirection = "ascending", iconSortAsc, iconSortDesc, iconNoSort, sortingDidChange, willSort, style, noDataRenderer, autoFocus = false, hideHeader = false, hideNoDataView = false, alwaysShowSelectionHeader = false, registerComponentApi, onSelectionDidChange,
76
+ exports.Table = (0, react_1.forwardRef)(({ data = constants_1.EMPTY_ARRAY, columns = constants_1.EMPTY_ARRAY, isPaginated = false, loading = false, headerHeight, rowsSelectable = false, enableMultiRowSelection = true, pageSizes = DEFAULT_PAGE_SIZES, rowDisabledPredicate = defaultIsRowDisabled, sortBy, sortingDirection = "ascending", iconSortAsc, iconSortDesc, iconNoSort, sortingDidChange, willSort, style, noDataRenderer, autoFocus = false, hideHeader = false, hideNoDataView = false, alwaysShowSelectionHeader = false, registerComponentApi, onSelectionDidChange, noBottomBorder = false,
77
77
  // cols
78
78
  }, forwardedRef) => {
79
79
  var _a, _b, _c, _d;
@@ -423,6 +423,7 @@ exports.Table = (0, react_1.forwardRef)(({ data = constants_1.EMPTY_ARRAY, colum
423
423
  [Table_module_scss_1.default.selected]: row.getIsSelected(),
424
424
  [Table_module_scss_1.default.focused]: focusedIndex === rowIndex,
425
425
  [Table_module_scss_1.default.disabled]: rowDisabledPredicate(row.original),
426
+ [Table_module_scss_1.default.noBottomBorder]: noBottomBorder,
426
427
  }), ref: (el) => {
427
428
  if (el && estimatedHeightRef.current === null) {
428
429
  estimatedHeightRef.current = Math.round(el.getBoundingClientRect().height);
@@ -34,15 +34,16 @@ exports.TabsMd = (0, ComponentDefs_1.createMetadata)({
34
34
  },
35
35
  themeVars: (0, themeVars_1.parseScssVar)(Tabs_module_scss_1.default.themeVars),
36
36
  defaultThemeVars: {
37
- [`backgroundColor-${COMP}`]: "$backgroundColor-primary",
37
+ // [`backgroundColor-${COMP}`]: "transparent",
38
38
  [`borderStyle-${COMP}`]: "solid",
39
39
  [`borderColor-${COMP}`]: "$borderColor",
40
40
  [`borderColor-active-${COMP}`]: "$color-primary",
41
41
  [`borderWidth-${COMP}`]: "2px",
42
- [`backgroundColor-trigger-${COMP}`]: "$backgroundColor-primary",
43
- [`backgroundColor-trigger-${COMP}--hover`]: "$color-primary-50",
44
- [`backgroundColor-list-${COMP}`]: "$color-primary-50",
45
- [`textColor-trigger-${COMP}`]: "$color-primary-100",
42
+ // [`backgroundColor-trigger-${COMP}`]: "transparent",
43
+ [`backgroundColor-trigger-${COMP}--hover`]: "$color-surface-100",
44
+ [`padding-trigger-${COMP}`]: "$space-4",
45
+ // [`backgroundColor-list-${COMP}`]: "$color-primary-50",
46
+ // [`textColor-trigger-${COMP}`]: "$color-primary-100",
46
47
  },
47
48
  });
48
49
  exports.tabsComponentRenderer = (0, renderers_1.createComponentRenderer)(COMP, exports.TabsMd, ({ extractValue, node, renderChild, layoutCss, registerComponentApi }) => {
@@ -43,7 +43,8 @@ const RTabs = __importStar(require("@radix-ui/react-tabs"));
43
43
  const Tabs_module_scss_1 = __importDefault(require("./Tabs.module.scss"));
44
44
  const misc_1 = require("../../components-core/utils/misc");
45
45
  const TabContext_1 = require("../Tabs/TabContext");
46
- exports.Tabs = (0, react_1.forwardRef)(function Tabs({ activeTab = 0, orientation = "vertical", tabRenderer, style, children, registerComponentApi, }, forwardedRef) {
46
+ const classnames_1 = __importDefault(require("classnames"));
47
+ exports.Tabs = (0, react_1.forwardRef)(function Tabs({ activeTab = 0, orientation = "horizontal", tabRenderer, style, children, registerComponentApi, className, distributeEvenly = false, }, forwardedRef) {
47
48
  const { tabItems, tabContextValue } = (0, TabContext_1.useTabContextValue)();
48
49
  const [activeIndex, setActiveIndex] = (0, react_1.useState)(activeTab);
49
50
  const currentTab = (0, react_1.useMemo)(() => {
@@ -73,11 +74,13 @@ exports.Tabs = (0, react_1.forwardRef)(function Tabs({ activeTab = 0, orientatio
73
74
  next,
74
75
  });
75
76
  }, [next, registerComponentApi]);
76
- return ((0, jsx_runtime_1.jsx)(TabContext_1.TabContext.Provider, { value: tabContextValue, children: (0, jsx_runtime_1.jsxs)(RTabs.Root, { ref: forwardedRef, className: Tabs_module_scss_1.default.tabs, value: `${currentTab}`, onValueChange: (tab) => {
77
+ return ((0, jsx_runtime_1.jsx)(TabContext_1.TabContext.Provider, { value: tabContextValue, children: (0, jsx_runtime_1.jsxs)(RTabs.Root, { ref: forwardedRef, className: (0, classnames_1.default)(Tabs_module_scss_1.default.tabs, className), value: `${currentTab}`, onValueChange: (tab) => {
77
78
  const newIndex = tabItems.findIndex((item) => item.id === tab);
78
79
  if (newIndex !== activeIndex) {
79
80
  tabContextValue.setActiveTabId(tab);
80
81
  setActiveIndex(newIndex);
81
82
  }
82
- }, orientation: orientation, style: style, children: [(0, jsx_runtime_1.jsxs)(RTabs.List, { className: Tabs_module_scss_1.default.tabsList, children: [tabItems.map((tab) => tabRenderer ? ((0, jsx_runtime_1.jsx)(RTabs.Trigger, { value: tab.id, children: tabRenderer({ label: tab.label, isActive: tab.id === currentTab }) }, tab.id)) : ((0, jsx_runtime_1.jsx)(RTabs.Trigger, { className: Tabs_module_scss_1.default.tabTrigger, value: tab.id, children: tab.label }, tab.id))), (0, jsx_runtime_1.jsx)("div", { className: Tabs_module_scss_1.default.filler, "data-orientation": orientation })] }), children] }) }));
83
+ }, orientation: orientation, style: style, children: [(0, jsx_runtime_1.jsxs)(RTabs.List, { className: Tabs_module_scss_1.default.tabsList, children: [tabItems.map((tab) => tabRenderer ? ((0, jsx_runtime_1.jsx)(RTabs.Trigger, { value: tab.id, asChild: true, children: tabRenderer({ label: tab.label, isActive: tab.id === currentTab }) }, tab.id)) : ((0, jsx_runtime_1.jsx)(RTabs.Trigger, { className: (0, classnames_1.default)(Tabs_module_scss_1.default.tabTrigger, {
84
+ [Tabs_module_scss_1.default.distributeEvenly]: distributeEvenly
85
+ }), value: tab.id, children: tab.label }, tab.id))), (!distributeEvenly && !tabRenderer) && (0, jsx_runtime_1.jsx)("div", { className: Tabs_module_scss_1.default.filler, "data-orientation": orientation })] }), children] }) }));
83
86
  });
@@ -38,6 +38,9 @@ function LoaderComponent({ node, state, dispatch, lookupAction, lookupSyncCallba
38
38
  const memoedLoaderInProgressChanged = (0, react_1.useCallback)((isInProgress) => {
39
39
  dispatch(loaderInProgressChanged(uid, isInProgress));
40
40
  }, [dispatch, uid]);
41
+ const memoedLoaderIsRefetchingChanged = (0, react_1.useCallback)((isRefetching) => {
42
+ dispatch(loaderIsRefetchingChanged(uid, isRefetching));
43
+ }, [dispatch, uid]);
41
44
  const memoedLoaderLoaded = (0, react_1.useCallback)((data, pageInfo) => {
42
45
  dispatch(loaderLoaded(uid, data, pageInfo));
43
46
  }, [dispatch, uid]);
@@ -54,6 +57,7 @@ function LoaderComponent({ node, state, dispatch, lookupAction, lookupSyncCallba
54
57
  state,
55
58
  dispatch,
56
59
  loaderInProgressChanged: memoedLoaderInProgressChanged,
60
+ loaderIsRefetchingChanged: memoedLoaderIsRefetchingChanged,
57
61
  loaderLoaded: memoedLoaderLoaded,
58
62
  loaderError: memoedLoaderError,
59
63
  extractValue: valueExtractor,
@@ -72,6 +76,16 @@ function loaderInProgressChanged(uid, isInProgress) {
72
76
  },
73
77
  };
74
78
  }
79
+ // Signs that a particular loader (`uid`) has just started refetching its data (or executing its operation).
80
+ function loaderIsRefetchingChanged(uid, isRefetching) {
81
+ return {
82
+ type: containers_1.ContainerActionKind.LOADER_IS_REFETCHING_CHANGED,
83
+ payload: {
84
+ uid,
85
+ isRefetching,
86
+ },
87
+ };
88
+ }
75
89
  // Signs that a particular loader (`uid`) has just fetched its data (`pageInfo`) successfully.
76
90
  function loaderLoaded(uid, data, pageInfo) {
77
91
  return {
@@ -9,6 +9,7 @@ var ContainerActionKind;
9
9
  (function (ContainerActionKind) {
10
10
  ContainerActionKind["LOADER_LOADED"] = "ContainerActionKind:LOADER_LOADED";
11
11
  ContainerActionKind["LOADER_IN_PROGRESS_CHANGED"] = "ContainerActionKind:LOADER_IN_PROGRESS_CHANGED";
12
+ ContainerActionKind["LOADER_IS_REFETCHING_CHANGED"] = "ContainerActionKind:LOADER_IS_REFETCHING_CHANGED";
12
13
  ContainerActionKind["LOADER_ERROR"] = "ContainerActionKind:LOADER_ERROR";
13
14
  ContainerActionKind["EVENT_HANDLER_STARTED"] = "ContainerActionKind:EVENT_HANDLER_STARTED";
14
15
  ContainerActionKind["EVENT_HANDLER_COMPLETED"] = "ContainerActionKind:EVENT_HANDLER_COMPLETED";
@@ -21,7 +21,7 @@ const Loader_1 = require("./Loader");
21
21
  /**
22
22
  * Represents a non-displayed React component, which handles the specified API loader
23
23
  */
24
- function ApiLoader({ loader, loaderInProgressChanged, loaderLoaded, loaderError, state, doNotRemoveNulls, }) {
24
+ function ApiLoader({ loader, loaderInProgressChanged, loaderIsRefetchingChanged, loaderLoaded, loaderError, state, doNotRemoveNulls, }) {
25
25
  const appContext = (0, AppContext_1.useAppContext)();
26
26
  const url = (0, extractParam_1.extractParam)(state, loader.props.url, appContext);
27
27
  const loadable = !!url;
@@ -29,7 +29,6 @@ function ApiLoader({ loader, loaderInProgressChanged, loaderLoaded, loaderError,
29
29
  if (!loadable) {
30
30
  return;
31
31
  }
32
- console.log("doLoad ", url);
33
32
  const response = yield fetch(url);
34
33
  if (loader.props.raw) {
35
34
  return yield response.text();
@@ -40,7 +39,7 @@ function ApiLoader({ loader, loaderInProgressChanged, loaderLoaded, loaderError,
40
39
  }
41
40
  return responseObj;
42
41
  }), [doNotRemoveNulls, loadable, loader.props.raw, url]);
43
- return ((0, jsx_runtime_1.jsx)(Loader_1.Loader, { state: state, loader: loader, loaderInProgressChanged: loaderInProgressChanged, loaderLoaded: loaderLoaded, loaderError: loaderError, loaderFn: doLoad }));
42
+ return ((0, jsx_runtime_1.jsx)(Loader_1.Loader, { state: state, loader: loader, loaderInProgressChanged: loaderInProgressChanged, loaderIsRefetchingChanged: loaderIsRefetchingChanged, loaderLoaded: loaderLoaded, loaderError: loaderError, loaderFn: doLoad }));
44
43
  }
45
44
  const ApiLoaderMd = (0, ComponentDefs_1.createMetadata)({
46
45
  description: `Represents a loader that calls an API through an HTTP/HTTPS GET request`,
@@ -49,6 +48,6 @@ const ApiLoaderMd = (0, ComponentDefs_1.createMetadata)({
49
48
  raw: (0, ComponentDefs_1.d)("If true, the loader returns the raw text response instead of parsing it as JSON"),
50
49
  },
51
50
  });
52
- exports.apiLoaderRenderer = (0, renderers_1.createLoaderRenderer)("ApiLoader", ({ loader, state, dispatch, loaderInProgressChanged, loaderLoaded, loaderError }) => {
53
- return ((0, jsx_runtime_1.jsx)(ApiLoader, { loader: loader, state: state, loaderInProgressChanged: loaderInProgressChanged, loaderLoaded: loaderLoaded, loaderError: loaderError }));
51
+ exports.apiLoaderRenderer = (0, renderers_1.createLoaderRenderer)("ApiLoader", ({ loader, state, loaderInProgressChanged, loaderIsRefetchingChanged, loaderLoaded, loaderError }) => {
52
+ return ((0, jsx_runtime_1.jsx)(ApiLoader, { loader: loader, state: state, loaderInProgressChanged: loaderInProgressChanged, loaderIsRefetchingChanged: loaderIsRefetchingChanged, loaderLoaded: loaderLoaded, loaderError: loaderError }));
54
53
  }, ApiLoaderMd);
@@ -26,7 +26,7 @@ const PageableLoader_1 = require("../loader/PageableLoader");
26
26
  const Loader_1 = require("../loader/Loader");
27
27
  const AppContext_1 = require("../AppContext");
28
28
  const hooks_1 = require("../utils/hooks");
29
- function DataLoader({ loader, state, registerComponentApi, onLoaded, onError, loaderInProgressChanged, loaderLoaded, loaderError, transformResult, }) {
29
+ function DataLoader({ loader, state, registerComponentApi, onLoaded, onError, loaderInProgressChanged, loaderIsRefetchingChanged, loaderLoaded, loaderError, transformResult, }) {
30
30
  const appContext = (0, AppContext_1.useAppContext)();
31
31
  const url = (0, extractParam_1.extractParam)(state, loader.props.url, appContext);
32
32
  const queryParamsInner = (0, react_1.useMemo)(() => {
@@ -290,7 +290,7 @@ function DataLoader({ loader, state, registerComponentApi, onLoaded, onError, lo
290
290
  }
291
291
  }), [appContext, loader.props.errorNotificationMessage, loaderError, onError]);
292
292
  const pollIntervalInSeconds = (0, extractParam_1.extractParam)(state, loader.props.pollIntervalInSeconds, appContext);
293
- return hasPaging ? ((0, jsx_runtime_1.jsx)(PageableLoader_1.PageableLoader, { queryId: queryId, state: state, loader: loader, loaderInProgressChanged: inProgress, loaderLoaded: loaded, loaderError: error, loaderFn: doLoad, registerComponentApi: registerComponentApi, pollIntervalInSeconds: pollIntervalInSeconds, onLoaded: onLoaded, transformResult: transformResult }, queryId === null || queryId === void 0 ? void 0 : queryId.join(""))) : ((0, jsx_runtime_1.jsx)(Loader_1.Loader, { queryId: queryId, state: state, loader: loader, loaderInProgressChanged: inProgress, loaderLoaded: loaded, loaderError: error, loaderFn: doLoad, pollIntervalInSeconds: pollIntervalInSeconds, registerComponentApi: registerComponentApi, onLoaded: onLoaded, transformResult: transformResult }, queryId === null || queryId === void 0 ? void 0 : queryId.join("")));
293
+ return hasPaging ? ((0, jsx_runtime_1.jsx)(PageableLoader_1.PageableLoader, { queryId: queryId, state: state, loader: loader, loaderInProgressChanged: inProgress, loaderIsRefetchingChanged: loaderIsRefetchingChanged, loaderLoaded: loaded, loaderError: error, loaderFn: doLoad, registerComponentApi: registerComponentApi, pollIntervalInSeconds: pollIntervalInSeconds, onLoaded: onLoaded, transformResult: transformResult }, queryId === null || queryId === void 0 ? void 0 : queryId.join(""))) : ((0, jsx_runtime_1.jsx)(Loader_1.Loader, { queryId: queryId, state: state, loader: loader, loaderInProgressChanged: inProgress, loaderIsRefetchingChanged: loaderIsRefetchingChanged, loaderLoaded: loaded, loaderError: error, loaderFn: doLoad, pollIntervalInSeconds: pollIntervalInSeconds, registerComponentApi: registerComponentApi, onLoaded: onLoaded, transformResult: transformResult }, queryId === null || queryId === void 0 ? void 0 : queryId.join("")));
294
294
  }
295
295
  exports.DataLoaderMd = (0, ComponentDefs_1.createMetadata)({
296
296
  description: "This component manages data fetching from a web API",
@@ -316,11 +316,11 @@ exports.DataLoaderMd = (0, ComponentDefs_1.createMetadata)({
316
316
  error: (0, ComponentDefs_1.d)("This event fires when an error occurs while fetching data"),
317
317
  },
318
318
  });
319
- exports.dataLoaderRenderer = (0, renderers_1.createLoaderRenderer)("DataLoader", ({ loader, state, loaderLoaded, loaderInProgressChanged, loaderError, registerComponentApi, lookupAction, lookupSyncCallback, }) => {
319
+ exports.dataLoaderRenderer = (0, renderers_1.createLoaderRenderer)("DataLoader", ({ loader, state, loaderLoaded, loaderInProgressChanged, loaderIsRefetchingChanged, loaderError, registerComponentApi, lookupAction, lookupSyncCallback, }) => {
320
320
  var _a, _b, _c;
321
321
  // --- Check for required properties
322
322
  if (!((_a = loader.props) === null || _a === void 0 ? void 0 : _a.url) || !loader.props.url.trim()) {
323
323
  throw new Error("You must specify a non-empty (not whitespace-only) 'url' property for DataSource");
324
324
  }
325
- return ((0, jsx_runtime_1.jsx)(DataLoader, { loader: loader, state: state, loaderInProgressChanged: loaderInProgressChanged, loaderLoaded: loaderLoaded, loaderError: loaderError, registerComponentApi: registerComponentApi, transformResult: lookupSyncCallback(loader.props.transformResult), onLoaded: lookupAction((_b = loader.events) === null || _b === void 0 ? void 0 : _b.loaded, { eventName: "loaded" }), onError: lookupAction((_c = loader.events) === null || _c === void 0 ? void 0 : _c.error, { eventName: "error" }) }));
325
+ return ((0, jsx_runtime_1.jsx)(DataLoader, { loader: loader, state: state, loaderInProgressChanged: loaderInProgressChanged, loaderIsRefetchingChanged: loaderIsRefetchingChanged, loaderLoaded: loaderLoaded, loaderError: loaderError, registerComponentApi: registerComponentApi, transformResult: lookupSyncCallback(loader.props.transformResult), onLoaded: lookupAction((_b = loader.events) === null || _b === void 0 ? void 0 : _b.loaded, { eventName: "loaded" }), onError: lookupAction((_c = loader.events) === null || _c === void 0 ? void 0 : _c.error, { eventName: "error" }) }));
326
326
  }, exports.DataLoaderMd);
@@ -21,19 +21,17 @@ const Loader_1 = require("./Loader");
21
21
  /**
22
22
  * Represents a non-displayed React component, which handles the specified API loader
23
23
  */
24
- function ExternalDataLoader({ loader, loaderInProgressChanged, loaderError, loaderLoaded, state, doNotRemoveNulls, }) {
24
+ function ExternalDataLoader({ loader, loaderInProgressChanged, loaderIsRefetchingChanged, loaderError, loaderLoaded, state, doNotRemoveNulls, }) {
25
25
  const appContext = (0, AppContext_1.useAppContext)();
26
26
  const method = (0, extractParam_1.extractParam)(state, loader.props.method, appContext);
27
27
  const headers = (0, extractParam_1.extractParam)(state, loader.props.headers, appContext);
28
28
  const data = (0, extractParam_1.extractParam)(state, loader.props.data, appContext);
29
- console.log("resolve");
30
29
  const url = (0, extractParam_1.extractParam)(state, loader.props.url, appContext);
31
30
  const urlLoadable = !!url;
32
31
  const doLoad = (0, react_1.useCallback)(() => __awaiter(this, void 0, void 0, function* () {
33
32
  if (!urlLoadable) {
34
33
  return;
35
34
  }
36
- console.log("doLoad ", url, data);
37
35
  const response = yield fetch(url, {
38
36
  method: method || "POST",
39
37
  headers: Object.assign({ "Content-Type": "application/json" }, headers),
@@ -43,10 +41,9 @@ function ExternalDataLoader({ loader, loaderInProgressChanged, loaderError, load
43
41
  if (!doNotRemoveNulls) {
44
42
  (0, misc_1.removeNullProperties)(responseObj);
45
43
  }
46
- console.log("result", responseObj);
47
44
  return responseObj;
48
45
  }), [urlLoadable, headers, data, url, method, doNotRemoveNulls]);
49
- return ((0, jsx_runtime_1.jsx)(Loader_1.Loader, { state: state, loader: loader, loaderInProgressChanged: loaderInProgressChanged, loaderLoaded: loaderLoaded, loaderError: loaderError, loaderFn: doLoad }));
46
+ return ((0, jsx_runtime_1.jsx)(Loader_1.Loader, { state: state, loader: loader, loaderInProgressChanged: loaderInProgressChanged, loaderIsRefetchingChanged: loaderIsRefetchingChanged, loaderLoaded: loaderLoaded, loaderError: loaderError, loaderFn: doLoad }));
50
47
  }
51
48
  exports.ExternalDataLoaderMd = (0, ComponentDefs_1.createMetadata)({
52
49
  description: `Represents a loader that calls an API through an HTTP/HTTPS GET request`,
@@ -57,6 +54,6 @@ exports.ExternalDataLoaderMd = (0, ComponentDefs_1.createMetadata)({
57
54
  data: (0, ComponentDefs_1.d)("The body of the request to be sent as JSON"),
58
55
  },
59
56
  });
60
- exports.externalDataLoaderRenderer = (0, renderers_1.createLoaderRenderer)("ExternalDataLoader", ({ loader, state, loaderInProgressChanged, loaderError, loaderLoaded }) => {
61
- return ((0, jsx_runtime_1.jsx)(ExternalDataLoader, { loader: loader, state: state, loaderInProgressChanged: loaderInProgressChanged, loaderLoaded: loaderLoaded, loaderError: loaderError }));
57
+ exports.externalDataLoaderRenderer = (0, renderers_1.createLoaderRenderer)("ExternalDataLoader", ({ loader, state, loaderInProgressChanged, loaderIsRefetchingChanged, loaderError, loaderLoaded }) => {
58
+ return ((0, jsx_runtime_1.jsx)(ExternalDataLoader, { loader: loader, state: state, loaderInProgressChanged: loaderInProgressChanged, loaderIsRefetchingChanged: loaderIsRefetchingChanged, loaderLoaded: loaderLoaded, loaderError: loaderError }));
62
59
  }, exports.ExternalDataLoaderMd);
@@ -16,9 +16,10 @@ const immer_1 = require("immer");
16
16
  const extractParam_1 = require("../utils/extractParam");
17
17
  const AppContext_1 = require("../AppContext");
18
18
  const hooks_1 = require("../utils/hooks");
19
- function Loader({ state, loader, loaderFn, queryId, pollIntervalInSeconds, registerComponentApi, onLoaded, loaderLoaded, loaderInProgressChanged, loaderError, transformResult }) {
19
+ function Loader({ state, loader, loaderFn, queryId, pollIntervalInSeconds, registerComponentApi, onLoaded, loaderLoaded, loaderInProgressChanged, loaderIsRefetchingChanged, loaderError, transformResult, }) {
20
20
  const { uid } = loader;
21
21
  const appContext = (0, AppContext_1.useAppContext)();
22
+ const [isRefetching, setIsRefetching] = (0, react_1.useState)(false);
22
23
  // --- Rely on react-query to decide when data fetching should use the cache or when is should fetch the data from
23
24
  // --- its data source.
24
25
  // --- data: The data obtained by the query
@@ -26,9 +27,10 @@ function Loader({ state, loader, loaderFn, queryId, pollIntervalInSeconds, regis
26
27
  // --- error: Error information about the current query error (in "error" state)
27
28
  // --- refetch: The function that can be used to re-fetch the data (because of data/state changes)
28
29
  const { data, status, isFetching, error, refetch } = (0, react_query_1.useQuery)({
29
- queryKey: (0, react_1.useMemo)(() => queryId ? queryId : [uid, (0, extractParam_1.extractParam)(state, loader.props, appContext)], [appContext, loader.props, queryId, state, uid]),
30
+ queryKey: (0, react_1.useMemo)(() => (queryId ? queryId : [uid, (0, extractParam_1.extractParam)(state, loader.props, appContext)]), [appContext, loader.props, queryId, state, uid]),
31
+ structuralSharing: false,
30
32
  queryFn: (0, react_1.useCallback)((_a) => __awaiter(this, [_a], void 0, function* ({ signal }) {
31
- //("[Loader queryFn] Starting to fetch data...");
33
+ // console.log("[Loader queryFn] Starting to fetch data...");
32
34
  try {
33
35
  const newVar = yield loaderFn(signal);
34
36
  //console.log("[Loader queryFn] Data received:", newVar);
@@ -58,12 +60,13 @@ function Loader({ state, loader, loaderFn, queryId, pollIntervalInSeconds, regis
58
60
  //console.log("[Loader select] Final result:", finalResult);
59
61
  return finalResult;
60
62
  }, [loader.props.resultSelector, transformResult]),
61
- retry: false
63
+ retry: false,
62
64
  });
63
65
  (0, react_1.useEffect)(() => {
64
66
  let intervalId;
65
67
  if (pollIntervalInSeconds) {
66
68
  intervalId = setInterval(() => {
69
+ setIsRefetching(true);
67
70
  refetch();
68
71
  }, pollIntervalInSeconds * 1000);
69
72
  }
@@ -79,10 +82,14 @@ function Loader({ state, loader, loaderFn, queryId, pollIntervalInSeconds, regis
79
82
  loaderInProgressChanged(isFetching);
80
83
  }, [isFetching, loaderInProgressChanged]);
81
84
  (0, react_1.useLayoutEffect)(() => {
82
- // console.log("[Loader] useLayoutEffect status:", status);
83
- // console.log("[Loader] useLayoutEffect data:", data);
84
- // console.log("[Loader] useLayoutEffect prevData:", prevData);
85
- // console.log("[Loader] useLayoutEffect data !== prevData:", data !== prevData);
85
+ loaderIsRefetchingChanged(isRefetching);
86
+ }, [isRefetching, loaderIsRefetchingChanged]);
87
+ (0, react_1.useLayoutEffect)(() => {
88
+ //console.log("isRefetching", isRefetching);
89
+ //console.log("[Loader] useLayoutEffect status:", status);
90
+ //console.log("[Loader] useLayoutEffect data:", data);
91
+ //console.log("[Loader] useLayoutEffect prevData:", prevData);
92
+ //console.log("[Loader] useLayoutEffect data !== prevData:", data !== prevData);
86
93
  if (status === "success" && data !== prevData) {
87
94
  //console.log("[Loader] Calling loaderLoaded with data:", data);
88
95
  loaderLoaded(data);
@@ -92,14 +99,16 @@ function Loader({ state, loader, loaderFn, queryId, pollIntervalInSeconds, regis
92
99
  setTimeout(() => {
93
100
  // console.log("[Loader] Calling onLoaded with data:", data);
94
101
  // console.log("[Loader] onLoaded function exists:", !!onLoaded);
95
- onLoaded === null || onLoaded === void 0 ? void 0 : onLoaded(data);
102
+ onLoaded === null || onLoaded === void 0 ? void 0 : onLoaded(data, isRefetching);
103
+ setIsRefetching(false);
96
104
  }, 0);
97
105
  }
98
106
  else if (status === "error" && error !== prevError) {
99
107
  // console.log("[Loader] Calling loaderError with error:", error);
100
108
  loaderError(error);
109
+ setIsRefetching(false);
101
110
  }
102
- }, [data, error, loaderError, loaderLoaded, onLoaded, prevData, prevError, status]);
111
+ }, [data, error, loaderError, loaderLoaded, onLoaded, prevData, prevError, status, isRefetching]);
103
112
  (0, react_1.useLayoutEffect)(() => {
104
113
  return () => {
105
114
  loaderLoaded(undefined);
@@ -107,7 +116,10 @@ function Loader({ state, loader, loaderFn, queryId, pollIntervalInSeconds, regis
107
116
  }, [loaderLoaded, uid]);
108
117
  (0, react_1.useEffect)(() => {
109
118
  registerComponentApi === null || registerComponentApi === void 0 ? void 0 : registerComponentApi({
110
- refetch,
119
+ refetch: (options) => __awaiter(this, void 0, void 0, function* () {
120
+ setIsRefetching(true);
121
+ refetch(options);
122
+ }),
111
123
  update: (updater) => __awaiter(this, void 0, void 0, function* () {
112
124
  var _a, _b;
113
125
  const oldData = (_a = appContext.queryClient) === null || _a === void 0 ? void 0 : _a.getQueryData(queryId);