xmlui 0.9.13 → 0.9.14
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.
- package/dist/{apiInterceptorWorker-BUaYCWe6.mjs → apiInterceptorWorker-B9XuRkxC.mjs} +1 -1
- package/dist/{index-DiCe0Ajo.mjs → index-D82p1y9A.mjs} +421 -203
- package/dist/index.css +298 -275
- package/dist/scripts/src/components/Card/Card.js +17 -1
- package/dist/scripts/src/components/Card/CardNative.js +2 -3
- package/dist/scripts/src/components/DatePicker/DatePickerNative.js +2 -2
- package/dist/scripts/src/components/Markdown/Markdown.js +10 -9
- package/dist/scripts/src/components/Option/Option.js +0 -1
- package/dist/scripts/src/components/Select/Select.js +3 -2
- package/dist/scripts/src/components/Select/SelectNative.js +1 -1
- package/dist/scripts/src/components/Table/Table.js +7 -1
- package/dist/scripts/src/components/Table/TableNative.js +2 -1
- package/dist/scripts/src/components-core/LoaderComponent.js +14 -0
- package/dist/scripts/src/components-core/abstractions/containers.js +1 -0
- package/dist/scripts/src/components-core/loader/ApiLoader.js +4 -5
- package/dist/scripts/src/components-core/loader/DataLoader.js +4 -4
- package/dist/scripts/src/components-core/loader/ExternalDataLoader.js +4 -7
- package/dist/scripts/src/components-core/loader/Loader.js +23 -11
- package/dist/scripts/src/components-core/loader/MockLoaderRenderer.js +3 -3
- package/dist/scripts/src/components-core/loader/PageableLoader.js +14 -4
- package/dist/scripts/src/components-core/rendering/reducer.js +9 -3
- package/dist/style.css +298 -275
- package/dist/xmlui-metadata.mjs +197 -156
- package/dist/xmlui-metadata.umd.js +197 -156
- package/dist/xmlui-standalone.umd.js +4911 -2858
- package/dist/xmlui.d.ts +33 -1
- package/dist/xmlui.mjs +1 -1
- package/package.json +2 -2
|
@@ -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)(
|
|
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,
|
|
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,
|
|
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) => {
|
|
@@ -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": "
|
|
32
|
-
"padding-Admonition": "
|
|
33
|
-
"marginBottom-Admonition": "
|
|
34
|
-
"marginLeft-Admonition-content": "
|
|
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": "
|
|
39
|
-
"marginBottom-Blockquote": "
|
|
40
|
-
"marginBottom-Text-codefence": "
|
|
41
|
-
"marginBottom-Text-markdown": "
|
|
42
|
-
"marginTop-HtmlLi": "-
|
|
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("
|
|
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
|
|
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);
|
|
@@ -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,
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
//
|
|
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);
|
|
@@ -18,7 +18,7 @@ const extractParam_1 = require("../utils/extractParam");
|
|
|
18
18
|
const renderers_1 = require("../renderers");
|
|
19
19
|
const AppContext_1 = require("../AppContext");
|
|
20
20
|
const Loader_1 = require("./Loader");
|
|
21
|
-
function ApiLoader({ loader, loaderInProgressChanged, loaderError, loaderLoaded, state, }) {
|
|
21
|
+
function ApiLoader({ loader, loaderInProgressChanged, loaderIsRefetchingChanged, loaderError, loaderLoaded, state, }) {
|
|
22
22
|
const appContext = (0, AppContext_1.useAppContext)();
|
|
23
23
|
const waitTime = (0, extractParam_1.extractParam)(state, loader.props.waitTime, appContext);
|
|
24
24
|
const responseObj = (0, extractParam_1.extractParam)(state, loader.props.data, appContext);
|
|
@@ -26,7 +26,7 @@ function ApiLoader({ loader, loaderInProgressChanged, loaderError, loaderLoaded,
|
|
|
26
26
|
waitTime && (yield (0, misc_1.asyncWait)(waitTime));
|
|
27
27
|
return responseObj;
|
|
28
28
|
}), [responseObj, waitTime]);
|
|
29
|
-
return ((0, jsx_runtime_1.jsx)(Loader_1.Loader, { state: state, loader: loader, loaderInProgressChanged: loaderInProgressChanged, loaderLoaded: loaderLoaded, loaderError: loaderError, loaderFn: doLoad }));
|
|
29
|
+
return ((0, jsx_runtime_1.jsx)(Loader_1.Loader, { state: state, loader: loader, loaderInProgressChanged: loaderInProgressChanged, loaderIsRefetchingChanged: loaderIsRefetchingChanged, loaderLoaded: loaderLoaded, loaderError: loaderError, loaderFn: doLoad }));
|
|
30
30
|
}
|
|
31
31
|
exports.MockLoaderMd = (0, ComponentDefs_1.createMetadata)({
|
|
32
32
|
description: "A loader that simulates a delay and returns a predefined response",
|
|
@@ -36,5 +36,5 @@ exports.MockLoaderMd = (0, ComponentDefs_1.createMetadata)({
|
|
|
36
36
|
},
|
|
37
37
|
});
|
|
38
38
|
exports.mockLoaderRenderer = (0, renderers_1.createLoaderRenderer)("MockLoader", ({ loader, state, loaderInProgressChanged, loaderLoaded, loaderError }) => {
|
|
39
|
-
return ((0, jsx_runtime_1.jsx)(ApiLoader, { loader: loader, state: state, loaderInProgressChanged: loaderInProgressChanged, loaderLoaded: loaderLoaded, loaderError: loaderError }));
|
|
39
|
+
return ((0, jsx_runtime_1.jsx)(ApiLoader, { loader: loader, state: state, loaderInProgressChanged: loaderInProgressChanged, loaderIsRefetchingChanged: loaderInProgressChanged, loaderLoaded: loaderLoaded, loaderError: loaderError }));
|
|
40
40
|
}, exports.MockLoaderMd);
|
|
@@ -49,16 +49,17 @@ const immer_1 = __importStar(require("immer"));
|
|
|
49
49
|
const extractParam_1 = require("../utils/extractParam");
|
|
50
50
|
const AppContext_1 = require("../AppContext");
|
|
51
51
|
const hooks_1 = require("../utils/hooks");
|
|
52
|
-
function PageableLoader({ state, loader, loaderFn, queryId, registerComponentApi, pollIntervalInSeconds, onLoaded, loaderInProgressChanged, loaderLoaded, loaderError, transformResult, }) {
|
|
52
|
+
function PageableLoader({ state, loader, loaderFn, queryId, registerComponentApi, pollIntervalInSeconds, onLoaded, loaderInProgressChanged, loaderIsRefetchingChanged, loaderLoaded, loaderError, transformResult, }) {
|
|
53
53
|
const { uid } = loader;
|
|
54
54
|
const appContext = (0, AppContext_1.useAppContext)();
|
|
55
55
|
const queryKey = (0, react_1.useMemo)(() => (queryId ? queryId : [uid, (0, extractParam_1.extractParam)(state, loader.props, appContext)]), [appContext, loader.props, queryId, state, uid]);
|
|
56
56
|
const thizRef = (0, react_1.useRef)(queryKey);
|
|
57
|
+
const [isRefetching, setIsRefetching] = (0, react_1.useState)(false);
|
|
57
58
|
const getPreviousPageParam = (0, react_1.useCallback)((firstPage) => {
|
|
58
59
|
let prevPageParam = undefined;
|
|
59
60
|
const prevPageSelector = loader.props.prevPageSelector;
|
|
60
61
|
if (prevPageSelector) {
|
|
61
|
-
prevPageParam = (0, extractParam_1.extractParam)({ $response: firstPage.filter(item => !item._optimisticValue) }, prevPageSelector.startsWith("{") ? prevPageSelector : `{$response.${prevPageSelector}}`);
|
|
62
|
+
prevPageParam = (0, extractParam_1.extractParam)({ $response: firstPage.filter((item) => !item._optimisticValue) }, prevPageSelector.startsWith("{") ? prevPageSelector : `{$response.${prevPageSelector}}`);
|
|
62
63
|
}
|
|
63
64
|
if (!prevPageParam) {
|
|
64
65
|
return undefined;
|
|
@@ -130,6 +131,9 @@ function PageableLoader({ state, loader, loaderFn, queryId, registerComponentApi
|
|
|
130
131
|
(0, react_1.useLayoutEffect)(() => {
|
|
131
132
|
loaderInProgressChanged(isFetching); //TODO isFetchingPrevPage / nextPage
|
|
132
133
|
}, [isFetching, loaderInProgressChanged]);
|
|
134
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
135
|
+
loaderIsRefetchingChanged(isRefetching); //TODO isFetchingPrevPage / nextPage
|
|
136
|
+
}, [isRefetching, loaderIsRefetchingChanged]);
|
|
133
137
|
const pageInfo = (0, react_1.useMemo)(() => {
|
|
134
138
|
return {
|
|
135
139
|
hasPrevPage: hasPreviousPage,
|
|
@@ -151,11 +155,13 @@ function PageableLoader({ state, loader, loaderFn, queryId, registerComponentApi
|
|
|
151
155
|
// It works, because useLayoutEffect will run synchronously after the render, and the onLoaded callback will have
|
|
152
156
|
// access to the latest loader value
|
|
153
157
|
setTimeout(() => {
|
|
154
|
-
onLoaded === null || onLoaded === void 0 ? void 0 : onLoaded(data);
|
|
158
|
+
onLoaded === null || onLoaded === void 0 ? void 0 : onLoaded(data, isRefetching);
|
|
159
|
+
setIsRefetching(false);
|
|
155
160
|
}, 0);
|
|
156
161
|
}
|
|
157
162
|
else if (status === "error" && prevError !== error) {
|
|
158
163
|
loaderError(error);
|
|
164
|
+
setIsRefetching(false);
|
|
159
165
|
}
|
|
160
166
|
}, [
|
|
161
167
|
data,
|
|
@@ -173,6 +179,7 @@ function PageableLoader({ state, loader, loaderFn, queryId, registerComponentApi
|
|
|
173
179
|
let intervalId;
|
|
174
180
|
if (pollIntervalInSeconds) {
|
|
175
181
|
intervalId = setInterval(() => {
|
|
182
|
+
setIsRefetching(true);
|
|
176
183
|
refetch();
|
|
177
184
|
}, pollIntervalInSeconds * 1000);
|
|
178
185
|
}
|
|
@@ -192,7 +199,10 @@ function PageableLoader({ state, loader, loaderFn, queryId, registerComponentApi
|
|
|
192
199
|
registerComponentApi({
|
|
193
200
|
fetchPrevPage,
|
|
194
201
|
fetchNextPage: stableFetchNextPage,
|
|
195
|
-
refetch,
|
|
202
|
+
refetch: (options) => __awaiter(this, void 0, void 0, function* () {
|
|
203
|
+
setIsRefetching(true);
|
|
204
|
+
refetch(options);
|
|
205
|
+
}),
|
|
196
206
|
update: (updater) => __awaiter(this, void 0, void 0, function* () {
|
|
197
207
|
var _a, _b;
|
|
198
208
|
const oldData = (_a = appContext.queryClient) === null || _a === void 0 ? void 0 : _a.getQueryData(queryId);
|
|
@@ -44,6 +44,11 @@ function createContainerReducer(debugView) {
|
|
|
44
44
|
storeNextValue(state[uid]);
|
|
45
45
|
break;
|
|
46
46
|
}
|
|
47
|
+
case containers_1.ContainerActionKind.LOADER_IS_REFETCHING_CHANGED: {
|
|
48
|
+
state[uid] = Object.assign(Object.assign({}, state[uid]), { isRefetching: action.payload.isRefetching });
|
|
49
|
+
storeNextValue(state[uid]);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
47
52
|
case containers_1.ContainerActionKind.LOADER_LOADED: {
|
|
48
53
|
const { data, pageInfo } = action.payload;
|
|
49
54
|
state[uid] = {
|
|
@@ -98,7 +103,9 @@ function createContainerReducer(debugView) {
|
|
|
98
103
|
let tempValueInLocalVars = localVars;
|
|
99
104
|
(0, lodash_es_1.setWith)(state, path, value, (nsValue, key, nsObject) => {
|
|
100
105
|
tempValueInLocalVars = tempValueInLocalVars === null || tempValueInLocalVars === void 0 ? void 0 : tempValueInLocalVars[key];
|
|
101
|
-
if (nsValue === undefined &&
|
|
106
|
+
if (nsValue === undefined &&
|
|
107
|
+
tempValueInLocalVars === undefined &&
|
|
108
|
+
(0, lodash_es_1.isPlainObject)(target)) {
|
|
102
109
|
// if we are setting a new object's key, lodash defaults it to an array, if the key is a number.
|
|
103
110
|
// This way we can force it to be an object.
|
|
104
111
|
// (example: we have an empty object in vars called usersTyped: {}, we set usersTyped[1] = Date.now().
|
|
@@ -126,10 +133,9 @@ function createContainerReducer(debugView) {
|
|
|
126
133
|
prevState,
|
|
127
134
|
nextState,
|
|
128
135
|
};
|
|
129
|
-
// TODO: Logging to the console is a temporary solution. We should use a proper
|
|
136
|
+
// TODO: Logging to the console is a temporary solution. We should use a proper
|
|
130
137
|
// logging mechanism. Nonetheless, this works only with state transition logging
|
|
131
138
|
// enabled (which is disabled by default).
|
|
132
|
-
console.log("Transition", loggedTransition);
|
|
133
139
|
if (debugView.stateTransitions) {
|
|
134
140
|
if (debugView.stateTransitions.length >= MAX_STATE_TRANSITION_LENGTH) {
|
|
135
141
|
debugView.stateTransitions.shift();
|