@qoretechnologies/reqraft 0.10.45 → 0.10.46-pr.105.g27ead6a
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/components/form/engine/CompactRow.d.ts.map +1 -1
- package/dist/components/form/engine/CompactRow.js +31 -5
- package/dist/components/form/engine/CompactRow.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +17 -0
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +135 -28
- package/dist/components/form/engine/FormEngine.js.map +1 -1
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +10 -1
- package/dist/components/form/engine/compactRowStyles.js.map +1 -1
- package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateField.js +46 -21
- package/dist/components/form/fields/template/TemplateField.js.map +1 -1
- package/dist/helpers/expressions.d.ts.map +1 -1
- package/dist/helpers/expressions.js +15 -2
- package/dist/helpers/expressions.js.map +1 -1
- package/package.json +1 -1
- package/src/components/form/engine/CompactRow.tsx +51 -2
- package/src/components/form/engine/FormEngine.stories.tsx +300 -0
- package/src/components/form/engine/FormEngine.tsx +195 -32
- package/src/components/form/engine/compactRowStyles.ts +41 -0
- package/src/components/form/fields/template/TemplateField.stories.tsx +75 -0
- package/src/components/form/fields/template/TemplateField.tsx +53 -27
- package/src/helpers/expressions.ts +16 -2
|
@@ -402,7 +402,7 @@ var FormEngineImpl = function (_a) {
|
|
|
402
402
|
// form draws; destructured here only so it cannot reach `rest` and be spread
|
|
403
403
|
// onto a DOM node
|
|
404
404
|
_markdownRenderer = _a.markdownRenderer, // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
405
|
-
rendererOnlyUiTypes = _a.rendererOnlyUiTypes, inheritedFromParent = _a.inheritedFromParent, autoFocusFirstRequired = _a.autoFocusFirstRequired, expandFirstRequired = _a.expandFirstRequired, initialExpandedOptions = _a.initialExpandedOptions, rest = __rest(_a, ["name", "uniqueName", "value", "onChange", "onSingleOptionsChange", "onDependableOptionChange", "placeholder", "noValueString", "isValid", "url", "customUrl", "operatorsUrl", "onOptionsLoaded", "recordRequiresSearchOptions", "readOnly", "allowTemplates", "interfaceContext", "templateFieldProps", "forceDropdown", "showTypeToggle", "compact", "compactFlush", "compactNested", "compactPanelProps", "compactCollapsedGroups", "compactToolbar", "commitMode", "expandMode", "onCommit", "operators", "groups", "optionsLoader", "onValidityChange", "optionActions", "optionActionsCollapse", "componentOverrides", "codePreviewRenderer", "markdownRenderer", "rendererOnlyUiTypes", "inheritedFromParent", "autoFocusFirstRequired", "expandFirstRequired", "initialExpandedOptions"]);
|
|
405
|
+
rendererOnlyUiTypes = _a.rendererOnlyUiTypes, inheritedFromParent = _a.inheritedFromParent, autoFocusFirstRequired = _a.autoFocusFirstRequired, expandFirstRequired = _a.expandFirstRequired, initialExpandedOptions = _a.initialExpandedOptions, maxFieldsShown = _a.maxFieldsShown, rest = __rest(_a, ["name", "uniqueName", "value", "onChange", "onSingleOptionsChange", "onDependableOptionChange", "placeholder", "noValueString", "isValid", "url", "customUrl", "operatorsUrl", "onOptionsLoaded", "recordRequiresSearchOptions", "readOnly", "allowTemplates", "interfaceContext", "templateFieldProps", "forceDropdown", "showTypeToggle", "compact", "compactFlush", "compactNested", "compactPanelProps", "compactCollapsedGroups", "compactToolbar", "commitMode", "expandMode", "onCommit", "operators", "groups", "optionsLoader", "onValidityChange", "optionActions", "optionActionsCollapse", "componentOverrides", "codePreviewRenderer", "markdownRenderer", "rendererOnlyUiTypes", "inheritedFromParent", "autoFocusFirstRequired", "expandFirstRequired", "initialExpandedOptions", "maxFieldsShown"]);
|
|
406
406
|
// Built-ins + whatever the consumer declared for its own injected editors.
|
|
407
407
|
var isRendererOnly = (0, react_2.useMemo)(function () { return (0, rendererTypes_1.createRendererOnlyUiTypeCheck)(rendererOnlyUiTypes); }, [JSON.stringify(rendererOnlyUiTypes)]);
|
|
408
408
|
// Pointer CAPABILITY and viewport WIDTH are different questions and both
|
|
@@ -444,6 +444,9 @@ var FormEngineImpl = function (_a) {
|
|
|
444
444
|
var _2 = (0, react_2.useState)(false), showInvalidOptionsOnly = _2[0], setShowInvalidOptionsOnly = _2[1];
|
|
445
445
|
// Which options are expanded into their editor (several can be open at once).
|
|
446
446
|
var _3 = (0, react_2.useState)([]), expandedOptions = _3[0], setExpandedOptions = _3[1];
|
|
447
|
+
/** Status boxes whose "N more fields" control the reader has opened. Keyed by
|
|
448
|
+
box so opening Optional does not also unfold Set. */
|
|
449
|
+
var _4 = (0, react_2.useState)([]), expandedMoreBoxes = _4[0], setExpandedMoreBoxes = _4[1];
|
|
447
450
|
// --- Reveal a status box's content when it is opened ----------------------
|
|
448
451
|
//
|
|
449
452
|
// The status boxes stack, so the last one ("Optional", which holds every
|
|
@@ -459,7 +462,7 @@ var FormEngineImpl = function (_a) {
|
|
|
459
462
|
// box has not grown and there is nothing to scroll to. A layout effect runs
|
|
460
463
|
// after the DOM is updated and before paint, which makes the reveal
|
|
461
464
|
// deterministic instead of a guessed delay.
|
|
462
|
-
var
|
|
465
|
+
var _5 = (0, react_2.useState)(undefined), openedStatusBox = _5[0], setOpenedStatusBox = _5[1];
|
|
463
466
|
var statusBoxRefs = (0, react_2.useRef)({});
|
|
464
467
|
(0, react_2.useLayoutEffect)(function () {
|
|
465
468
|
var _a, _b;
|
|
@@ -490,13 +493,13 @@ var FormEngineImpl = function (_a) {
|
|
|
490
493
|
var settledBucket = (0, react_2.useRef)({});
|
|
491
494
|
// Measured form width (not viewport — the form lives in drawers/panels of
|
|
492
495
|
// arbitrary width) drives the stacked narrow layout.
|
|
493
|
-
var
|
|
496
|
+
var _6 = (0, react_use_1.useMeasure)(), compactWrapRef = _6[0], compactWrapWidth = _6[1].width;
|
|
494
497
|
// Own handle on the scroll wrap (useMeasure's ref is a callback, no `.current`)
|
|
495
498
|
// so the label-column measurement can publish its CSS var on the element. It's
|
|
496
499
|
// STATE, not a ref: the wrap mounts only after the loading-skeleton gate
|
|
497
500
|
// resolves, so the measurement effect must re-run when the node appears — a
|
|
498
501
|
// ref wouldn't retrigger it.
|
|
499
|
-
var
|
|
502
|
+
var _7 = (0, react_2.useState)(null), compactWrapNode = _7[0], setCompactWrapNode = _7[1];
|
|
500
503
|
// Ref mirror of the wrap node for callbacks that must not re-create when it
|
|
501
504
|
// mounts (flashOptions reads it inside a rAF).
|
|
502
505
|
var compactWrapNodeRef = (0, react_2.useRef)(null);
|
|
@@ -550,8 +553,8 @@ var FormEngineImpl = function (_a) {
|
|
|
550
553
|
var readRowHeights = (0, react_2.useRef)({});
|
|
551
554
|
// Required-groups linkage: hovering a group chip highlights every member row;
|
|
552
555
|
// clicking a sibling in the chip's popover scrolls to it and flashes it.
|
|
553
|
-
var
|
|
554
|
-
var
|
|
556
|
+
var _8 = (0, react_2.useState)([]), highlightedOptions = _8[0], setHighlightedOptions = _8[1];
|
|
557
|
+
var _9 = (0, react_2.useState)([]), flashedOptions = _9[0], setFlashedOptions = _9[1];
|
|
555
558
|
var flashTimeout = (0, react_2.useRef)();
|
|
556
559
|
var flashOptions = (0, react_2.useCallback)(function (optionNames, scrollToFirst) {
|
|
557
560
|
if (scrollToFirst === void 0) { scrollToFirst = false; }
|
|
@@ -600,16 +603,16 @@ var FormEngineImpl = function (_a) {
|
|
|
600
603
|
});
|
|
601
604
|
var compactNarrow = !!compactWrapWidth && compactWrapWidth < 480;
|
|
602
605
|
// Info panels auto-open on Tier-1 content; the per-row user override sticks.
|
|
603
|
-
var
|
|
606
|
+
var _10 = (0, react_2.useState)({}), infoPanelOverrides = _10[0], setInfoPanelOverrides = _10[1];
|
|
604
607
|
// Toolbar filters affect the listed rows only — the meter reflects the full set.
|
|
605
|
-
var
|
|
606
|
-
var
|
|
608
|
+
var _11 = (0, react_2.useState)(false), requiredOnly = _11[0], setRequiredOnly = _11[1];
|
|
609
|
+
var _12 = (0, react_2.useState)(''), compactQuery = _12[0], setCompactQuery = _12[1];
|
|
607
610
|
// Compact field sort (Fields menu → "Sort by"); 'schema' = declared order.
|
|
608
|
-
var
|
|
609
|
-
var
|
|
611
|
+
var _13 = (0, react_2.useState)('schema'), compactSort = _13[0], setCompactSort = _13[1];
|
|
612
|
+
var _14 = (0, react_2.useState)(function () { return ({
|
|
610
613
|
fields: (0, exports.fixOptions)(value, options || {}, undefined, isRendererOnly),
|
|
611
614
|
meta: undefined,
|
|
612
|
-
}); }), localValue =
|
|
615
|
+
}); }), localValue = _14[0], setLocalValue = _14[1];
|
|
613
616
|
var originalValue = (0, react_2.useRef)();
|
|
614
617
|
// Track the last value we emitted via onChange so we can skip re-applying fixOptions
|
|
615
618
|
// when the parent echoes it back as the new value prop (controlled component loop prevention)
|
|
@@ -618,7 +621,7 @@ var FormEngineImpl = function (_a) {
|
|
|
618
621
|
originalValue.current = localValue.fields;
|
|
619
622
|
}
|
|
620
623
|
var unavailableOptionsCount = (0, react_2.useRef)(0);
|
|
621
|
-
var
|
|
624
|
+
var _15 = (0, useQorusTypes_1.useQorusTypes)(), compactValue = _15.compactValue, typesLoading = _15.loading;
|
|
622
625
|
var templates = (0, useTemplates_1.useTemplates)(allowTemplates, rest.stringTemplates, interfaceContext);
|
|
623
626
|
(0, react_2.useEffect)(function () {
|
|
624
627
|
if ((0, lodash_1.isEqual)(localValue.fields, value)) {
|
|
@@ -1613,6 +1616,9 @@ var FormEngineImpl = function (_a) {
|
|
|
1613
1616
|
var cBg = (theme === null || theme === void 0 ? void 0 : theme.main) || '#181818';
|
|
1614
1617
|
var cRowBg = (0, colors_1.changeDarkness)((0, colors_1.getMainBackgroundColor)(theme), 0.01);
|
|
1615
1618
|
var cGroupLine = "".concat(cText, "1f");
|
|
1619
|
+
// The "N more fields" row's dashed edge. Well above the divider tint: this
|
|
1620
|
+
// one is an affordance the reader has to notice, not a hairline between rows.
|
|
1621
|
+
var cMoreBorder = "".concat(cText, "4d");
|
|
1616
1622
|
// The closure surface the extracted CompactRow reads through context. Refs and
|
|
1617
1623
|
// setters are stable; the state/memo/handler fields change identity as they do
|
|
1618
1624
|
// today, so a row re-renders exactly when its inputs do.
|
|
@@ -1952,6 +1958,33 @@ var FormEngineImpl = function (_a) {
|
|
|
1952
1958
|
var showGroupSubLabel = function (groupName) {
|
|
1953
1959
|
return (groupName !== 'general' && groupName !== 'optional') || !!(groups === null || groups === void 0 ? void 0 : groups[groupName]);
|
|
1954
1960
|
};
|
|
1961
|
+
// `preselected` means "show this option by default when a new form is
|
|
1962
|
+
// loaded, so it's visible to the user". An empty non-required preselected
|
|
1963
|
+
// field buckets to 'optional' (nothing is wrong with it, and it has no
|
|
1964
|
+
// value), and the Optional box is collapsed by default — so the very
|
|
1965
|
+
// fields the schema asked to put in front of the author were the ones
|
|
1966
|
+
// nobody could see. A preselected row therefore forces its box open.
|
|
1967
|
+
//
|
|
1968
|
+
// A hidden row is an addable the author has not put in the form yet, so it
|
|
1969
|
+
// is never what `preselected` is talking about, however its schema is
|
|
1970
|
+
// flagged.
|
|
1971
|
+
var isPreselectedRow = function (entry) {
|
|
1972
|
+
var _a;
|
|
1973
|
+
return !entry.hidden &&
|
|
1974
|
+
!!((_a = options === null || options === void 0 ? void 0 : options[entry.name]) === null || _a === void 0 ? void 0 : _a.preselected);
|
|
1975
|
+
};
|
|
1976
|
+
// ONLY the Optional box. A preselected field that HAS a value buckets to
|
|
1977
|
+
// 'set' and one that fails validation to 'attention'; in both boxes the
|
|
1978
|
+
// field is already accounted for, and whether those boxes start collapsed
|
|
1979
|
+
// is the consumer's deliberate `compactCollapsedGroups` choice. Overriding
|
|
1980
|
+
// them here forced the Set box open against an explicit request.
|
|
1981
|
+
var groupHasPreselectedRow = function (boxKey, groupName) {
|
|
1982
|
+
return boxKey === 'optional' && (buckets[boxKey][groupName] || []).some(isPreselectedRow);
|
|
1983
|
+
};
|
|
1984
|
+
var boxHasPreselectedRows = function (boxKey) {
|
|
1985
|
+
return boxKey === 'optional' &&
|
|
1986
|
+
bucketGroups[boxKey].some(function (groupName) { return groupHasPreselectedRow(boxKey, groupName); });
|
|
1987
|
+
};
|
|
1955
1988
|
var STATUS_BOXES = [
|
|
1956
1989
|
{ key: 'attention', label: 'Needs attention', intent: 'warning', icon: 'ErrorWarningLine' },
|
|
1957
1990
|
{ key: 'set', label: 'Set', intent: 'success', icon: 'CheckLine' },
|
|
@@ -2006,6 +2039,32 @@ var FormEngineImpl = function (_a) {
|
|
|
2006
2039
|
return ((0, jsx_runtime_1.jsxs)(compactRowStyles_1.StyledRequiredClusterBox, { className: 'options-readfirst-required-cluster', "$border": "".concat(cWarning, "33"), "$tint": "".concat(cWarning, "0d"), children: [(0, jsx_runtime_1.jsxs)(compactRowStyles_1.StyledRequiredClusterHeader, { "$color": cWarning, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreIcon, { icon: 'LinkM', size: '11px', style: { color: cWarning } }), "One of the below is required"] }), railed] }, grp));
|
|
2007
2040
|
});
|
|
2008
2041
|
};
|
|
2042
|
+
// One schema group inside a status box: its thin sub-label, the group's
|
|
2043
|
+
// subtitle, then its rows. Factored out of the box body so the SAME markup
|
|
2044
|
+
// renders both the groups a box shows directly and the ones it defers
|
|
2045
|
+
// behind the inner collapse.
|
|
2046
|
+
/** @param only when given, render just these rows of the group — the group
|
|
2047
|
+
can be split across the shown and folded halves of a capped box, and its
|
|
2048
|
+
label must appear above whichever half holds its first row. */
|
|
2049
|
+
var renderBoxGroup = function (boxKey, groupName, only) {
|
|
2050
|
+
var groupConfig = groups === null || groups === void 0 ? void 0 : groups[groupName];
|
|
2051
|
+
var rows = only ?
|
|
2052
|
+
(buckets[boxKey][groupName] || []).filter(function (entry) { return only.has(entry.name); })
|
|
2053
|
+
: buckets[boxKey][groupName];
|
|
2054
|
+
if (only && !rows.length) {
|
|
2055
|
+
return null;
|
|
2056
|
+
}
|
|
2057
|
+
return ((0, jsx_runtime_1.jsxs)(react_2.default.Fragment, { children: [showGroupSubLabel(groupName) ?
|
|
2058
|
+
(0, jsx_runtime_1.jsx)(compactRowStyles_1.StyledStatusBoxGroupLabel, { children: (0, readFirst_1.getOptionGroupLabel)(groupName, groups) })
|
|
2059
|
+
: null, showGroupSubLabel(groupName) && (groupConfig === null || groupConfig === void 0 ? void 0 : groupConfig.subtitle) ?
|
|
2060
|
+
(0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.6 }, style: {
|
|
2061
|
+
marginTop: 2,
|
|
2062
|
+
marginBottom: 8,
|
|
2063
|
+
marginLeft: compactRowStyles_1.GROUP_INDENT,
|
|
2064
|
+
paddingRight: 10,
|
|
2065
|
+
}, children: groupConfig.subtitle })
|
|
2066
|
+
: null, renderGroupRows(rows)] }, groupName));
|
|
2067
|
+
};
|
|
2009
2068
|
return ((0, jsx_runtime_1.jsx)(exports.OptionsContext.Provider, { value: { schema: options, value: availableOptions }, children: (0, jsx_runtime_1.jsx)(compactRowContext_1.CompactRowContext.Provider, { value: compactRowContextValue, children: (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreErrorBoundary, { children: [showHelpForOption && ((0, jsx_runtime_1.jsx)(OptionsHelpDialog_1.OptionsHelpDialog, { onClose: function () { return setShowHelpForOption(undefined); }, option: options[showHelpForOption] })), (0, jsx_runtime_1.jsx)(compactToolbarContext_1.CompactToolbarContext.Provider, { value: compactToolbarContextValue, children: (0, jsx_runtime_1.jsxs)(StyledCompactWrap, { ref: setCompactWrap, className: 'options-readfirst-scroll', "$flush": compactFlush || compactNested, children: [(0, jsx_runtime_1.jsxs)(compactRowStyles_1.StyledCompactPanel
|
|
2010
2069
|
// Mirrors the toolbar's own search-row gate: when no search
|
|
2011
2070
|
// row renders, the header is a thin strip and sits tight to
|
|
@@ -2023,6 +2082,44 @@ var FormEngineImpl = function (_a) {
|
|
|
2023
2082
|
var count = bucketCount(box.key);
|
|
2024
2083
|
if (!count)
|
|
2025
2084
|
return null;
|
|
2085
|
+
var hasPreselectedRows = boxHasPreselectedRows(box.key);
|
|
2086
|
+
var wouldCollapse = compactCollapsedGroups.includes(box.key) &&
|
|
2087
|
+
!query &&
|
|
2088
|
+
!(box.key === 'optional' && onlyOptionalRows);
|
|
2089
|
+
// Only a box that was opened SOLELY to reveal a preselected
|
|
2090
|
+
// row splits its body; a box that renders open anyway shows
|
|
2091
|
+
// all of its groups as before.
|
|
2092
|
+
var splitForPreselected = wouldCollapse && hasPreselectedRows;
|
|
2093
|
+
// Which rows this box shows, and which fold away, decided at
|
|
2094
|
+
// ROW level because `maxFieldsShown` counts fields — a
|
|
2095
|
+
// group-level split can only ever cut at a group boundary.
|
|
2096
|
+
// Group order is preserved so the visible rows read in the
|
|
2097
|
+
// same order they would if nothing were folded.
|
|
2098
|
+
var orderedRows = groupsInBox.flatMap(function (groupName) { return buckets[box.key][groupName] || []; });
|
|
2099
|
+
// Optional's own rule first: a box opened solely to reveal
|
|
2100
|
+
// preselected rows offers those, not an arbitrary first-N.
|
|
2101
|
+
var candidateRows = splitForPreselected ? orderedRows.filter(isPreselectedRow) : orderedRows;
|
|
2102
|
+
// …then the cap applies to whatever that left.
|
|
2103
|
+
var capped = maxFieldsShown !== undefined && candidateRows.length > maxFieldsShown;
|
|
2104
|
+
var shownRows = capped ? candidateRows.slice(0, maxFieldsShown) : candidateRows;
|
|
2105
|
+
var shownRowSet = new Set(shownRows.map(function (entry) { return entry.name; }));
|
|
2106
|
+
// Everything the box holds that is not on show. Once the
|
|
2107
|
+
// reader asks for more they get the whole box — withholding
|
|
2108
|
+
// the non-preselected remainder behind a second control is
|
|
2109
|
+
// the same defect one level down.
|
|
2110
|
+
var deferredRowSet = new Set(orderedRows
|
|
2111
|
+
.filter(function (entry) { return !shownRowSet.has(entry.name); })
|
|
2112
|
+
.map(function (entry) { return entry.name; }));
|
|
2113
|
+
var deferredCount = deferredRowSet.size;
|
|
2114
|
+
var shownGroups = groupsInBox.filter(function (groupName) {
|
|
2115
|
+
return (buckets[box.key][groupName] || []).some(function (entry) {
|
|
2116
|
+
return shownRowSet.has(entry.name);
|
|
2117
|
+
});
|
|
2118
|
+
});
|
|
2119
|
+
var deferredGroups = groupsInBox.filter(function (groupName) {
|
|
2120
|
+
return (buckets[box.key][groupName] || []).some(function (entry) { return !shownRowSet.has(entry.name); });
|
|
2121
|
+
});
|
|
2122
|
+
var moreOpen = Boolean(query) || expandedMoreBoxes.includes(box.key);
|
|
2026
2123
|
var accent = box.key === 'attention' ? cWarning
|
|
2027
2124
|
: box.key === 'set' ? cSuccess
|
|
2028
2125
|
: cMuted;
|
|
@@ -2058,21 +2155,31 @@ var FormEngineImpl = function (_a) {
|
|
|
2058
2155
|
// nothing else. This does not generalise to the other two —
|
|
2059
2156
|
// a lone Set box collapsed is a deliberate ask, and its
|
|
2060
2157
|
// header still reports what is in there.
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2158
|
+
//
|
|
2159
|
+
// A PRESELECTED row overrides it too: the schema asked
|
|
2160
|
+
// for that field to be visible on a new form, so the
|
|
2161
|
+
// box it lands in opens. The groups it does NOT appear
|
|
2162
|
+
// in stay behind an inner collapse below, so opening
|
|
2163
|
+
// the box reveals the preselected fields without also
|
|
2164
|
+
// dumping every not-yet-added optional field on the
|
|
2165
|
+
// author.
|
|
2166
|
+
isCollapsed: wouldCollapse && !hasPreselectedRows, label: (0, jsx_runtime_1.jsxs)(compactRowStyles_1.StyledGroupHeader, { children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { effect: { weight: 'bold' }, size: 'normal', children: box.label }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreTag, { size: 'small', minimal: true, compact: true, intent: box.intent, label: String(count) })] }), icon: box.icon, className: 'options-readfirst-group', padded: false, contentStyle: { padding: '4px 4px 6px' }, children: (0, jsx_runtime_1.jsxs)(compactRowStyles_1.StyledGroupBody, { "$divider": cDivider, "$hover": cHover, "$focus": cWarning, "$success": cSuccess, "$rowBg": cRowBg, "$lineColor": cGroupLine, "$moreBorder": cMoreBorder, className: compactNarrow ? 'readfirst-narrow' : undefined, children: [shownGroups.map(function (groupName) {
|
|
2167
|
+
return renderBoxGroup(box.key, groupName, shownRowSet);
|
|
2168
|
+
}), deferredCount ?
|
|
2169
|
+
(0, jsx_runtime_1.jsxs)("button", { type: 'button', className: 'readfirst-row readfirst-more-row options-readfirst-more', "aria-expanded": moreOpen, onClick: function () {
|
|
2170
|
+
return setExpandedMoreBoxes(function (prev) {
|
|
2171
|
+
return prev.includes(box.key) ?
|
|
2172
|
+
prev.filter(function (k) { return k !== box.key; })
|
|
2173
|
+
: __spreadArray(__spreadArray([], prev, true), [box.key], false);
|
|
2174
|
+
});
|
|
2175
|
+
}, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.8 }, children: moreOpen ?
|
|
2176
|
+
'Show fewer'
|
|
2177
|
+
: "".concat(deferredCount, " more ").concat(box.key === 'optional' ? 'optional ' : '', "field").concat(deferredCount === 1 ? '' : 's') }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreIcon, { icon: 'ArrowDownSLine', size: 'small', className: 'readfirst-more-chevron', effect: { opacity: 0.8 } })] })
|
|
2178
|
+
: null, deferredCount && moreOpen ?
|
|
2179
|
+
deferredGroups.map(function (groupName) {
|
|
2180
|
+
return renderBoxGroup(box.key, groupName, deferredRowSet);
|
|
2181
|
+
})
|
|
2182
|
+
: null] }) }, box.key));
|
|
2076
2183
|
})] })), commitMode === 'batched' && !readOnly && dirtyOptionNames.length ?
|
|
2077
2184
|
(0, jsx_runtime_1.jsx)(StyledCommitDock, { "$bg": cBg, "$border": cDivider, children: (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { className: 'options-readfirst-commitbar', verticalAlign: 'center', wrap: true, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreTag, { size: 'tiny', minimal: true, flat: true, compact: true, effect: { uppercase: true, spaced: 1 }, intent: 'warning', icon: 'EditLine', label: "".concat(dirtyOptionNames.length, " unsaved change").concat(dirtyOptionNames.length === 1 ? '' : 's') }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { size: 'small', intent: 'success', icon: 'CheckLine', fixed: true, className: 'options-readfirst-save', disabled: !validityData.isValid, tooltip: validityData.isValid ?
|
|
2078
2185
|
'Apply the staged changes'
|