@svgrid/enterprise 3.1.24 → 3.1.25

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.
@@ -64741,7 +64741,7 @@ function g1(e) {
64741
64741
  }
64742
64742
  //#endregion
64743
64743
  //#region src/version.ts
64744
- var _1 = "3.1.24", v1 = "3.0.22", y1 = (e, t) => e.some((e) => e.config.kind === t), b1 = (e) => `activeTab_${e.replace(/[^a-zA-Z0-9_$]/g, "_")}`, x1 = (e, t) => `${e}-${t}`, S1 = (e) => `accOpen_${e.replace(/[^a-zA-Z0-9_$]/g, "_")}`, C1 = (e, t) => `${e}-s${t}`, w1 = (e) => `md_${e.replace(/[^a-zA-Z0-9]/g, "_")}_rows`;
64744
+ var _1 = "3.1.25", v1 = "3.0.22", y1 = (e, t) => e.some((e) => e.config.kind === t), b1 = (e) => `activeTab_${e.replace(/[^a-zA-Z0-9_$]/g, "_")}`, x1 = (e, t) => `${e}-${t}`, S1 = (e) => `accOpen_${e.replace(/[^a-zA-Z0-9_$]/g, "_")}`, C1 = (e, t) => `${e}-s${t}`, w1 = (e) => `md_${e.replace(/[^a-zA-Z0-9]/g, "_")}_rows`;
64745
64745
  function T1(e) {
64746
64746
  switch (e.type) {
64747
64747
  case "number": {
@@ -76261,7 +76261,7 @@ ${k}
76261
76261
  .st-home a { color: var(--sg-accent, #6366f1); font-weight: 600; }
76262
76262
  @keyframes st-home-spin { to { transform: rotate(360deg); } }
76263
76263
  </style>
76264
- `}}function M1(e){for(let t of e)MG(t);let t=new Map(e.map(e=>[e.name,e])),n=e.map(e=>{let n=c1(e,t);return{schema:l1(e,n),infos:n}});return{entries:n,seed:u1(n)}}function wre(e,t={}){let{entries:n,seed:r}=M1(e),{file:i,needs:a}=O1(n,r,t.sources,t.supabaseConn,t.serverMemory),o=[_re(n),i];(a.supabase||t.supabaseAuth)&&!a.supabaseUrl&&(t.supabaseConn?.url||t.supabaseConn?.key)&&(a.supabaseUrl=t.supabaseConn.url,a.supabaseKey=t.supabaseConn.key),(a.supabase||t.supabaseAuth)&&o.push(k1(a));for(let e of a.sqlRoutes)o.push(y1(e.schema,e.table,e.dialect,{access:t.accessEnabled,audit:t.auditEnabled,screenIds:t.screensByEntity?.get(e.schema.name)??[],triggers:t.triggers?.[e.schema.name],dbSchema:e.dbSchema,tenantField:t.tenantField&&t.tenantScoped?.(e.schema.name)!==!1?t.tenantField:void 0}));if(a.memoryRoutes.length){o.push(x1(a.memoryRoutes));for(let e of a.memoryRoutes)o.push(b1(e.schema,{access:t.accessEnabled,audit:t.auditEnabled,screenIds:t.screensByEntity?.get(e.schema.name)??[],triggers:t.triggers?.[e.schema.name],tenantField:t.tenantField&&t.tenantScoped?.(e.schema.name)!==!1?t.tenantField:void 0}))}return{files:o,prepared:n.map(e=>e.schema)}}var N1=`3.1.24`,P1=`3.0.22`,F1=(e,t)=>e.some(e=>e.config.kind===t),I1=e=>`activeTab_${e.replace(/[^a-zA-Z0-9_$]/g,`_`)}`,L1=(e,t)=>`${e}-${t}`,R1=e=>`accOpen_${e.replace(/[^a-zA-Z0-9_$]/g,`_`)}`,z1=(e,t)=>`${e}-s${t}`,B1=e=>`md_${e.replace(/[^a-zA-Z0-9]/g,`_`)}_rows`;function V1(e){switch(e.type){case`number`:{let t=e.decimals;return t==null?`{ type: 'number' }`:`{ type: 'number', options: { minimumFractionDigits: ${t}, maximumFractionDigits: ${t} } }`}case`currency`:return`{ type: 'currency', currency: ${$1(e.currency||`USD`)} }`;case`percent`:{let t=[`type: 'percent'`];return e.valueIsPercentPoints&&t.push(`valueIsPercentPoints: true`),e.decimals!=null&&t.push(`options: { minimumFractionDigits: ${e.decimals}, maximumFractionDigits: ${e.decimals} }`),`{ ${t.join(`, `)} }`}case`date`:case`datetime`:return e.pattern?`{ type: '${e.type}', pattern: ${$1(e.pattern)} }`:`{ type: '${e.type}' }`}}function H1(e,t,n,r){if(t.config.kind!==`grid`)return`schemaToColumns(${e})`;let i=t.config,a=t.id.replace(/-/g,`_`),o=i.columns.filter(e=>e.show),s=new Set(o.map(e=>e.field)),c=new Set,l=o.map(e=>{let t=r?.get(e.field);return{c:e,col:t&&!s.has(t)?t:e.field}}).filter(e=>!c.has(e.col)&&!!c.add(e.col)),u=i.editing===`inline`?``:`, editable: false`;if(l.length===0)return u?`schemaToColumns(${e}).map((c) => ({ ...c${u} }))`:`schemaToColumns(${e})`;let d=l.map(e=>`'${e.col}'`),f=l.map(({c:e,col:t})=>{let r=[];return e.header&&r.push(`header: ${JSON.stringify(e.header)}`),e.width!=null&&r.push(`width: ${e.width}`),e.align&&r.push(`align: '${e.align}'`),e.aggregate&&r.push(`aggregate: '${e.aggregate}'`),i.treeData&&e.field===i.treeData.labelField&&n?r.push(`cell: (ctx: CellContext<${n}>) => renderSnippet(treeCell_${a}, { value: ctx.getValue(), row: ctx.row.original })`):e.cellType&&n?r.push(`cell: (ctx: CellContext<${n}>) => renderSnippet(${d0(a,e.field)}, { value: ctx.getValue() })`):e.format&&r.push(`format: ${V1(e.format)}`),r.length?`'${t}': { ${r.join(`, `)} }`:null}).filter(e=>!!e),p=f.length?` const ov: Record<string, Partial<(typeof all)[number]>> = { ${f.join(`, `)} };`:``,m=f.length?`, ...(ov[String(c.field)] ?? {})`:``,h=`[${d.join(`, `)}].map((f) => all.find((c) => c.field === f)).filter((c): c is (typeof all)[number] => !!c)`;return`(() => { const all = schemaToColumns(${e});${p} return ${u||m?`${h}.map((c) => ({ ...c${u}${m} }))`:h} })()`}function U1(e,t){let n=[`grid-column: span ${uZ(e)}`,`min-width: 0`];t&&n.push(t);let r=fZ(e.style);return r&&n.push(r),`style="${n.join(`; `)}"`}var Tre=e=>e&&e.replace(/[^#a-zA-Z0-9(),.%\s_-]/g,``).slice(0,40)||`var(--sg-accent)`;function W1(e,t){let n=[t,lZ(e)].filter(Boolean).join(` `);return n?` class="${n}"`:``}function G1(e){let t=cZ(e.className);return t?` ${t}`:``}function Ere(e){let t=n$(e);if(t===`grid`){let t=BZ(e),n=t.maxWidth?` max-width: ${t.maxWidth}px; margin-inline: auto;`:``;return` .st-screen { grid-template-columns: repeat(12, 1fr); gap: ${t.rowGap}px ${t.colGap}px; align-items: ${t.align};${n} }\n @media (max-width: ${t.mobileBreakpoint}px) { .st-screen { grid-template-columns: 1fr; gap: 12px; } }\n`}if(t===`stack`){let t=VZ(e),n=t.maxWidth?` max-width: ${t.maxWidth}px;${t.align===`center`?` margin-inline: auto;`:``}`:``,r=t.minHeight?`\n .st-stack > * { min-height: ${t.minHeight}px; }`:``,i=t.dividers?`\n .st-stack > * + * { border-top: 1px solid var(--sg-border, #e2e8f0); padding-top: ${t.gap}px; }`:``;return` .st-stack { gap: ${t.gap}px;${n} }${r}${i}\n`}if(t===`canvas`){let t=WZ(e),n=t.showGrid?`\n .st-canvas { background-image: linear-gradient(var(--sg-border, #e6e8ec) 1px, transparent 1px), linear-gradient(90deg, var(--sg-border, #e6e8ec) 1px, transparent 1px); background-size: calc((100% - ${t.cols-1} * ${t.gap}px) / ${t.cols} + ${t.gap}px) calc(${t.rowHeight}px + ${t.gap}px); }`:``;return` .st-canvas { grid-template-columns: repeat(${t.cols}, 1fr); grid-auto-rows: ${t.rowHeight}px; gap: ${t.gap}px; }${n}\n`}return``}function K1(e,t,n,r,i,a={hasRecord:!1}){let o=(e,t)=>a.i18n?`{$t('block.${t}', ${JSON.stringify(e)})}`:e,s=a.pane?`style="height: 100%; min-width: 0; min-height: 0; display: flex; flex-direction: column;"`:U1(r),c=W1(r),l=r.config,u=a.handleNames?.get(r.id),d=u?`${u}.rows`:`allRows`;switch(l.kind){case`grid`:{let t=r.id.replace(/-/g,`_`),o=`columns_${t}`,u=`No ${(e.label??e.name).toLowerCase()} yet.`,d=Dre(l,t);if(l.scheduler){let t=s1(a.rawEntity??e,i);return` <div ${s}${c}>
76264
+ `}}function M1(e){for(let t of e)MG(t);let t=new Map(e.map(e=>[e.name,e])),n=e.map(e=>{let n=c1(e,t);return{schema:l1(e,n),infos:n}});return{entries:n,seed:u1(n)}}function wre(e,t={}){let{entries:n,seed:r}=M1(e),{file:i,needs:a}=O1(n,r,t.sources,t.supabaseConn,t.serverMemory),o=[_re(n),i];(a.supabase||t.supabaseAuth)&&!a.supabaseUrl&&(t.supabaseConn?.url||t.supabaseConn?.key)&&(a.supabaseUrl=t.supabaseConn.url,a.supabaseKey=t.supabaseConn.key),(a.supabase||t.supabaseAuth)&&o.push(k1(a));for(let e of a.sqlRoutes)o.push(y1(e.schema,e.table,e.dialect,{access:t.accessEnabled,audit:t.auditEnabled,screenIds:t.screensByEntity?.get(e.schema.name)??[],triggers:t.triggers?.[e.schema.name],dbSchema:e.dbSchema,tenantField:t.tenantField&&t.tenantScoped?.(e.schema.name)!==!1?t.tenantField:void 0}));if(a.memoryRoutes.length){o.push(x1(a.memoryRoutes));for(let e of a.memoryRoutes)o.push(b1(e.schema,{access:t.accessEnabled,audit:t.auditEnabled,screenIds:t.screensByEntity?.get(e.schema.name)??[],triggers:t.triggers?.[e.schema.name],tenantField:t.tenantField&&t.tenantScoped?.(e.schema.name)!==!1?t.tenantField:void 0}))}return{files:o,prepared:n.map(e=>e.schema)}}var N1=`3.1.25`,P1=`3.0.22`,F1=(e,t)=>e.some(e=>e.config.kind===t),I1=e=>`activeTab_${e.replace(/[^a-zA-Z0-9_$]/g,`_`)}`,L1=(e,t)=>`${e}-${t}`,R1=e=>`accOpen_${e.replace(/[^a-zA-Z0-9_$]/g,`_`)}`,z1=(e,t)=>`${e}-s${t}`,B1=e=>`md_${e.replace(/[^a-zA-Z0-9]/g,`_`)}_rows`;function V1(e){switch(e.type){case`number`:{let t=e.decimals;return t==null?`{ type: 'number' }`:`{ type: 'number', options: { minimumFractionDigits: ${t}, maximumFractionDigits: ${t} } }`}case`currency`:return`{ type: 'currency', currency: ${$1(e.currency||`USD`)} }`;case`percent`:{let t=[`type: 'percent'`];return e.valueIsPercentPoints&&t.push(`valueIsPercentPoints: true`),e.decimals!=null&&t.push(`options: { minimumFractionDigits: ${e.decimals}, maximumFractionDigits: ${e.decimals} }`),`{ ${t.join(`, `)} }`}case`date`:case`datetime`:return e.pattern?`{ type: '${e.type}', pattern: ${$1(e.pattern)} }`:`{ type: '${e.type}' }`}}function H1(e,t,n,r){if(t.config.kind!==`grid`)return`schemaToColumns(${e})`;let i=t.config,a=t.id.replace(/-/g,`_`),o=i.columns.filter(e=>e.show),s=new Set(o.map(e=>e.field)),c=new Set,l=o.map(e=>{let t=r?.get(e.field);return{c:e,col:t&&!s.has(t)?t:e.field}}).filter(e=>!c.has(e.col)&&!!c.add(e.col)),u=i.editing===`inline`?``:`, editable: false`;if(l.length===0)return u?`schemaToColumns(${e}).map((c) => ({ ...c${u} }))`:`schemaToColumns(${e})`;let d=l.map(e=>`'${e.col}'`),f=l.map(({c:e,col:t})=>{let r=[];return e.header&&r.push(`header: ${JSON.stringify(e.header)}`),e.width!=null&&r.push(`width: ${e.width}`),e.align&&r.push(`align: '${e.align}'`),e.aggregate&&r.push(`aggregate: '${e.aggregate}'`),i.treeData&&e.field===i.treeData.labelField&&n?r.push(`cell: (ctx: CellContext<${n}>) => renderSnippet(treeCell_${a}, { value: ctx.getValue(), row: ctx.row.original })`):e.cellType&&n?r.push(`cell: (ctx: CellContext<${n}>) => renderSnippet(${d0(a,e.field)}, { value: ctx.getValue() })`):e.format&&r.push(`format: ${V1(e.format)}`),r.length?`'${t}': { ${r.join(`, `)} }`:null}).filter(e=>!!e),p=f.length?` const ov: Record<string, Partial<(typeof all)[number]>> = { ${f.join(`, `)} };`:``,m=f.length?`, ...(ov[String(c.field)] ?? {})`:``,h=`[${d.join(`, `)}].map((f) => all.find((c) => c.field === f)).filter((c): c is (typeof all)[number] => !!c)`;return`(() => { const all = schemaToColumns(${e});${p} return ${u||m?`${h}.map((c) => ({ ...c${u}${m} }))`:h} })()`}function U1(e,t){let n=[`grid-column: span ${uZ(e)}`,`min-width: 0`];t&&n.push(t);let r=fZ(e.style);return r&&n.push(r),`style="${n.join(`; `)}"`}var Tre=e=>e&&e.replace(/[^#a-zA-Z0-9(),.%\s_-]/g,``).slice(0,40)||`var(--sg-accent)`;function W1(e,t){let n=[t,lZ(e)].filter(Boolean).join(` `);return n?` class="${n}"`:``}function G1(e){let t=cZ(e.className);return t?` ${t}`:``}function Ere(e){let t=n$(e);if(t===`grid`){let t=BZ(e),n=t.maxWidth?` max-width: ${t.maxWidth}px; margin-inline: auto;`:``;return` .st-screen { grid-template-columns: repeat(12, 1fr); gap: ${t.rowGap}px ${t.colGap}px; align-items: ${t.align};${n} }\n @media (max-width: ${t.mobileBreakpoint}px) { .st-screen { grid-template-columns: 1fr; gap: 12px; } }\n`}if(t===`stack`){let t=VZ(e),n=t.maxWidth?` max-width: ${t.maxWidth}px;${t.align===`center`?` margin-inline: auto;`:``}`:``,r=t.minHeight?`\n .st-stack > * { min-height: ${t.minHeight}px; }`:``,i=t.dividers?`\n .st-stack > * + * { border-top: 1px solid var(--sg-border, #e2e8f0); padding-top: ${t.gap}px; }`:``;return` .st-stack { gap: ${t.gap}px;${n} }${r}${i}\n`}if(t===`canvas`){let t=WZ(e),n=t.showGrid?`\n .st-canvas { background-image: linear-gradient(var(--sg-border, #e6e8ec) 1px, transparent 1px), linear-gradient(90deg, var(--sg-border, #e6e8ec) 1px, transparent 1px); background-size: calc((100% - ${t.cols-1} * ${t.gap}px) / ${t.cols} + ${t.gap}px) calc(${t.rowHeight}px + ${t.gap}px); }`:``;return` .st-canvas { grid-template-columns: repeat(${t.cols}, 1fr); grid-auto-rows: ${t.rowHeight}px; gap: ${t.gap}px; }${n}\n`}return``}function K1(e,t,n,r,i,a={hasRecord:!1}){let o=(e,t)=>a.i18n?`{$t('block.${t}', ${JSON.stringify(e)})}`:e,s=a.pane?`style="height: 100%; min-width: 0; min-height: 0; display: flex; flex-direction: column;"`:U1(r),c=W1(r),l=r.config,u=a.handleNames?.get(r.id),d=u?`${u}.rows`:`allRows`;switch(l.kind){case`grid`:{let t=r.id.replace(/-/g,`_`),o=`columns_${t}`,u=`No ${(e.label??e.name).toLowerCase()} yet.`,d=Dre(l,t);if(l.scheduler){let t=s1(a.rawEntity??e,i);return` <div ${s}${c}>
76265
76265
  ${d.decls} <SvGrid
76266
76266
  data={allRows}
76267
76267
  columns={${o}}
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>SvGrid Studio - Designer</title>
7
- <script type="module" crossorigin src="./assets/index-BB1G1RTR.js"></script>
7
+ <script type="module" crossorigin src="./assets/index-UhFdGGXv.js"></script>
8
8
  <link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-Dd_uD5pT.js">
9
9
  <link rel="modulepreload" crossorigin href="./assets/disclose-version-CIm4S9xS.js">
10
10
  <link rel="modulepreload" crossorigin href="./assets/cell-formatting-JoxA0t65.js">
@@ -16506,7 +16506,7 @@ function hasFieldConditions(schema) {
16506
16506
  *
16507
16507
  * `version.test.ts` asserts this matches `package.json`, so the two cannot drift.
16508
16508
  */
16509
- var SVGRID_VERSION = "3.1.24";
16509
+ var SVGRID_VERSION = "3.1.25";
16510
16510
  /**
16511
16511
  * The version of `@svgrid/grid`, which releases on its own line: enterprise is
16512
16512
  * on 3.1.x while the grid is on 3.0.x.
@@ -131,164 +131,89 @@ export type ReviewJSON = {
131
131
  sets: ChangeSet[];
132
132
  };
133
133
  /**
134
- * What `createReview` returns.
134
+ * What `createReview` returns: the proposals, their groups, the decisions,
135
+ * and what the grid takes (`columns`, `formats`). Every read is reactive.
135
136
  */
136
- export type Review<TData = unknown> = ReturnType<typeof createReview<TData>>;
137
- /**
138
- * Hold writes nobody typed (an agent's edits, an import, an AI helper's
139
- * output) as proposals, grouped by the change they make, and write them only
140
- * when a person accepts them. Give the grid `review.columns(columns)` and
141
- * `review.formats`, and render `<SvReviewPanel {review} />` beside it. Each
142
- * decision is one Ctrl+Z in the grid.
143
- */
144
- export declare function createReview<TData = unknown>(opts: ReviewOptions<TData>): {
137
+ export interface Review<TData = unknown> {
138
+ /** Bumped on every change, for code that caches what it reads. */
145
139
  readonly version: number;
146
140
  /** The wording in effect: English with `messages` laid over it. */
147
- messages: {
148
- title: string;
149
- decided: string;
150
- pendingInGroups: string;
151
- pendingInOneGroup: string;
152
- nothingPending: string;
153
- inConflict: string;
154
- acceptAll: string;
155
- rejectAll: string;
156
- acceptRuleGroups: string;
157
- resolveFirst: string;
158
- onlyRowsWithChanges: string;
159
- confirmAcceptGroup: string;
160
- confirmRejectGroup: string;
161
- confirmAcceptAll: string;
162
- confirmRejectAll: string;
163
- confirmAcceptRules: string;
164
- confirmYes: string;
165
- cancel: string;
166
- conflictsTitle: string;
167
- conflictCell: string;
168
- keep: string;
169
- badgeRule: string;
170
- hintRule: string;
171
- hintMapping: string;
172
- hintFill: string;
173
- hintConstant: string;
174
- hintEach: string;
175
- oneChange: string;
176
- changes: string;
177
- sure: string;
178
- sureRange: string;
179
- accept: string;
180
- reject: string;
181
- acceptGroupLabel: string;
182
- rejectGroupLabel: string;
183
- from: string;
184
- otherValues: string;
185
- sampleOf: string;
186
- everyChange: string;
187
- firstN: string;
188
- showRow: string;
189
- rowId: string;
190
- acceptOne: string;
191
- rejectOne: string;
192
- showAll: string;
193
- keysHint: string;
194
- showInGrid: string;
195
- nextInGrid: string;
196
- hiddenRows: string;
197
- allReviewed: string;
198
- reviewedSummary: string;
199
- reviewedStale: string;
200
- noProposals: string;
201
- noProposalsHint: string;
202
- notWritten: string;
203
- rowField: string;
204
- decidedLabel: string;
205
- noteCellChanged: string;
206
- noteRowGone: string;
207
- noteRowEditing: string;
208
- noteGridNotReady: string;
209
- noteSavedStale: string;
210
- noteConflict: string;
211
- undoHint: string;
212
- announceAccepted: string;
213
- announceRejected: string;
214
- announceStale: string;
215
- announceSkipped: string;
216
- announceCommittedStale: string;
217
- announceNotSaved: string;
218
- announceNothing: string;
219
- undoFailed: string;
220
- redoFailed: string;
221
- cardProposed: string;
222
- proposes: string;
223
- nowValue: string;
224
- empty: string;
225
- labelWhitespace: string;
226
- labelCase: string;
227
- caseUpper: string;
228
- caseLower: string;
229
- caseTitle: string;
230
- caseMixed: string;
231
- labelToNumber: string;
232
- labelDates: string;
233
- datesAsDates: string;
234
- labelShape: string;
235
- labelPunct: string;
236
- punctRemove: string;
237
- punctAdd: string;
238
- punctSpaces: string;
239
- labelDivide: string;
240
- labelMultiply: string;
241
- labelMapping: string;
242
- mappingValues: string;
243
- labelFill: string;
244
- labelFillVarious: string;
245
- labelConstant: string;
246
- labelUnpatterned: string;
247
- };
141
+ readonly messages: ReviewMessages;
248
142
  /** The last undo or redo whose save failed, or null. */
249
143
  readonly lastError: {
250
144
  error: unknown;
251
- during: "undo" | "redo";
145
+ during: 'undo' | 'redo';
252
146
  at: number;
253
147
  } | null;
254
- add: (input: AddInput) => ChangeSet;
255
- get: (id: string) => Proposal | undefined;
256
- proposals: () => Proposal[];
257
- /** What names the proposal's row (`rowLabel`), or null. */
258
- rowLabel: (p: Proposal) => string | null;
148
+ /** Add a change set; a cell that already has a live proposal from another source becomes a conflict. */
149
+ add(input: AddInput): ChangeSet;
150
+ /** One proposal by id. */
151
+ get(id: string): Proposal | undefined;
152
+ /** Every proposal of the session, whatever its status. */
153
+ proposals(): Proposal[];
154
+ /** What names a proposal's row (`rowLabel`), or null. */
155
+ rowLabel(p: Proposal): string | null;
259
156
  /** A field's column header, as the group labels show it. */
260
- fieldLabel: (field: string) => string;
261
- pending: () => Proposal[];
262
- conflicts: () => Proposal[];
263
- groups: () => ProposalGroup[];
264
- pendingFor: (rowId: string, field: string) => Proposal | undefined;
265
- accept: (ids: ReadonlyArray<string>) => Promise<ReviewOutcome>;
266
- reject: (ids: ReadonlyArray<string>) => ReviewOutcome;
267
- acceptGroup: (key: string, shownIds: ReadonlyArray<string>) => Promise<ReviewOutcome>;
268
- rejectGroup: (key: string, shownIds: ReadonlyArray<string>) => ReviewOutcome;
269
- resolveConflict: (keepId: string) => void;
157
+ fieldLabel(field: string): string;
158
+ /** The proposals waiting for a decision. */
159
+ pending(): Proposal[];
160
+ /** The proposals two sources disagree on, to settle with `resolveConflict`. */
161
+ conflicts(): Proposal[];
162
+ /** The pending proposals grouped by the change they make, the groups that need a person first. */
163
+ groups(): ProposalGroup[];
164
+ /** The pending proposal for one cell, if there is one. */
165
+ pendingFor(rowId: string, field: string): Proposal | undefined;
166
+ /** Write these proposals: checks each cell still holds `before`, before and after `onCommit`. One undo step. */
167
+ accept(ids: ReadonlyArray<string>): Promise<ReviewOutcome>;
168
+ /** Decide against these proposals; nothing is written. One undo step. */
169
+ reject(ids: ReadonlyArray<string>): ReviewOutcome;
170
+ /** Accept a group, limited to the ids the person was shown, so a proposal added since is not decided unseen. */
171
+ acceptGroup(key: string, shownIds: ReadonlyArray<string>): Promise<ReviewOutcome>;
172
+ /** Reject a group, limited to the ids the person was shown. */
173
+ rejectGroup(key: string, shownIds: ReadonlyArray<string>): ReviewOutcome;
174
+ /** Keep one of a cell's conflicting proposals (it becomes pending) and reject the rest, as one undo step. */
175
+ resolveConflict(keepId: string): void;
176
+ /** `conditionalFormats` for the grid: pending cells tinted, conflicting cells marked, the row "Show in grid" lands on lit. */
270
177
  readonly formats: ConditionalFormat<any>[];
271
- columns: <C extends ReadonlyArray<any>>(cols: C) => C;
272
- reveal: (ids: ReadonlyArray<string>, fromId?: string) => {
178
+ /** The grid's columns with the proposed value drawn in each pending cell. */
179
+ columns<C extends ReadonlyArray<any>>(cols: C): C;
180
+ /** Show the next proposal of `ids` after `fromId` in the grid, on whatever page it is. */
181
+ reveal(ids: ReadonlyArray<string>, fromId?: string): {
273
182
  id: string | null;
274
183
  hidden: number;
275
184
  };
276
- showPendingOnly: (on: boolean) => void;
277
- /** On while our condition is in the grid's advanced filter (the grid's own Clear takes it out too). */
185
+ /** Show only rows with a pending or conflicting proposal, on top of the user's own filters. */
186
+ showPendingOnly(on: boolean): void;
187
+ /** Whether `showPendingOnly` is on (the grid's own Clear turns it off too). */
278
188
  readonly pendingOnly: boolean;
279
- toJSON: (opts?: {
189
+ /** Every set with its proposals and their status, as plain JSON; `setIds` exports only some. */
190
+ toJSON(opts?: {
280
191
  setIds?: ReadonlyArray<string>;
281
- }) => ReviewJSON;
282
- load: (json: ReviewJSON) => {
192
+ }): ReviewJSON;
193
+ /** Replace everything with an export; returns how many malformed proposals were dropped. */
194
+ load(json: ReviewJSON): {
283
195
  dropped: number;
284
196
  };
285
- merge: (json: ReviewJSON) => {
197
+ /** Add the sets of an export, keeping what is here; returns how many were dropped. */
198
+ merge(json: ReviewJSON): {
286
199
  dropped: number;
287
200
  };
288
- log: () => Proposal[];
289
- revertSet: (setId: string) => ChangeSet | null;
290
- sets: () => Array<Omit<ChangeSet, "proposals"> & {
201
+ /** Every decided proposal (accepted, rejected or stale), oldest decision first. */
202
+ log(): Proposal[];
203
+ /** Propose undoing what a set wrote, as a new set to review; null when nothing of it was accepted. */
204
+ revertSet(setId: string): ChangeSet | null;
205
+ /** The sets in this review, newest last, without their proposals. */
206
+ sets(): Array<Omit<ChangeSet, 'proposals'> & {
291
207
  count: number;
292
208
  }>;
293
- clear: () => void;
294
- };
209
+ /** Forget every proposal and set. */
210
+ clear(): void;
211
+ }
212
+ /**
213
+ * Hold writes nobody typed (an agent's edits, an import, an AI helper's
214
+ * output) as proposals, grouped by the change they make, and write them only
215
+ * when a person accepts them. Give the grid `review.columns(columns)` and
216
+ * `review.formats`, and render `<SvReviewPanel {review} />` beside it. Each
217
+ * decision is one Ctrl+Z in the grid.
218
+ */
219
+ export declare function createReview<TData = unknown>(opts: ReviewOptions<TData>): Review<TData>;
package/dist/version.d.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * `version.test.ts` asserts this matches `package.json`, so the two cannot drift.
12
12
  */
13
- export declare const SVGRID_VERSION = "3.1.24";
13
+ export declare const SVGRID_VERSION = "3.1.25";
14
14
  /**
15
15
  * The version of `@svgrid/grid`, which releases on its own line: enterprise is
16
16
  * on 3.1.x while the grid is on 3.0.x.
package/dist/version.js CHANGED
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * `version.test.ts` asserts this matches `package.json`, so the two cannot drift.
12
12
  */
13
- export const SVGRID_VERSION = '3.1.24';
13
+ export const SVGRID_VERSION = '3.1.25';
14
14
  /**
15
15
  * The version of `@svgrid/grid`, which releases on its own line: enterprise is
16
16
  * on 3.1.x while the grid is on 3.0.x.
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "type": "commercial",
5
5
  "url": "https://svgrid.com/pricing"
6
6
  },
7
- "version": "3.1.24",
7
+ "version": "3.1.25",
8
8
  "description": "Enterprise feature pack for SvGrid: the server-side row model (lazy grouping, tree, pivot, transactions, selection across unloaded rows), Excel (xlsx) and PDF export, Excel/CSV/JSON import, pivot tables with a drag-and-drop designer, paginated print, Kanban board and scheduler renderers, no-code alerts and batch editing. CSV, TSV and JSON export are already free in @svgrid/grid. Requires a paid license key.",
9
9
  "license": "SEE LICENSE IN LICENSE",
10
10
  "author": "jQWidgets <sales@jqwidgets.com>",