@khester/create-dynamics-app 3.3.0 → 3.4.1
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/artifacts/registry.d.ts.map +1 -1
- package/dist/artifacts/registry.js +11 -3
- package/dist/artifacts/registry.js.map +1 -1
- package/package.json +2 -2
- package/templates/grid-customizer/README.md +23 -2
- package/templates/grid-customizer/dev/harness/MockGrid.tsx +155 -9
- package/templates/grid-customizer/dev/main.tsx +54 -8
- package/templates/grid-customizer/{{componentName}}/customizers/CellEditorOverrides.tsx +122 -26
- package/templates/grid-customizer/{{componentName}}/types.ts +61 -3
- package/templates/pcf-field/dev/harness/dataverse.ts +106 -0
- package/templates/pcf-field/dev/main.tsx +62 -17
|
@@ -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,
|
|
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,EAmiBzC,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
|
|
462
|
-
'yes/no ticks, per-column progress bars
|
|
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,14 @@ 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
|
-
|
|
487
|
+
//
|
|
488
|
+
// 3.1.1 — contract corrections (#309, released in create-dynamics-app 3.4.1). `stopEditing`
|
|
489
|
+
// was typed `(cancel?: boolean)`; the boolean is `suppressNavigateAfterEdit` and stopEditing
|
|
490
|
+
// IS the commit. Both override maps key on `CustomRendererType || dataType`, both handlers
|
|
491
|
+
// take an undocumented third argument, and `charPress` is delivered as `keyPress`. A patch
|
|
492
|
+
// because nothing gained a capability — but it changes a signature user code compiles
|
|
493
|
+
// against, so the artifact version records it.
|
|
494
|
+
templateVersion: '3.1.1',
|
|
487
495
|
available: true,
|
|
488
496
|
},
|
|
489
497
|
{
|
|
@@ -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
|
+
"version": "3.4.1",
|
|
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.
|
|
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
|
|
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; see Edit mode below for what
|
|
29
|
+
it does and does not prove.)
|
|
28
30
|
|
|
29
31
|
## Local development
|
|
30
32
|
|
|
@@ -51,6 +53,25 @@ 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 and does not prove.** The **naming** is settled: `defaultProps.onChange`
|
|
68
|
+
> *is* `editorParams.onCellValueChanged` — one function, two names. But it **stages** a value;
|
|
69
|
+
> **`stopEditing` is what commits** (`getValue()` → `saveNewValue()` → `setDataValue`). So calling
|
|
70
|
+
> `onChange` alone defers the commit to the end of the edit session, while also calling
|
|
71
|
+
> `stopEditing()` flushes immediately — a real behavioural difference under cancel. Edit mode
|
|
72
|
+
> shows you the handler is reached, keyed and narrowed; it cannot show you commit timing, and it
|
|
73
|
+
> cannot show the Dataverse round-trip.
|
|
74
|
+
|
|
54
75
|
## Customizing it
|
|
55
76
|
|
|
56
77
|
| File | What it is for |
|
|
@@ -58,7 +79,7 @@ never exposed to the browser bundle. See `env.local.example` for the full contra
|
|
|
58
79
|
| `{{componentName}}/customizers/config.ts` | **Start here.** Status colours, which columns get progress bars, currency colours. |
|
|
59
80
|
| `{{componentName}}/customizers/cells.tsx` | What each custom cell looks like. |
|
|
60
81
|
| `{{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.
|
|
82
|
+
| `{{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
83
|
| `{{componentName}}/types.ts` | The platform contract. Vendored: Microsoft ships no package for it. |
|
|
63
84
|
|
|
64
85
|
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
|
|
|
@@ -12,7 +15,7 @@ import type {
|
|
|
12
15
|
* to customize during local development.
|
|
13
16
|
*
|
|
14
17
|
* ★ Its whole value is that it calls the overrides EXACTLY the way the real grid does:
|
|
15
|
-
* - looks the handler up by
|
|
18
|
+
* - looks the handler up by `CustomRendererType || ColumnDataType`, never by logical name;
|
|
16
19
|
* - passes `(CellRendererProps, GetRendererParams)`, with `colDefs` + `columnIndex` so a
|
|
17
20
|
* handler can narrow to one column;
|
|
18
21
|
* - treats a `null`/`undefined` return as "use the default renderer" rather than as an
|
|
@@ -20,8 +23,24 @@ 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
|
|
24
|
-
*
|
|
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 `CustomRendererType || 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 `keyPress`, which this never populates.
|
|
38
|
+
*
|
|
39
|
+
* ⚠️ What it CANNOT tell you: COMMIT TIMING. In the platform, `onChange` only stages a value and
|
|
40
|
+
* `stopEditing` flushes it (`getValue()` → `saveNewValue()` → `setDataValue`); this harness
|
|
41
|
+
* commits straight to its own row data on `onChange`, so it cannot show you the difference
|
|
42
|
+
* between deferring to session end and flushing immediately — nor the Dataverse round-trip.
|
|
43
|
+
* Edit mode proves the map is reached, keyed and narrowed. Nothing more.
|
|
25
44
|
*/
|
|
26
45
|
|
|
27
46
|
/** One column of the fake grid: the platform's `ColumnDefinition` plus a display width. */
|
|
@@ -30,8 +49,15 @@ export interface HarnessColumn {
|
|
|
30
49
|
displayName: string;
|
|
31
50
|
dataType: ColumnDataType;
|
|
32
51
|
width?: number;
|
|
52
|
+
/** Per-column editability. The platform sets this from metadata/security, not per grid. */
|
|
53
|
+
editable?: boolean;
|
|
54
|
+
/** ★ Takes PRECEDENCE over `dataType` in the override lookup, exactly as the platform does. */
|
|
55
|
+
customRendererType?: string;
|
|
33
56
|
}
|
|
34
57
|
|
|
58
|
+
/** Stand-in for the platform's localized strings — the undocumented third handler argument. */
|
|
59
|
+
const HARNESS_LOCALIZED_STRINGS: Record<string, unknown> = {};
|
|
60
|
+
|
|
35
61
|
/** One cell: the raw value the platform would pass, and the text it would have painted. */
|
|
36
62
|
export interface HarnessCell {
|
|
37
63
|
raw: unknown;
|
|
@@ -47,6 +73,18 @@ export interface MockGridProps {
|
|
|
47
73
|
overrides: CellRendererOverrides;
|
|
48
74
|
/** Row height in px — the real grid gives cells a fixed height, so mirror that. */
|
|
49
75
|
rowHeight?: number;
|
|
76
|
+
/** Editor map to dispatch when a cell is being edited. Omit for a read-only grid. */
|
|
77
|
+
editorOverrides?: CellEditorOverrides;
|
|
78
|
+
/** Turn inline editing on. Without it the grid behaves exactly as it always has. */
|
|
79
|
+
editable?: boolean;
|
|
80
|
+
/** Commit handler — the harness owns the row data, as the platform owns the record. */
|
|
81
|
+
onCellCommit?: (rowIndex: number, columnName: string, next: unknown) => void;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Which cell is open for editing. */
|
|
85
|
+
interface EditTarget {
|
|
86
|
+
rowIndex: number;
|
|
87
|
+
columnIndex: number;
|
|
50
88
|
}
|
|
51
89
|
|
|
52
90
|
const ROW_HEIGHT = 42;
|
|
@@ -68,13 +106,34 @@ export const MockGrid: React.FC<MockGridProps> = ({
|
|
|
68
106
|
rows,
|
|
69
107
|
overrides,
|
|
70
108
|
rowHeight = ROW_HEIGHT,
|
|
109
|
+
editorOverrides,
|
|
110
|
+
editable = false,
|
|
111
|
+
onCellCommit,
|
|
71
112
|
}) => {
|
|
113
|
+
const [editing, setEditing] = React.useState<EditTarget | null>(null);
|
|
114
|
+
// Leaving edit mode must also close any open editor, or the cell stays stuck in an editor
|
|
115
|
+
// the grid no longer considers editable.
|
|
116
|
+
React.useEffect(() => {
|
|
117
|
+
if (!editable) setEditing(null);
|
|
118
|
+
}, [editable]);
|
|
119
|
+
// ★ `editing` is a pair of INDICES. If the recordset is swapped underneath it (Mock↔Live, a
|
|
120
|
+
// reload, a different $select) the same indices address a different record and a commit would
|
|
121
|
+
// write into it. Close the editor whenever that happens.
|
|
122
|
+
//
|
|
123
|
+
// Keyed on `columns`, NOT `rows`: the harness replaces the columns array on every dataset
|
|
124
|
+
// change, while a COMMIT replaces the rows array too — so depending on `rows` would close the
|
|
125
|
+
// editor after every single edit, which is a worse bug than the one being fixed.
|
|
126
|
+
React.useEffect(() => {
|
|
127
|
+
setEditing(null);
|
|
128
|
+
}, [columns]);
|
|
72
129
|
// Built once per render and shared by every cell, exactly as the grid does — a handler
|
|
73
130
|
// that inspects sibling columns sees the same array the platform would give it.
|
|
74
131
|
const colDefs: ColumnDefinition[] = columns.map((c, i) => ({
|
|
75
132
|
name: c.name,
|
|
76
133
|
displayName: c.displayName,
|
|
77
134
|
dataType: c.dataType,
|
|
135
|
+
// Surfaced so a handler narrowing through colDefs sees what the LOOKUP used.
|
|
136
|
+
CustomRendererType: c.customRendererType,
|
|
78
137
|
isPrimary: i === 0,
|
|
79
138
|
}));
|
|
80
139
|
|
|
@@ -110,12 +169,15 @@ export const MockGrid: React.FC<MockGridProps> = ({
|
|
|
110
169
|
{columns.map((col, columnIndex) => {
|
|
111
170
|
const cell = row[col.name] ?? { raw: undefined, formatted: '' };
|
|
112
171
|
|
|
172
|
+
const isEditing =
|
|
173
|
+
editing?.rowIndex === rowIndex && editing?.columnIndex === columnIndex;
|
|
174
|
+
|
|
113
175
|
const props: CellRendererProps = {
|
|
114
176
|
value: cell.raw,
|
|
115
177
|
formattedValue: cell.formatted,
|
|
116
178
|
columnDataType: col.dataType,
|
|
117
179
|
rowHeight,
|
|
118
|
-
columnEditable:
|
|
180
|
+
columnEditable: editable && (col.editable ?? true),
|
|
119
181
|
isRightAligned:
|
|
120
182
|
col.dataType === 'Currency' ||
|
|
121
183
|
col.dataType === 'Decimal' ||
|
|
@@ -132,12 +194,96 @@ export const MockGrid: React.FC<MockGridProps> = ({
|
|
|
132
194
|
rowData: { __rec_id: String(rowIndex) },
|
|
133
195
|
};
|
|
134
196
|
|
|
135
|
-
|
|
136
|
-
|
|
197
|
+
// ★ Composite key, as the platform does: `CustomRendererType || dataType`.
|
|
198
|
+
// Keying on dataType alone silently misses a column that declares one.
|
|
199
|
+
const rKey = (col.customRendererType || col.dataType) as ColumnDataType;
|
|
200
|
+
const handler = overrides[rKey];
|
|
201
|
+
// ★ Third argument: the platform passes its localized strings. Undocumented,
|
|
202
|
+
// but a handler that reads it must not receive `undefined` here by accident.
|
|
203
|
+
const custom = handler ? handler(props, params, HARNESS_LOCALIZED_STRINGS) : undefined;
|
|
204
|
+
|
|
205
|
+
let content: React.ReactNode;
|
|
206
|
+
if (isEditing) {
|
|
207
|
+
const stopEditing = (): void => setEditing(null);
|
|
208
|
+
const commit = (next: unknown): void => {
|
|
209
|
+
onCellCommit?.(rowIndex, col.name, next);
|
|
210
|
+
};
|
|
211
|
+
const editorProps: CellEditorProps = {
|
|
212
|
+
value: cell.raw,
|
|
213
|
+
rowHeight,
|
|
214
|
+
columnDataType: col.dataType,
|
|
215
|
+
isRequired: false,
|
|
216
|
+
// ★ `keyPress` is what the platform delivers; `charPress` is not sent.
|
|
217
|
+
keyPress: null,
|
|
218
|
+
// The documented commit path. The harness treats it as authoritative and
|
|
219
|
+
// writes straight through to the row data.
|
|
220
|
+
onChange: commit,
|
|
221
|
+
// The platform surfaces the flush on the props too. Without it, a handler
|
|
222
|
+
// following the docs and calling `defaultProps.onStopEditing?.()` would hit a
|
|
223
|
+
// silent no-op here — editor never closes, nothing commits.
|
|
224
|
+
onStopEditing: () => stopEditing(),
|
|
225
|
+
};
|
|
226
|
+
const editorParams: GetEditorParams = {
|
|
227
|
+
colDefs,
|
|
228
|
+
columnIndex,
|
|
229
|
+
// Part of the contract. Wired so a handler that calls it is not a crash,
|
|
230
|
+
// but the harness commits on onChange — see the file header.
|
|
231
|
+
onCellValueChanged: commit,
|
|
232
|
+
rowData: { __rec_id: String(rowIndex) },
|
|
233
|
+
stopEditing,
|
|
234
|
+
};
|
|
235
|
+
const eKey = (col.customRendererType || col.dataType) as ColumnDataType;
|
|
236
|
+
const editorHandler = editorOverrides?.[eKey];
|
|
237
|
+
const customEditor = editorHandler
|
|
238
|
+
? editorHandler(editorProps, editorParams, HARNESS_LOCALIZED_STRINGS)
|
|
239
|
+
: undefined;
|
|
240
|
+
|
|
241
|
+
content = (
|
|
242
|
+
// ★ Guarded blur. Un-guarded, React's bubbling onBlur tears the editor down
|
|
243
|
+
// on ANY internal focus move — and Fluent's SpinButton blurs its input when
|
|
244
|
+
// you mousedown an arrow, so a single click would apply one step and close.
|
|
245
|
+
<div
|
|
246
|
+
onBlur={(e) => {
|
|
247
|
+
if (!e.currentTarget.contains(e.relatedTarget as Node | null)) stopEditing();
|
|
248
|
+
}}
|
|
249
|
+
ref={(el) => {
|
|
250
|
+
// Focus the custom editor on open; only the fallback input self-focuses.
|
|
251
|
+
if (el && !el.contains(document.activeElement)) {
|
|
252
|
+
el.querySelector<HTMLElement>('input, [tabindex]')?.focus();
|
|
253
|
+
}
|
|
254
|
+
}}
|
|
255
|
+
>
|
|
256
|
+
{/* ★ undefined => the PLATFORM's editor, not an empty cell. The stand-in
|
|
257
|
+
for that is a plain input, which is what the grid falls back to. */}
|
|
258
|
+
{customEditor ?? (
|
|
259
|
+
<input
|
|
260
|
+
autoFocus
|
|
261
|
+
defaultValue={cell.formatted}
|
|
262
|
+
// ★ Commits on BLUR as well as Enter. The real grid commits its
|
|
263
|
+
// built-in editors on blur, and this input stands in for those — if it
|
|
264
|
+
// discarded on blur it would model the platform backwards on the one
|
|
265
|
+
// gesture a user makes constantly.
|
|
266
|
+
onBlur={(e) => commit(e.target.value)}
|
|
267
|
+
onKeyDown={(e) => {
|
|
268
|
+
if (e.key === 'Enter') commit((e.target as HTMLInputElement).value);
|
|
269
|
+
if (e.key === 'Escape') stopEditing();
|
|
270
|
+
if (e.key === 'Enter') stopEditing();
|
|
271
|
+
}}
|
|
272
|
+
style={{ width: '100%', font: 'inherit', boxSizing: 'border-box' }}
|
|
273
|
+
/>
|
|
274
|
+
)}
|
|
275
|
+
</div>
|
|
276
|
+
);
|
|
277
|
+
} else {
|
|
278
|
+
// ★ null/undefined => the grid's own rendering, not an empty cell.
|
|
279
|
+
content = custom ?? cell.formatted;
|
|
280
|
+
}
|
|
137
281
|
|
|
138
282
|
return (
|
|
139
283
|
<td
|
|
140
284
|
key={col.name}
|
|
285
|
+
onDoubleClick={editable ? () => setEditing({ rowIndex, columnIndex }) : undefined}
|
|
286
|
+
title={editable && !isEditing ? 'Double-click to edit' : undefined}
|
|
141
287
|
style={{
|
|
142
288
|
height: rowHeight,
|
|
143
289
|
padding: '0 8px',
|
|
@@ -146,13 +292,13 @@ export const MockGrid: React.FC<MockGridProps> = ({
|
|
|
146
292
|
overflow: 'hidden',
|
|
147
293
|
textOverflow: 'ellipsis',
|
|
148
294
|
whiteSpace: 'nowrap',
|
|
295
|
+
cursor: editable && !isEditing ? 'cell' : undefined,
|
|
149
296
|
// The real grid right-aligns numerics itself; a custom renderer that
|
|
150
297
|
// returns undefined must therefore still land in the default layout.
|
|
151
|
-
textAlign: props.isRightAligned && !custom ? 'right' : 'left',
|
|
298
|
+
textAlign: props.isRightAligned && !custom && !isEditing ? 'right' : 'left',
|
|
152
299
|
}}
|
|
153
300
|
>
|
|
154
|
-
{
|
|
155
|
-
{custom ?? cell.formatted}
|
|
301
|
+
{content}
|
|
156
302
|
</td>
|
|
157
303
|
);
|
|
158
304
|
})}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
|
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,134 @@
|
|
|
1
|
-
import
|
|
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
|
-
*
|
|
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.
|
|
15
17
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
18
|
+
* ⚠️ **Commit semantics — PARTIALLY resolved, and an earlier revision of this comment got the
|
|
19
|
+
* central point backwards.** Corrected 2026-08-09 after review re-read the bundle one level
|
|
20
|
+
* deeper. What the platform actually does:
|
|
19
21
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
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
|
-
* };
|
|
22
|
+
* ```js
|
|
23
|
+
* // the editor wrapper OneGrid registers with ag-Grid
|
|
24
|
+
* _onCellValueChanged = e => { this.value = e }; // STAGES. No write.
|
|
25
|
+
* getValue = () => this.value; // read back at STOP time
|
|
26
|
+
* // ending the session:
|
|
27
|
+
* takeValueFromCellEditor() -> getValue() -> saveNewValue() -> rowNode.setDataValue(…)
|
|
36
28
|
* ```
|
|
29
|
+
*
|
|
30
|
+
* ★★ `defaultProps.onChange` IS `editorParams.onCellValueChanged` (one function, two names) —
|
|
31
|
+
* that part was right. But it **stages**; it does not commit. **`stopEditing` is the flush.**
|
|
32
|
+
*
|
|
33
|
+
* ★★ Therefore the two conventions in this repo are **NOT equivalent**, and the earlier claim
|
|
34
|
+
* that they were is withdrawn:
|
|
35
|
+
* - `onChange` alone (this file) — defers the commit to whenever the grid ends the session;
|
|
36
|
+
* a cancel discards it.
|
|
37
|
+
* - `onChange` + `editorParams.stopEditing()` (export-engine's PA-grid emitter) — commits
|
|
38
|
+
* immediately and deterministically.
|
|
39
|
+
* Which is *wanted* depends on whether an in-progress edit should survive a cancel. Reconciling
|
|
40
|
+
* them is a real open question, not a style difference.
|
|
41
|
+
*
|
|
42
|
+
* ⚠️ Still unobserved: the Dataverse round-trip at the end of the save queue, AND the timing
|
|
43
|
+
* difference above under a real cancel. The dev harness cannot show either.
|
|
37
44
|
*/
|
|
38
|
-
|
|
45
|
+
|
|
46
|
+
/** Per-instance knobs, mirroring `RendererOptions` so the harness can retarget the same map. */
|
|
47
|
+
export interface EditorOptions {
|
|
48
|
+
/**
|
|
49
|
+
* Columns that get the clamped numeric editor. Defaults to `config.PROGRESS_COLUMNS` — the
|
|
50
|
+
* SAME list that drives the progress-bar renderer, so a column shown as a 0–100 bar is also
|
|
51
|
+
* edited as one, instead of as a free-text decimal that can be set to 900.
|
|
52
|
+
*/
|
|
53
|
+
progressColumns?: readonly string[];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The column logical name for the cell currently being edited. */
|
|
57
|
+
function columnName(params: GetEditorParams): string | undefined {
|
|
58
|
+
return params.colDefs[params.columnIndex]?.name;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Build the editor map. `cellEditorOverrides` below is the configured singleton. */
|
|
62
|
+
export function createCellEditorOverrides(options: EditorOptions = {}): CellEditorOverrides {
|
|
63
|
+
const progressColumns = options.progressColumns ?? PROGRESS_COLUMNS;
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
// ★ Same per-column narrowing as the Decimal RENDERER. `PROGRESS_COLUMNS` is empty by
|
|
67
|
+
// default, so a scaffold that has not been configured registers this handler and then
|
|
68
|
+
// falls through on every cell — the editor path is inert until you opt a column in, which
|
|
69
|
+
// is the conservative default for something that writes.
|
|
70
|
+
Decimal: (
|
|
71
|
+
defaultProps: CellEditorProps,
|
|
72
|
+
editorParams: GetEditorParams,
|
|
73
|
+
customizerLocalizedStrings?: Record<string, unknown>,
|
|
74
|
+
) => {
|
|
75
|
+
const name = columnName(editorParams);
|
|
76
|
+
if (!name || !progressColumns.includes(name)) return undefined;
|
|
77
|
+
|
|
78
|
+
const current = toNumber(defaultProps.value) ?? 0;
|
|
79
|
+
const clamp = (n: number): number => Math.min(PROGRESS_MAX, Math.max(0, n));
|
|
80
|
+
|
|
81
|
+
// ★ Commit through `onChange` ONLY.
|
|
82
|
+
//
|
|
83
|
+
// Do not add `onValidate`: Fluent v8's SpinButton calls `onValidate(entered)` and then
|
|
84
|
+
// feeds the result through `useControllableValue`, which calls `onChange` as well — so a
|
|
85
|
+
// single committed edit fires this handler twice. ⚠️ The measured [100, 100] was measured
|
|
86
|
+
// in THIS TEMPLATE'S HARNESS, which commits straight through on `onChange`; against the
|
|
87
|
+
// platform — which only STAGES on `onChange` — the second call is an idempotent
|
|
88
|
+
// re-assignment, not a second write. The prohibition still stands (firing a user callback
|
|
89
|
+
// twice per edit is wrong regardless, and Fluent's built-in validation already clamps, so
|
|
90
|
+
// `onValidate` buys nothing), but not for the reason first recorded.
|
|
91
|
+
//
|
|
92
|
+
// (Calling `editorParams.onCellValueChanged` as well is redundant, not harmful — it is the
|
|
93
|
+
// same function. An earlier revision called that a "double write"; it is an idempotent
|
|
94
|
+
// re-assignment.)
|
|
95
|
+
//
|
|
96
|
+
// ★ `onChange` IS `editorParams.onCellValueChanged` (one function, two names), and it
|
|
97
|
+
// STAGES rather than writes — the platform flushes on `stopEditing`. So this handler
|
|
98
|
+
// defers its commit to the end of the edit session. export-engine's emitter instead
|
|
99
|
+
// calls `stopEditing()` to flush immediately; that is a real behavioural difference
|
|
100
|
+
// under cancel, not a style choice. See the header.
|
|
101
|
+
const commit = (raw?: string): void => {
|
|
102
|
+
// Empty means "clear the cell", not "re-commit what was there" — matching the
|
|
103
|
+
// export-engine emitter. Without this a user can never blank an opted-in column.
|
|
104
|
+
if (raw !== undefined && raw.trim() === '') {
|
|
105
|
+
defaultProps.onChange(null);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const parsed = toNumber(raw);
|
|
109
|
+
defaultProps.onChange(clamp(parsed === undefined ? current : parsed));
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<SpinButton
|
|
114
|
+
// Consumes the undocumented third argument, so the declared arity is load-bearing and
|
|
115
|
+
// a test can detect it being dropped. Falls back when the platform sends nothing.
|
|
116
|
+
ariaLabel={
|
|
117
|
+
(customizerLocalizedStrings?.percentEditorLabel as string | undefined) ?? 'Percent complete'
|
|
118
|
+
}
|
|
119
|
+
min={0}
|
|
120
|
+
max={PROGRESS_MAX}
|
|
121
|
+
step={5}
|
|
122
|
+
defaultValue={String(current)}
|
|
123
|
+
// Fires once, on a COMMITTED edit (blur / Enter / arrow) — v8 holds an uncommitted
|
|
124
|
+
// `intermediateValue` while typing, so this is not per-keystroke.
|
|
125
|
+
onChange={(_e, v) => commit(v)}
|
|
126
|
+
styles={{ root: { minWidth: 0, width: '100%' } }}
|
|
127
|
+
/>
|
|
128
|
+
);
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** What the control registers with the grid — see `index.ts`. */
|
|
134
|
+
export const cellEditorOverrides: CellEditorOverrides = createCellEditorOverrides();
|
|
@@ -22,7 +22,11 @@ export interface PAOneGridCustomizer {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* ★ Keyed by
|
|
25
|
+
* ★ Keyed by `CustomRendererType || ColumnDataType` — never by column logical name.
|
|
26
|
+
*
|
|
27
|
+
* ⚠️ The `CustomRendererType` half is a HAZARD, not a feature: a column declaring one is looked
|
|
28
|
+
* up under that string FIRST, so a `Decimal:` entry silently never fires for it — and the closed
|
|
29
|
+
* `ColumnDataType` union gives you no way to register under it. Identical for editors.
|
|
26
30
|
*
|
|
27
31
|
* A `{ statuscode: renderer }` entry silently never fires — `statuscode` is not a
|
|
28
32
|
* `ColumnDataType`. To scope a renderer to one column, register under its data type and
|
|
@@ -35,14 +39,39 @@ export type CellRendererOverrides = {
|
|
|
35
39
|
[dataType in ColumnDataType]?: (
|
|
36
40
|
props: CellRendererProps,
|
|
37
41
|
rendererParams: GetRendererParams,
|
|
42
|
+
localizedStrings?: Record<string, unknown>,
|
|
38
43
|
) => React.ReactElement | null | undefined;
|
|
39
44
|
};
|
|
40
45
|
|
|
41
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Same fall-through rule as `CellRendererOverrides`, and — contrary to what this file said
|
|
48
|
+
* before 2026-08-09 — the SAME keying. Both maps are looked up as:
|
|
49
|
+
*
|
|
50
|
+
* ```js
|
|
51
|
+
* overrides[colDef.CustomRendererType || colDef.dataType]
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* ⚠️ **A column declaring a `CustomRendererType` is looked up under THAT STRING FIRST**, so a
|
|
55
|
+
* `Decimal:` entry silently never fires for it — the exact silent-miss class these docs exist to
|
|
56
|
+
* prevent. You cannot currently register under one: the map is keyed by the closed
|
|
57
|
+
* `ColumnDataType` union. A hazard to know about, not a feature to use.
|
|
58
|
+
*
|
|
59
|
+
* Both handlers also receive an undocumented THIRD argument — renderers get
|
|
60
|
+
* `props.localizedStrings`, editors get `customizerLocalizedStrings`. Different prop names, same
|
|
61
|
+
* idea. Typed loosely; Microsoft publishes no shape for either.
|
|
62
|
+
*
|
|
63
|
+
* ★ SOURCE for everything below: Microsoft's shipped OneGrid bundle, read 2026-08-09.
|
|
64
|
+
* https://content.powerapps.com/resource/uci-infra-web/controlsAssets/PowerAppsOneGrid.1D7C81F.js
|
|
65
|
+
* ⚠️ That filename is CONTENT-HASHED and rotates with every platform update — there is no
|
|
66
|
+
* unhashed alias (the bare name 404s). To re-derive it: open any model-driven grid, then
|
|
67
|
+
* `document.querySelector('script[src*=PowerAppsOneGrid]').src`. Search terms that still
|
|
68
|
+
* locate the logic: `customCellEditor`, `_customCellRenderer`, `takeValueFromCellEditor`.
|
|
69
|
+
*/
|
|
42
70
|
export type CellEditorOverrides = {
|
|
43
71
|
[dataType in ColumnDataType]?: (
|
|
44
72
|
defaultProps: CellEditorProps,
|
|
45
73
|
editorParams: GetEditorParams,
|
|
74
|
+
customizerLocalizedStrings?: Record<string, unknown>,
|
|
46
75
|
) => React.ReactElement | null | undefined;
|
|
47
76
|
};
|
|
48
77
|
|
|
@@ -90,9 +119,38 @@ export interface CellEditorProps {
|
|
|
90
119
|
readonly isRTLMode?: boolean;
|
|
91
120
|
readonly rowHeight?: number;
|
|
92
121
|
readonly isRequired?: boolean;
|
|
122
|
+
/** ⚠️ Not delivered under this name — the platform's props literal carries `keyPress`. */
|
|
93
123
|
readonly charPress?: string | null;
|
|
124
|
+
/** What the platform actually passes for type-to-edit. */
|
|
125
|
+
readonly keyPress?: string | null;
|
|
94
126
|
readonly columnDataType?: ColumnDataType;
|
|
127
|
+
/**
|
|
128
|
+
* ★★ THE SAME FUNCTION AS `GetEditorParams.onCellValueChanged` — the platform builds these
|
|
129
|
+
* props as `{ …, onChange: m }` where `m = editorParams.onCellValueChanged`. One reference,
|
|
130
|
+
* two names.
|
|
131
|
+
*
|
|
132
|
+
* ★★ **It STAGES a value; it does not write one.** The editor wrapper is literally
|
|
133
|
+
* `_onCellValueChanged = e => { this.value = e }`, and ag-Grid reads it back through
|
|
134
|
+
* `getValue()` only when the edit session ends. Calling it twice is an idempotent
|
|
135
|
+
* re-assignment — noisy, not damaging. (An earlier revision called that a "double write".
|
|
136
|
+
* That was wrong, and so was the claim below it that `stopEditing` is inert.)
|
|
137
|
+
*/
|
|
95
138
|
readonly onChange: (newValue: unknown) => void;
|
|
139
|
+
/**
|
|
140
|
+
* Also surfaced as `GetEditorParams.stopEditing`.
|
|
141
|
+
*
|
|
142
|
+
* ★★ **THIS is the commit.** Ending the session runs `takeValueFromCellEditor()` →
|
|
143
|
+
* `getValue()` → `saveNewValue()` → `rowNode.setDataValue(…)`. Until it happens, whatever
|
|
144
|
+
* `onChange` staged is uncommitted, and a cancel discards it.
|
|
145
|
+
*
|
|
146
|
+
* ⚠️ The boolean is **NOT** `cancel` — it is `suppressNavigateAfterEdit`. `stopEditing(true)`
|
|
147
|
+
* still COMMITS; it only skips post-edit navigation. ⚠️ **A customizer has NO cancel hook.**
|
|
148
|
+
* ag-Grid would consult the editor's `isCancelAfterEnd()`, but the editor here is OneGrid's own
|
|
149
|
+
* wrapper, which does not implement one — your element renders *inside* it with no way to
|
|
150
|
+
* install one. The only cancel is the platform's own Escape handler. Anything wiring
|
|
151
|
+
* `stopEditing(true)` to Escape is committing, not cancelling.
|
|
152
|
+
*/
|
|
153
|
+
readonly onStopEditing?: (suppressNavigateAfterEdit?: boolean) => void;
|
|
96
154
|
}
|
|
97
155
|
|
|
98
156
|
export interface GetEditorParams {
|
|
@@ -100,7 +158,7 @@ export interface GetEditorParams {
|
|
|
100
158
|
readonly columnIndex: number;
|
|
101
159
|
readonly onCellValueChanged: (newValue: unknown) => void;
|
|
102
160
|
readonly rowData?: RowData;
|
|
103
|
-
readonly stopEditing: (
|
|
161
|
+
readonly stopEditing: (suppressNavigateAfterEdit?: boolean) => void;
|
|
104
162
|
}
|
|
105
163
|
|
|
106
164
|
export interface GetHeaderParams {
|
|
@@ -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 {
|
|
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
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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={
|
|
241
|
+
context={buildContext(dataSource === 'live' ? (liveOptions ?? []) : MOCK_OPTIONS)}
|
|
197
242
|
/>
|
|
198
243
|
{dataSource === 'live' && (
|
|
199
244
|
<button
|