@khester/create-dynamics-app 3.3.0 → 3.4.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/artifacts/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAGlB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AA8JpB;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,kBAAkB,EA2hBzC,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEtE;AAED,wBAAgB,kBAAkB,IAAI,kBAAkB,EAAE,CAEzD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAW1E,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/artifacts/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAGlB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AA8JpB;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,kBAAkB,EA4hBzC,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEtE;AAED,wBAAgB,kBAAkB,IAAI,kBAAkB,EAAE,CAEzD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAW1E,CAAC"}
@@ -458,8 +458,9 @@ export const ARTIFACTS = [
458
458
  id: 'grid-customizer',
459
459
  label: '🧩 Grid Customizer — PowerAppsOneGrid cell renderers (PCF virtual, Fluent v8)',
460
460
  description: 'Grid customizer (PCF virtual control, React 16 + Fluent v8): registers cellRendererOverrides ' +
461
- 'with Microsoft’s editable grid via factory.fireEvent — status badges, signed currency, ' +
462
- 'yes/no ticks, per-column progress bars. Ships a stand-in-grid dev harness (mock + live org).',
461
+ 'AND cellEditorOverrides with Microsoft’s editable grid via factory.fireEvent — status ' +
462
+ 'badges, signed currency, yes/no ticks, per-column progress bars, and a clamped numeric ' +
463
+ 'editor. Ships a stand-in-grid dev harness (mock + live org) with an edit mode.',
463
464
  templateDir: 'grid-customizer',
464
465
  supportsLibraryChoice: false,
465
466
  // NOT `['token']`. Same reasoning as the PCF artifacts: that dev-tool writes an
@@ -483,7 +484,7 @@ export const ARTIFACTS = [
483
484
  // It is now a control-type="virtual" PCF control on the platform-served React 16.14.0
484
485
  // + Fluent 8.121.1, in the nested `<componentName>/` layout, with pcfconfig.json,
485
486
  // featureconfig.json and .eslintrc.json.
486
- templateVersion: '3.0.0',
487
+ templateVersion: '3.1.0',
487
488
  available: true,
488
489
  },
489
490
  {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/artifacts/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/artifacts/registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@khester/create-dynamics-app",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "license": "MIT",
5
5
  "description": "Unified CLI to scaffold Dynamics 365 / Power Platform artifacts",
6
6
  "main": "dist/index.js",
@@ -26,7 +26,7 @@
26
26
  "clean": "rimraf dist tsconfig.tsbuildinfo"
27
27
  },
28
28
  "dependencies": {
29
- "@dataverse-kit/export-engine": "^1.33.0",
29
+ "@dataverse-kit/export-engine": "^1.34.1",
30
30
  "@khester/dynamics-ui-components": "^1.0.0",
31
31
  "chalk": "^5.3.0",
32
32
  "commander": "^11.1.0",
@@ -24,7 +24,9 @@ npm run build # pcf-scripts build → out/controls/{{componentName}}/
24
24
 
25
25
  `npm start` (the stock `pcf-scripts` harness) will load the control and show a **blank
26
26
  canvas**. That is correct, not a bug: the harness has no OneGrid, so nothing ever calls the
27
- overrides. `npm run dev` runs a stand-in grid that calls them exactly as the platform does.
27
+ overrides. `npm run dev` runs a stand-in grid that calls the RENDERER overrides exactly as the platform
28
+ does. (Edit mode dispatches the editor overrides by the same rules, but commit fidelity is
29
+ unverified — see Edit mode below.)
28
30
 
29
31
  ## Local development
30
32
 
@@ -51,6 +53,23 @@ never exposed to the browser bundle. See `env.local.example` for the full contra
51
53
  > the type from a sample value would exercise the wrong handler, so the harness reads the
52
54
  > real `AttributeType` — the same classification the platform uses.
53
55
 
56
+ ### Edit mode — exercising `cellEditorOverrides`
57
+
58
+ Tick **Edit mode** in the harness panel, then **double-click a cell**. The stand-in grid
59
+ dispatches editors by exactly the same rules as renderers: keyed by `ColumnDataType`, narrowed
60
+ inside the handler, and `undefined` means *use the platform's editor* rather than *render
61
+ nothing*.
62
+
63
+ With the shipped config nothing is opted in, so every cell falls through to a plain input — put
64
+ a column logical name in **Progress columns** and that column's `Decimal` cells become the
65
+ clamped `SpinButton` from `CellEditorOverrides.tsx` instead.
66
+
67
+ > ⚠️ **What edit mode does NOT prove.** The platform owns commit. This harness treats
68
+ > `defaultProps.onChange` as authoritative and writes straight to its own row data; a real grid
69
+ > also has `editorParams.onCellValueChanged` and `stopEditing`, and which of those actually
70
+ > persists a value to Dataverse has not been verified against a live editable grid. Edit mode
71
+ > proves your editor is *reached, keyed and narrowed* correctly — not that the write lands.
72
+
54
73
  ## Customizing it
55
74
 
56
75
  | File | What it is for |
@@ -58,7 +77,7 @@ never exposed to the browser bundle. See `env.local.example` for the full contra
58
77
  | `{{componentName}}/customizers/config.ts` | **Start here.** Status colours, which columns get progress bars, currency colours. |
59
78
  | `{{componentName}}/customizers/cells.tsx` | What each custom cell looks like. |
60
79
  | `{{componentName}}/customizers/CellRendererOverrides.tsx` | Which data type maps to which cell, and how to scope one to a single column. |
61
- | `{{componentName}}/customizers/CellEditorOverrides.tsx` | Edit-mode overrides. Empty by default — the built-in editors are good. |
80
+ | `{{componentName}}/customizers/CellEditorOverrides.tsx` | Edit-mode overrides. Only `Decimal` is registered, and only for your **Progress columns** — inert until you opt one in, because an editor *writes*. |
62
81
  | `{{componentName}}/types.ts` | The platform contract. Vendored: Microsoft ships no package for it. |
63
82
 
64
83
  Three rules the compiler cannot enforce for you:
@@ -1,9 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import type {
3
+ CellEditorOverrides,
4
+ CellEditorProps,
3
5
  CellRendererOverrides,
4
6
  CellRendererProps,
5
7
  ColumnDataType,
6
8
  ColumnDefinition,
9
+ GetEditorParams,
7
10
  GetRendererParams,
8
11
  } from '../../{{componentName}}/types';
9
12
 
@@ -20,8 +23,23 @@ import type {
20
23
  *
21
24
  * If a renderer works here and not in the org, the difference is the platform (versions,
22
25
  * bindings, publish state) — not the contract. It deliberately does NOT reimplement sorting,
23
- * filtering, selection, paging or inline editing: the real grid owns all of those, and a
24
- * fake one that drifted from them would be worse than none.
26
+ * filtering, selection or paging: the real grid owns all of those, and a fake one that drifted
27
+ * from them would be worse than none.
28
+ *
29
+ * ★ It DOES reimplement just enough inline editing to invoke `cellEditorOverrides`, because
30
+ * without it that half of the contract had never been executed anywhere — the map shipped
31
+ * empty, the only example lived in a docblock, and "it typechecks" was the whole of its
32
+ * coverage. Edit mode dispatches editors by the same rules as renderers:
33
+ * - keyed by `ColumnDataType`, never by column name;
34
+ * - `(CellEditorProps, GetEditorParams)`, with `colDefs` + `columnIndex` for narrowing;
35
+ * - `undefined` means "use the platform's own editor", NOT "render nothing".
36
+ * ⚠️ The double-click GESTURE is the harness's own invention — the platform also has a
37
+ * type-to-edit path that seeds `charPress`, which this never populates.
38
+ *
39
+ * ⚠️ What it CANNOT tell you: whether the real grid commits the value the way this does. The
40
+ * platform owns commit (`onChange` vs `onCellValueChanged` vs `stopEditing`) and none of that
41
+ * is observable here. Edit mode proves the map is reached, keyed and narrowed correctly; it
42
+ * does not prove a write lands in Dataverse.
25
43
  */
26
44
 
27
45
  /** One column of the fake grid: the platform's `ColumnDefinition` plus a display width. */
@@ -30,6 +48,8 @@ export interface HarnessColumn {
30
48
  displayName: string;
31
49
  dataType: ColumnDataType;
32
50
  width?: number;
51
+ /** Per-column editability. The platform sets this from metadata/security, not per grid. */
52
+ editable?: boolean;
33
53
  }
34
54
 
35
55
  /** One cell: the raw value the platform would pass, and the text it would have painted. */
@@ -47,6 +67,18 @@ export interface MockGridProps {
47
67
  overrides: CellRendererOverrides;
48
68
  /** Row height in px — the real grid gives cells a fixed height, so mirror that. */
49
69
  rowHeight?: number;
70
+ /** Editor map to dispatch when a cell is being edited. Omit for a read-only grid. */
71
+ editorOverrides?: CellEditorOverrides;
72
+ /** Turn inline editing on. Without it the grid behaves exactly as it always has. */
73
+ editable?: boolean;
74
+ /** Commit handler — the harness owns the row data, as the platform owns the record. */
75
+ onCellCommit?: (rowIndex: number, columnName: string, next: unknown) => void;
76
+ }
77
+
78
+ /** Which cell is open for editing. */
79
+ interface EditTarget {
80
+ rowIndex: number;
81
+ columnIndex: number;
50
82
  }
51
83
 
52
84
  const ROW_HEIGHT = 42;
@@ -68,7 +100,26 @@ export const MockGrid: React.FC<MockGridProps> = ({
68
100
  rows,
69
101
  overrides,
70
102
  rowHeight = ROW_HEIGHT,
103
+ editorOverrides,
104
+ editable = false,
105
+ onCellCommit,
71
106
  }) => {
107
+ const [editing, setEditing] = React.useState<EditTarget | null>(null);
108
+ // Leaving edit mode must also close any open editor, or the cell stays stuck in an editor
109
+ // the grid no longer considers editable.
110
+ React.useEffect(() => {
111
+ if (!editable) setEditing(null);
112
+ }, [editable]);
113
+ // ★ `editing` is a pair of INDICES. If the recordset is swapped underneath it (Mock↔Live, a
114
+ // reload, a different $select) the same indices address a different record and a commit would
115
+ // write into it. Close the editor whenever that happens.
116
+ //
117
+ // Keyed on `columns`, NOT `rows`: the harness replaces the columns array on every dataset
118
+ // change, while a COMMIT replaces the rows array too — so depending on `rows` would close the
119
+ // editor after every single edit, which is a worse bug than the one being fixed.
120
+ React.useEffect(() => {
121
+ setEditing(null);
122
+ }, [columns]);
72
123
  // Built once per render and shared by every cell, exactly as the grid does — a handler
73
124
  // that inspects sibling columns sees the same array the platform would give it.
74
125
  const colDefs: ColumnDefinition[] = columns.map((c, i) => ({
@@ -110,12 +161,15 @@ export const MockGrid: React.FC<MockGridProps> = ({
110
161
  {columns.map((col, columnIndex) => {
111
162
  const cell = row[col.name] ?? { raw: undefined, formatted: '' };
112
163
 
164
+ const isEditing =
165
+ editing?.rowIndex === rowIndex && editing?.columnIndex === columnIndex;
166
+
113
167
  const props: CellRendererProps = {
114
168
  value: cell.raw,
115
169
  formattedValue: cell.formatted,
116
170
  columnDataType: col.dataType,
117
171
  rowHeight,
118
- columnEditable: false,
172
+ columnEditable: editable && (col.editable ?? true),
119
173
  isRightAligned:
120
174
  col.dataType === 'Currency' ||
121
175
  col.dataType === 'Decimal' ||
@@ -135,9 +189,82 @@ export const MockGrid: React.FC<MockGridProps> = ({
135
189
  const handler = overrides[col.dataType];
136
190
  const custom = handler ? handler(props, params) : undefined;
137
191
 
192
+ let content: React.ReactNode;
193
+ if (isEditing) {
194
+ const stopEditing = (): void => setEditing(null);
195
+ const commit = (next: unknown): void => {
196
+ onCellCommit?.(rowIndex, col.name, next);
197
+ };
198
+ const editorProps: CellEditorProps = {
199
+ value: cell.raw,
200
+ rowHeight,
201
+ columnDataType: col.dataType,
202
+ isRequired: false,
203
+ charPress: null,
204
+ // The documented commit path. The harness treats it as authoritative and
205
+ // writes straight through to the row data.
206
+ onChange: commit,
207
+ };
208
+ const editorParams: GetEditorParams = {
209
+ colDefs,
210
+ columnIndex,
211
+ // Part of the contract. Wired so a handler that calls it is not a crash,
212
+ // but the harness commits on onChange — see the file header.
213
+ onCellValueChanged: commit,
214
+ rowData: { __rec_id: String(rowIndex) },
215
+ stopEditing,
216
+ };
217
+ const editorHandler = editorOverrides?.[col.dataType];
218
+ const customEditor = editorHandler
219
+ ? editorHandler(editorProps, editorParams)
220
+ : undefined;
221
+
222
+ content = (
223
+ // ★ Guarded blur. Un-guarded, React's bubbling onBlur tears the editor down
224
+ // on ANY internal focus move — and Fluent's SpinButton blurs its input when
225
+ // you mousedown an arrow, so a single click would apply one step and close.
226
+ <div
227
+ onBlur={(e) => {
228
+ if (!e.currentTarget.contains(e.relatedTarget as Node | null)) stopEditing();
229
+ }}
230
+ ref={(el) => {
231
+ // Focus the custom editor on open; only the fallback input self-focuses.
232
+ if (el && !el.contains(document.activeElement)) {
233
+ el.querySelector<HTMLElement>('input, [tabindex]')?.focus();
234
+ }
235
+ }}
236
+ >
237
+ {/* ★ undefined => the PLATFORM's editor, not an empty cell. The stand-in
238
+ for that is a plain input, which is what the grid falls back to. */}
239
+ {customEditor ?? (
240
+ <input
241
+ autoFocus
242
+ defaultValue={cell.formatted}
243
+ // ★ Commits on BLUR as well as Enter. The real grid commits its
244
+ // built-in editors on blur, and this input stands in for those — if it
245
+ // discarded on blur it would model the platform backwards on the one
246
+ // gesture a user makes constantly.
247
+ onBlur={(e) => commit(e.target.value)}
248
+ onKeyDown={(e) => {
249
+ if (e.key === 'Enter') commit((e.target as HTMLInputElement).value);
250
+ if (e.key === 'Escape') stopEditing();
251
+ if (e.key === 'Enter') stopEditing();
252
+ }}
253
+ style={{ width: '100%', font: 'inherit', boxSizing: 'border-box' }}
254
+ />
255
+ )}
256
+ </div>
257
+ );
258
+ } else {
259
+ // ★ null/undefined => the grid's own rendering, not an empty cell.
260
+ content = custom ?? cell.formatted;
261
+ }
262
+
138
263
  return (
139
264
  <td
140
265
  key={col.name}
266
+ onDoubleClick={editable ? () => setEditing({ rowIndex, columnIndex }) : undefined}
267
+ title={editable && !isEditing ? 'Double-click to edit' : undefined}
141
268
  style={{
142
269
  height: rowHeight,
143
270
  padding: '0 8px',
@@ -146,13 +273,13 @@ export const MockGrid: React.FC<MockGridProps> = ({
146
273
  overflow: 'hidden',
147
274
  textOverflow: 'ellipsis',
148
275
  whiteSpace: 'nowrap',
276
+ cursor: editable && !isEditing ? 'cell' : undefined,
149
277
  // The real grid right-aligns numerics itself; a custom renderer that
150
278
  // returns undefined must therefore still land in the default layout.
151
- textAlign: props.isRightAligned && !custom ? 'right' : 'left',
279
+ textAlign: props.isRightAligned && !custom && !isEditing ? 'right' : 'left',
152
280
  }}
153
281
  >
154
- {/* ★ null/undefined => the grid's own rendering, not an empty cell. */}
155
- {custom ?? cell.formatted}
282
+ {content}
156
283
  </td>
157
284
  );
158
285
  })}
@@ -10,6 +10,7 @@ import {
10
10
  type HarnessField,
11
11
  } from '@dataverse-kit/pcf-dev-harness/shell';
12
12
  import { createCellRendererOverrides } from '../{{componentName}}/customizers/CellRendererOverrides';
13
+ import { createCellEditorOverrides } from '../{{componentName}}/customizers/CellEditorOverrides';
13
14
  import { MockGrid, type HarnessColumn, type HarnessRow } from './harness/MockGrid';
14
15
  import { fetchGridData, type HttpError } from './harness/dataverse';
15
16
 
@@ -132,23 +133,52 @@ const Harness: React.FC = () => {
132
133
  'percentcomplete',
133
134
  );
134
135
 
136
+ // Edit mode is persisted like the other knobs so a reload keeps you in the editor path.
137
+ const [editable, setEditable] = usePersistedState('editable', false);
138
+
135
139
  const [columns, setColumns] = React.useState<HarnessColumn[]>(MOCK_COLUMNS);
136
140
  const [rows, setRows] = React.useState<HarnessRow[]>(MOCK_ROWS);
137
141
  const [liveStatus, setLiveStatus] = React.useState<React.ReactNode>(null);
138
142
 
139
143
  // The real override map, rebuilt only when the progress-column list changes. This is the
140
144
  // same factory index.ts calls — the harness never forks the renderers.
141
- const overrides = React.useMemo(
145
+ // ★ Parsed ONCE and shared. Two copies of this split/trim/filter could drift, which would
146
+ // silently retarget the renderers and the editors at different columns.
147
+ const progressColumnList = React.useMemo(
142
148
  () =>
143
- createCellRendererOverrides({
144
- progressColumns: progressColumns
145
- .split(',')
146
- .map((s) => s.trim())
147
- .filter(Boolean),
148
- }),
149
+ progressColumns
150
+ .split(',')
151
+ .map((s) => s.trim())
152
+ .filter(Boolean),
149
153
  [progressColumns],
150
154
  );
151
155
 
156
+ const overrides = React.useMemo(
157
+ () => createCellRendererOverrides({ progressColumns: progressColumnList }),
158
+ [progressColumnList],
159
+ );
160
+
161
+ // ★ The customizer's REAL editor map, from the same factory index.ts calls and retargeted at
162
+ // the same columns as the renderers — so the harness never forks the editors either.
163
+ const editorOverrides = React.useMemo(
164
+ () => createCellEditorOverrides({ progressColumns: progressColumnList }),
165
+ [progressColumnList],
166
+ );
167
+
168
+ /** Commit an edited cell back into the harness's row data — the platform owns the record. */
169
+ const onCellCommit = React.useCallback(
170
+ (rowIndex: number, columnName: string, next: unknown): void => {
171
+ setRows((prev) =>
172
+ prev.map((row, i) =>
173
+ i === rowIndex
174
+ ? { ...row, [columnName]: { raw: next, formatted: next === null || next === undefined ? '' : String(next) } }
175
+ : row,
176
+ ),
177
+ );
178
+ },
179
+ [],
180
+ );
181
+
152
182
  // On reload with a restored Live selection: clear and prompt for Load — or fall back to
153
183
  // Mock when this session has no org configured. Runs once on mount.
154
184
  React.useEffect(() => {
@@ -250,9 +280,25 @@ const Harness: React.FC = () => {
250
280
  value: progressColumns,
251
281
  onChange: setProgressColumns,
252
282
  },
283
+ {
284
+ // ★ The only way to reach `cellEditorOverrides` at all. With it off the grid is
285
+ // read-only and that half of the customizer contract never executes — which is
286
+ // exactly the state this template shipped in until edit mode existed.
287
+ kind: 'boolean',
288
+ label: 'Edit mode (double-click a cell) — exercises cellEditorOverrides',
289
+ value: editable,
290
+ onChange: setEditable,
291
+ },
253
292
  ]}
254
293
  >
255
- <MockGrid columns={columns} rows={rows} overrides={overrides} />
294
+ <MockGrid
295
+ columns={columns}
296
+ rows={rows}
297
+ overrides={overrides}
298
+ editorOverrides={editorOverrides}
299
+ editable={editable}
300
+ onCellCommit={onCellCommit}
301
+ />
256
302
  </HarnessShell>
257
303
  );
258
304
  };
@@ -1,38 +1,107 @@
1
- import type { CellEditorOverrides } from '../types';
1
+ import * as React from 'react';
2
+ import { SpinButton } from '@fluentui/react';
3
+ import type { CellEditorOverrides, CellEditorProps, GetEditorParams } from '../types';
4
+ import { PROGRESS_COLUMNS, PROGRESS_MAX, toNumber } from './config';
2
5
 
3
6
  /**
4
7
  * Cell EDITOR overrides — what a cell becomes when the user starts editing it.
5
8
  *
6
- * Empty by default: OneGrid's built-in editors already handle every column type correctly,
7
- * including the lookup search and option-set pickers that are genuinely hard to reimplement.
8
- * Override only where the default is wrong for your data.
9
- *
10
9
  * The keys and the fall-through rule are identical to `CellRendererOverrides`: key by
11
10
  * `ColumnDataType`, narrow to a column with `editorParams.colDefs[editorParams.columnIndex]`,
12
11
  * and return `undefined` to keep the platform editor.
13
12
  *
14
- * A worked example — clamp a percentage column to 0–100:
15
- *
16
- * ```tsx
17
- * import * as React from 'react';
18
- * import { SpinButton } from '@fluentui/react';
13
+ * ★ Override editors SPARINGLY. OneGrid's built-ins already handle every column type, including
14
+ * the lookup search and option-set pickers that are genuinely hard to reimplement — and unlike a
15
+ * renderer, a wrong editor WRITES BAD DATA rather than merely looking wrong. Only `Decimal` is
16
+ * registered here, and only for the columns you opt in.
19
17
  *
20
- * export const cellEditorOverrides: CellEditorOverrides = {
21
- * Decimal: (defaultProps, editorParams) => {
22
- * const name = editorParams.colDefs[editorParams.columnIndex]?.name;
23
- * if (name !== 'dvk_percentcomplete') return undefined;
24
- * return (
25
- * <SpinButton
26
- * min={0}
27
- * max={100}
28
- * step={5}
29
- * defaultValue={String(defaultProps.value ?? 0)}
30
- * // Commit through onChange; the grid writes the value back to the record.
31
- * onChange={(_e, v) => defaultProps.onChange(Number(v ?? 0))}
32
- * />
33
- * );
34
- * },
35
- * };
36
- * ```
18
+ * ⚠️ **Runtime coverage is LOCAL only.** This map is exercised by the dev harness (`npm run dev`
19
+ * → Edit mode) and by a unit test that invokes it. It has NOT been driven by a real editable
20
+ * grid in an org: doing that needs a live editable subgrid, and the customizer contract's commit
21
+ * semantics (`onChange` vs `editorParams.onCellValueChanged` vs `stopEditing`) are therefore
22
+ * UNVERIFIED here. This file calls `defaultProps.onChange` because it is the only value-carrying
23
+ * callback on `CellEditorProps` — **not** because Microsoft documents it; their editable-grid
24
+ * page has no editor sample, and their own reference control returns `null`. If you hit a commit
25
+ * that does not stick in an org, that is the first thing to re-check — and please record the
26
+ * answer here.
37
27
  */
38
- export const cellEditorOverrides: CellEditorOverrides = {};
28
+
29
+ /** Per-instance knobs, mirroring `RendererOptions` so the harness can retarget the same map. */
30
+ export interface EditorOptions {
31
+ /**
32
+ * Columns that get the clamped numeric editor. Defaults to `config.PROGRESS_COLUMNS` — the
33
+ * SAME list that drives the progress-bar renderer, so a column shown as a 0–100 bar is also
34
+ * edited as one, instead of as a free-text decimal that can be set to 900.
35
+ */
36
+ progressColumns?: readonly string[];
37
+ }
38
+
39
+ /** The column logical name for the cell currently being edited. */
40
+ function columnName(params: GetEditorParams): string | undefined {
41
+ return params.colDefs[params.columnIndex]?.name;
42
+ }
43
+
44
+ /** Build the editor map. `cellEditorOverrides` below is the configured singleton. */
45
+ export function createCellEditorOverrides(options: EditorOptions = {}): CellEditorOverrides {
46
+ const progressColumns = options.progressColumns ?? PROGRESS_COLUMNS;
47
+
48
+ return {
49
+ // ★ Same per-column narrowing as the Decimal RENDERER. `PROGRESS_COLUMNS` is empty by
50
+ // default, so a scaffold that has not been configured registers this handler and then
51
+ // falls through on every cell — the editor path is inert until you opt a column in, which
52
+ // is the conservative default for something that writes.
53
+ Decimal: (defaultProps: CellEditorProps, editorParams: GetEditorParams) => {
54
+ const name = columnName(editorParams);
55
+ if (!name || !progressColumns.includes(name)) return undefined;
56
+
57
+ const current = toNumber(defaultProps.value) ?? 0;
58
+ const clamp = (n: number): number => Math.min(PROGRESS_MAX, Math.max(0, n));
59
+
60
+ // ★ Commit through `onChange` ONLY.
61
+ //
62
+ // Do not add `onValidate`: Fluent v8's SpinButton calls `onValidate(entered)` and then
63
+ // feeds the result through `useControllableValue`, which calls `onChange` as well — so a
64
+ // single committed edit fires this twice (measured: typing 900 then blurring commits
65
+ // [100, 100]; junk input commits the unchanged value twice). Fluent's built-in validation
66
+ // already clamps to `min`/`max`, so the clamp below is defence-in-depth, not the mechanism.
67
+ //
68
+ // Nor `editorParams.onCellValueChanged` — that is a separate member of the contract and
69
+ // firing both risks the same double write.
70
+ //
71
+ // ⚠️ Why `onChange` and not one of the others: it is the ONLY value-carrying callback on
72
+ // `CellEditorProps` (see ../types.ts). Microsoft's editable-grid page documents no editor
73
+ // sample at all — their own PowerAppsGridCustomizerControl ships `return null` — so this
74
+ // is inference from the type, not a documented guarantee. See the header caveat.
75
+ // ⚠️ `packages/export-engine`'s PA-grid emitter uses a DIFFERENT convention for the same
76
+ // undocumented contract (`onChange` followed by `editorParams.stopEditing()`, and empty →
77
+ // `onChange(null)`). They disagree; whoever verifies against a live editable grid should
78
+ // settle both at once.
79
+ const commit = (raw?: string): void => {
80
+ // Empty means "clear the cell", not "re-commit what was there" — matching the
81
+ // export-engine emitter. Without this a user can never blank an opted-in column.
82
+ if (raw !== undefined && raw.trim() === '') {
83
+ defaultProps.onChange(null);
84
+ return;
85
+ }
86
+ const parsed = toNumber(raw);
87
+ defaultProps.onChange(clamp(parsed === undefined ? current : parsed));
88
+ };
89
+
90
+ return (
91
+ <SpinButton
92
+ min={0}
93
+ max={PROGRESS_MAX}
94
+ step={5}
95
+ defaultValue={String(current)}
96
+ // Fires once, on a COMMITTED edit (blur / Enter / arrow) — v8 holds an uncommitted
97
+ // `intermediateValue` while typing, so this is not per-keystroke.
98
+ onChange={(_e, v) => commit(v)}
99
+ styles={{ root: { minWidth: 0, width: '100%' } }}
100
+ />
101
+ );
102
+ },
103
+ };
104
+ }
105
+
106
+ /** What the control registers with the grid — see `index.ts`. */
107
+ export const cellEditorOverrides: CellEditorOverrides = createCellEditorOverrides();
@@ -47,6 +47,112 @@ export async function readField(
47
47
  };
48
48
  }
49
49
 
50
+ /** One choice, in the UPPERCASE shape the live PCF `attributes.Options` API uses. */
51
+ export interface ChoiceOption {
52
+ Value: number;
53
+ Label: string;
54
+ }
55
+
56
+ /**
57
+ * Read the REAL choice metadata for a column, so a live option-set value renders its actual
58
+ * label instead of falling back to the Dropdown's placeholder.
59
+ *
60
+ * ★ Why this exists: the harness used to hand the control a hard-coded `Options: [1, 2, 3]`.
61
+ * Reading a real value like `100000002` then matched nothing, so the *read* was correct (the
62
+ * status line proved it) while the *rendered label* was blank — which looks exactly like a
63
+ * broken control. Verified against `dvk_devitem.dvk_status`, whose real options are
64
+ * 100000000/Draft, 100000001/Active, 100000002/Done.
65
+ *
66
+ * Three round trips, on each Load (not at mount):
67
+ * 1. entity SET name → entity LOGICAL name (`EntityDefinitions?$filter=EntitySetName eq …`)
68
+ * — the binding gives us the plural set name, but the metadata tree is keyed by logical name.
69
+ * 2. the attribute's `AttributeTypeName` — which decides the cast in step 3. Guessing instead
70
+ * costs the same number of calls in the worst case and fails non-deterministically.
71
+ * 3. the typed cast, with `OptionSet` expanded.
72
+ *
73
+ * ★ The cast is NOT always `PicklistAttributeMetadata`. A `statuscode` column is
74
+ * `StatusAttributeMetadata` and `statecode` is `StateAttributeMetadata`; asking for the Picklist
75
+ * cast on `account.statuscode` returns **404**, not an empty option list — so a single hard-coded
76
+ * cast silently yields no labels on exactly the columns most likely to be bound.
77
+ *
78
+ * Returns `null` for any column that has no choices (a String column, say) or when metadata is
79
+ * unreadable — the caller then keeps its mock options, which is the right behaviour for a
80
+ * harness: never fail the whole panel because one metadata lookup didn't apply.
81
+ */
82
+ export async function readChoiceOptions(
83
+ entitySetName: string,
84
+ column: string,
85
+ ): Promise<ChoiceOption[] | null> {
86
+ // OData string literals escape a quote by doubling it; the result is then URL-encoded
87
+ // because both of these are free-text harness inputs and a stray `#` would truncate the
88
+ // request at the fragment, yielding a 400 the caller can only read as "no choices".
89
+ // (`%24` for `$` is cosmetic consistency with the rest of this file — `readField` above
90
+ // uses a raw `$select` and works fine; there is no shell in the browser→proxy→org path.)
91
+ const setName = encodeURIComponent(entitySetName.replace(/'/g, "''"));
92
+ const defs = await apiFetch(
93
+ `/api/data/v9.2/EntityDefinitions?%24select=LogicalName&%24filter=EntitySetName%20eq%20'${setName}'`,
94
+ );
95
+ if (!defs.ok) return null;
96
+ const logicalName = ((await defs.json()) as { value?: { LogicalName: string }[] }).value?.[0]
97
+ ?.LogicalName;
98
+ if (!logicalName) return null;
99
+
100
+ const safeColumn = encodeURIComponent(column.replace(/'/g, "''"));
101
+ const attrPath = `/api/data/v9.2/EntityDefinitions(LogicalName='${logicalName}')/Attributes(LogicalName='${safeColumn}')`;
102
+ const typeRes = await apiFetch(`${attrPath}?%24select=AttributeType,AttributeTypeName`);
103
+ if (!typeRes.ok) return null;
104
+ const attr = (await typeRes.json()) as {
105
+ AttributeType?: string;
106
+ AttributeTypeName?: { Value?: string };
107
+ };
108
+
109
+ // ★ Dispatch on `AttributeTypeName.Value`, NOT `AttributeType` (corrected in review of #306).
110
+ // `AttributeType` is the legacy `AttributeTypeCode` enum, whose 21 members do NOT include
111
+ // MultiSelectPicklist — a multi-select choice reports `AttributeType: "Virtual"`, so keying on
112
+ // it made that entry unreachable. `AttributeTypeName` carries the real discriminator.
113
+ // Measured against orge2e285aa:
114
+ // account.statuscode → Status/StatusType account.statecode → State/StateType
115
+ // account.name → String/StringType account.accountcategorycode → Picklist/PicklistType
116
+ const cast = {
117
+ PicklistType: 'PicklistAttributeMetadata',
118
+ StatusType: 'StatusAttributeMetadata',
119
+ StateType: 'StateAttributeMetadata',
120
+ MultiSelectPicklistType: 'MultiSelectPicklistAttributeMetadata',
121
+ }[attr.AttributeTypeName?.Value ?? ''];
122
+ if (!cast) return null; // not a choice column — the caller shows the value raw
123
+
124
+ // `GlobalOptionSet` is expanded as belt-and-braces only. Measured across all 20 picklist
125
+ // columns on `account` in orge2e285aa, `OptionSet` was populated EVERY time, including for
126
+ // global-backed choices — so this is not a confirmed gap, just the same defensive read the
127
+ // gallery's own optionset function does. Costs nothing; do not read it as a known failure.
128
+ const meta = await apiFetch(
129
+ `${attrPath}/Microsoft.Dynamics.CRM.${cast}?%24expand=OptionSet(%24select=Options),GlobalOptionSet(%24select=Options)`,
130
+ );
131
+ if (!meta.ok) return null;
132
+
133
+ type OptionRow = {
134
+ Value: number;
135
+ Label?: { UserLocalizedLabel?: { Label?: string }; LocalizedLabels?: { Label?: string }[] };
136
+ };
137
+ const body = (await meta.json()) as {
138
+ OptionSet?: { Options?: OptionRow[] };
139
+ GlobalOptionSet?: { Options?: OptionRow[] };
140
+ };
141
+ const options = body.OptionSet?.Options ?? body.GlobalOptionSet?.Options;
142
+ if (!options?.length) return null;
143
+
144
+ return options.map((o) => ({
145
+ Value: o.Value,
146
+ // `UserLocalizedLabel` is null when the caller's UI language has no provisioned label —
147
+ // a live scenario on CDX orgs — so fall through to the first localised label, then to the
148
+ // raw value. A visible number beats a blank option.
149
+ Label:
150
+ o.Label?.UserLocalizedLabel?.Label ??
151
+ o.Label?.LocalizedLabels?.[0]?.Label ??
152
+ String(o.Value),
153
+ }));
154
+ }
155
+
50
156
  /**
51
157
  * Write one column back to one record — the save half of the round-trip.
52
158
  *
@@ -10,7 +10,13 @@ import {
10
10
  type HarnessField,
11
11
  } from '@dataverse-kit/pcf-dev-harness/shell';
12
12
  import { {{componentName}}Component } from '../{{componentName}}/{{componentName}}Component';
13
- import { readField, saveField, type HttpError } from './harness/dataverse';
13
+ import {
14
+ readField,
15
+ saveField,
16
+ readChoiceOptions,
17
+ type ChoiceOption,
18
+ type HttpError,
19
+ } from './harness/dataverse';
14
20
 
15
21
  /**
16
22
  * Dev harness — renders the control against either a local value or a REAL Dataverse column.
@@ -38,20 +44,38 @@ const LIVE_ENABLED = !!import.meta.env.VITE_DYNAMICS_URL;
38
44
  * column's choice metadata — note the UPPERCASE `Options`/`Value`/`Label`, which is the live
39
45
  * PCF API shape, not the form-builder's design-time config. Harmless for the other variants,
40
46
  * which ignore `context` entirely.
47
+ *
48
+ * These placeholder options are for MOCK mode only. In Live mode the harness replaces them with
49
+ * the column's REAL choices — see `buildContext` / `readChoiceOptions`.
41
50
  */
42
- const MOCK_CONTEXT = {
43
- parameters: {
44
- value: {
45
- attributes: {
46
- Options: [
47
- { Value: 1, Label: 'Option A' },
48
- { Value: 2, Label: 'Option B' },
49
- { Value: 3, Label: 'Option C' },
50
- ],
51
- },
52
- },
53
- },
54
- } as unknown as ComponentFramework.Context<any>;
51
+ const MOCK_OPTIONS: ChoiceOption[] = [
52
+ { Value: 1, Label: 'Option A' },
53
+ { Value: 2, Label: 'Option B' },
54
+ { Value: 3, Label: 'Option C' },
55
+ ];
56
+
57
+ /**
58
+ * Wrap a set of choices in the PCF context shape the control reads.
59
+ *
60
+ * ★ Live mode MUST NOT use the placeholder options — not even as a fallback when the metadata
61
+ * lookup returns nothing. Two distinct failures, and the second is the worse one:
62
+ *
63
+ * - placeholders in live mode with a NON-matching value (the original defect): a real value like
64
+ * 100000002 matches none of 1/2/3, the Dropdown shows its placeholder, and the control looks
65
+ * broken while the read was correct. Recorded against row 02's G5.
66
+ * - placeholders in live mode with a MATCHING value (found in review of #306): the shipped
67
+ * default binding is `accounts` / `accountcategorycode`, whose real values are
68
+ * 1 = "Preferred Customer" and 2 = "Standard". Falling back to the placeholders renders
69
+ * "Option A" — plausible, confidently wrong, and indistinguishable from working. A blank
70
+ * reads as broken; a wrong label reads as fine. Strictly worse than the bug being fixed.
71
+ *
72
+ * So live mode passes `[]` when metadata is unavailable: the optionset variant then degrades to
73
+ * the numeric input it already documents for a control with no choice metadata, which is honest.
74
+ */
75
+ const buildContext = (options: ChoiceOption[]): ComponentFramework.Context<any> =>
76
+ ({
77
+ parameters: { value: { attributes: { Options: options } } },
78
+ }) as unknown as ComponentFramework.Context<any>;
55
79
 
56
80
  /** Turn a failed live call into a red status line, calling out auth failures specifically. */
57
81
  function describeError(e: unknown, verb: string): React.ReactNode {
@@ -71,6 +95,9 @@ const Harness: React.FC = () => {
71
95
  const [height, setHeight] = usePersistedState('height', 0);
72
96
  const [theme, setTheme] = usePersistedState<ThemeChoice>('theme', 'light');
73
97
  const [dataSource, setDataSource] = usePersistedState<DataSource>('dataSource', 'mock');
98
+ // Live choice metadata for the bound column. NOT persisted: it belongs to whichever binding
99
+ // was last loaded, and a stale set from a previous column would mislabel the value.
100
+ const [liveOptions, setLiveOptions] = React.useState<ChoiceOption[] | null>(null);
74
101
  const [placeholder, setPlaceholder] = usePersistedState('placeholder', 'Enter a value');
75
102
  const [disabled, setDisabled] = usePersistedState('disabled', false);
76
103
  const [binding, setBinding] = usePersistedState<FieldBinding>('binding', {
@@ -101,6 +128,9 @@ const Harness: React.FC = () => {
101
128
  const onDataSourceChange = (next: DataSource): void => {
102
129
  setDataSource(next);
103
130
  setValue({{valueDefault}});
131
+ // Drop the live choices with the live value. Keeping them would label MOCK mode with the
132
+ // last-loaded column's real options — the mirror image of the bug this fetch fixes.
133
+ setLiveOptions(null);
104
134
  setLiveStatus(
105
135
  next === 'mock' ? null : <span style={{ color: '#605e5c' }}>Enter a binding and click Load.</span>,
106
136
  );
@@ -114,13 +144,28 @@ const Harness: React.FC = () => {
114
144
  }
115
145
  setLiveStatus(<span style={{ color: '#605e5c' }}>Loading…</span>);
116
146
  try {
117
- const { raw, formatted } = await readField(binding.entitySetName, binding.recordId, binding.column);
147
+ // Fetched together: the VALUE is meaningless to an option-set control without the
148
+ // choices to resolve it against, and issuing them in parallel keeps Load one round trip
149
+ // deep from the user's point of view. `readChoiceOptions` resolves to null for a column
150
+ // that has no choices, which is the normal case for every non-optionset variant.
151
+ const [{ raw, formatted }, options] = await Promise.all([
152
+ readField(binding.entitySetName, binding.recordId, binding.column),
153
+ // `.catch` makes the documented contract true: readChoiceOptions handles non-ok
154
+ // RESPONSES, but a fetch rejection or a JSON parse failure would otherwise propagate
155
+ // through Promise.all and discard a perfectly good value read. (Review of #306.)
156
+ readChoiceOptions(binding.entitySetName, binding.column).catch(() => null),
157
+ ]);
158
+ setLiveOptions(options);
118
159
  // The control owns its own typing; the harness hands the raw platform value straight
119
160
  // through, exactly as the PCF host does via `context.parameters.value.raw`.
120
161
  setValue(raw as {{tsType}});
162
+ // ★ A null metadata result gets its own signal. Without one, a choice column whose
163
+ // metadata could not be read looks identical to a successful load — green status, empty
164
+ // dropdown — and the reader has nothing to go on. (Review of #306.)
121
165
  setLiveStatus(
122
- <span style={{ color: '#107c10' }}>
166
+ <span style={{ color: options === null ? '#8a6116' : '#107c10' }}>
123
167
  Loaded{formatted ? ` — "${formatted}"` : ''}.
168
+ {options === null ? ' No choice metadata for this column — the value is shown raw.' : ''}
124
169
  </span>,
125
170
  );
126
171
  } catch (e) {
@@ -193,7 +238,7 @@ const Harness: React.FC = () => {
193
238
  disabled={disabled}
194
239
  onChange={setValue}
195
240
  onBlur={() => undefined}
196
- context={MOCK_CONTEXT}
241
+ context={buildContext(dataSource === 'live' ? (liveOptions ?? []) : MOCK_OPTIONS)}
197
242
  />
198
243
  {dataSource === 'live' && (
199
244
  <button