@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.
@@ -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 _4 = (0, react_2.useState)(undefined), openedStatusBox = _4[0], setOpenedStatusBox = _4[1];
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 _5 = (0, react_use_1.useMeasure)(), compactWrapRef = _5[0], compactWrapWidth = _5[1].width;
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 _6 = (0, react_2.useState)(null), compactWrapNode = _6[0], setCompactWrapNode = _6[1];
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 _7 = (0, react_2.useState)([]), highlightedOptions = _7[0], setHighlightedOptions = _7[1];
554
- var _8 = (0, react_2.useState)([]), flashedOptions = _8[0], setFlashedOptions = _8[1];
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 _9 = (0, react_2.useState)({}), infoPanelOverrides = _9[0], setInfoPanelOverrides = _9[1];
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 _10 = (0, react_2.useState)(false), requiredOnly = _10[0], setRequiredOnly = _10[1];
606
- var _11 = (0, react_2.useState)(''), compactQuery = _11[0], setCompactQuery = _11[1];
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 _12 = (0, react_2.useState)('schema'), compactSort = _12[0], setCompactSort = _12[1];
609
- var _13 = (0, react_2.useState)(function () { return ({
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 = _13[0], setLocalValue = _13[1];
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 _14 = (0, useQorusTypes_1.useQorusTypes)(), compactValue = _14.compactValue, typesLoading = _14.loading;
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
- isCollapsed: compactCollapsedGroups.includes(box.key) &&
2062
- !query &&
2063
- !(box.key === 'optional' && onlyOptionalRows), 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.jsx)(compactRowStyles_1.StyledGroupBody, { "$divider": cDivider, "$hover": cHover, "$focus": cWarning, "$success": cSuccess, "$rowBg": cRowBg, "$lineColor": cGroupLine, className: compactNarrow ? 'readfirst-narrow' : undefined, children: groupsInBox.map(function (groupName) {
2064
- var groupConfig = groups === null || groups === void 0 ? void 0 : groups[groupName];
2065
- return ((0, jsx_runtime_1.jsxs)(react_2.default.Fragment, { children: [showGroupSubLabel(groupName) ?
2066
- (0, jsx_runtime_1.jsx)(compactRowStyles_1.StyledStatusBoxGroupLabel, { children: (0, readFirst_1.getOptionGroupLabel)(groupName, groups) })
2067
- : null, showGroupSubLabel(groupName) && (groupConfig === null || groupConfig === void 0 ? void 0 : groupConfig.subtitle) ?
2068
- (0, jsx_runtime_1.jsx)(reqore_1.ReqoreP, { size: 'small', effect: { opacity: 0.6 }, style: {
2069
- marginTop: 2,
2070
- marginBottom: 8,
2071
- marginLeft: compactRowStyles_1.GROUP_INDENT,
2072
- paddingRight: 10,
2073
- }, children: groupConfig.subtitle })
2074
- : null, renderGroupRows(buckets[box.key][groupName])] }, groupName));
2075
- }) }) }, box.key));
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'