fluentui-extended 2026.8.40 → 2026.8.54
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/CHANGELOG.md +190 -0
- package/README.md +203 -200
- package/dist/index.d.mts +51 -3
- package/dist/index.d.ts +51 -3
- package/dist/index.js +931 -496
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +932 -498
- package/dist/index.mjs.map +1 -1
- package/package.json +89 -88
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
> Version format: `YYYY.M.DD` (e.g., `2026.8.30` = August 30, 2026)
|
|
4
|
+
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
- ✨ **[CommandBar tooltips](README.md#tooltips)** — commands take Fluent tooltips in three forms:
|
|
8
|
+
`title` for a plain line, `title` + `description` for the Fluent 2 rich tooltip, and `tooltip` for
|
|
9
|
+
a fully custom element. `description` accepts markup, so it can carry its own emphasis.
|
|
10
|
+
- 🐛 A tooltip on a command with a visible label now appears on hover. Previously tooltips were
|
|
11
|
+
rendered only for icon-only commands, so `title` on a labelled command did nothing.
|
|
12
|
+
- 🐛 Fixed tooltips on commands with `subItems`. The tooltip wrapped the `Menu` rather than the
|
|
13
|
+
button inside it, so the ref and hover handlers landed on a component that could not use them and
|
|
14
|
+
the tooltip never opened.
|
|
15
|
+
- ♿ The tooltip's `relationship` is now derived from whether the command has a visible label:
|
|
16
|
+
`label` for icon-only commands, `description` otherwise, so a labelled command no longer risks
|
|
17
|
+
announcing its explanation in place of its name.
|
|
18
|
+
- 📝 Release history moved out of the README into this file. The README had grown past the ~64KB
|
|
19
|
+
cap npm applies to the readme shown on the package page, so it was being truncated mid-sentence
|
|
20
|
+
and the page rendered without it.
|
|
21
|
+
|
|
22
|
+
Seven new Dynamics 365 components, plus the shared Web API client they sit on.
|
|
23
|
+
|
|
24
|
+
- ✨ **[SystemUserPersona](README.md#systemuserpersona)** — a `systemuser` persona with the contact card a
|
|
25
|
+
persona shows on a model-driven form. Loads lazily on hover intent; the record photo is addressed
|
|
26
|
+
by URL rather than selected inline, since `entityimage` is binary and bloats every response.
|
|
27
|
+
- ✨ **[OwnerLookup](README.md#ownerlookup)** — a preconfigured `Lookup` for `ownerid`, which is polymorphic:
|
|
28
|
+
an owner is a systemuser *or* a team. Both are searched in parallel, results render as personas or
|
|
29
|
+
team glyphs, selections show as the usual Lookup badges, and multi-select comes from Lookup.
|
|
30
|
+
- ✨ **[Lookup hover cards](README.md#hover-cards)** — `showHoverCard` adds a lazy record card to the dropdown
|
|
31
|
+
rows, the resolved badge, or both. Supply `hoverCardColumns` to have it fetched from the Web API,
|
|
32
|
+
or `renderHoverCard` to build the body yourself. Nothing loads until a pointer settles.
|
|
33
|
+
- 🔧 **[Generated documentation screenshots](README.md#documentation-screenshots).** `npm run shots` captures
|
|
34
|
+
each component in isolation via `?shot=<id>`, populated from fixtures rather than a live org.
|
|
35
|
+
- ✨ `open` on `OptionSetField` and `RecordHoverCard` for rendering an expanded state without
|
|
36
|
+
driving a pointer — used by the captures, and useful in tests.
|
|
37
|
+
|
|
38
|
+
- 💄 **`filled-darker` is now the default appearance** across every field component — Lookup,
|
|
39
|
+
QueryBuilder, DateTimeField and OptionSetField — matching native Dynamics 365. Fluent's default is
|
|
40
|
+
`outline`. **Breaking for anyone relying on the previous outline look**; pass
|
|
41
|
+
`appearance="outline"` to restore it. See [Appearance](README.md#appearance).
|
|
42
|
+
- 💄 **Resolved lookups now render like Dynamics at rest**: table icon or entity image, the record
|
|
43
|
+
name as a link, and a magnifier in place of the chevron. New `entityIcon`, `entityImage`,
|
|
44
|
+
`recordLinkAppearance` and `onRecordClick` props.
|
|
45
|
+
- 🐛 **Attribute metadata requests failed against live environments.** `Format` was included in the
|
|
46
|
+
`$select` against the base `Attributes` collection, but it is declared on derived types — Dynamics
|
|
47
|
+
rejects the whole request with *"Could not find a property named 'Format' on type
|
|
48
|
+
'Microsoft.Dynamics.CRM.AttributeMetadata'"*. `Format` and `DateTimeBehavior` are now fetched
|
|
49
|
+
through cast segments and merged in, which also means `DateTimeField`'s metadata auto-load works
|
|
50
|
+
(it could never have resolved a behavior before).
|
|
51
|
+
|
|
52
|
+
- ✨ **[CommandBar](README.md#commandbar)** — commands that no longer fit collapse into a "More commands" menu
|
|
53
|
+
instead of wrapping or being clipped. Widths are measured from the DOM rather than estimated.
|
|
54
|
+
- ✨ **[EntityGrid](README.md#entitygrid)** — a subgrid with columns named from entity metadata, server-side
|
|
55
|
+
paging via `Prefer: odata.maxpagesize` and `@odata.nextLink`, server-side sorting, and lookups
|
|
56
|
+
rendered from their formatted-value annotations rather than as GUIDs.
|
|
57
|
+
- ✨ **[DateTimeField](README.md#datetimefield)** — respects the attribute's `DateTimeBehavior`, so `DateOnly`
|
|
58
|
+
and `TimeZoneIndependent` values never pass through UTC and cannot drift a day.
|
|
59
|
+
- ✨ **[OptionSetField](README.md#optionsetfield)** — optionset and multi-select picklist field that reads
|
|
60
|
+
global option sets as well as local ones, and round-trips multi-selects as the comma-separated
|
|
61
|
+
string Dynamics stores.
|
|
62
|
+
- ✨ **[RecordHoverCard](README.md#recordhovercard)** — lazy record loading gated on hover intent, so dragging
|
|
63
|
+
a pointer across a grid column does not fire a request per row.
|
|
64
|
+
- ✨ **[Web API client](README.md#web-api-client)** — one client with a process-wide metadata cache shared by
|
|
65
|
+
the new components. Promises are cached rather than values, so components mounting in the same tick
|
|
66
|
+
share a round trip; failures are not cached. Lookup and QueryBuilder are not yet migrated onto it.
|
|
67
|
+
- 🔧 Test harness split into one tab per component.
|
|
68
|
+
|
|
69
|
+
## 2026.8.40
|
|
70
|
+
|
|
71
|
+
QueryBuilder layout and query options.
|
|
72
|
+
|
|
73
|
+
- 🐛 **Toolbar was crushed when the query grew.** In a height-constrained parent the header and
|
|
74
|
+
toolbar were the only flex items able to shrink, so they were compressed and clipped instead of
|
|
75
|
+
the filter list scrolling. Header and toolbar are now pinned, and the filter groups plus previews
|
|
76
|
+
scroll together as one region. See [Layout and Scrolling](README.md#layout-and-scrolling).
|
|
77
|
+
- ✨ **Root `<fetch>` query options.** Generated FetchXML now carries `mapping`, `no-lock` and
|
|
78
|
+
`distinct`, matching what the Dynamics advanced-find editor emits. `distinct` defaults to `true`.
|
|
79
|
+
New `distinct`, `noLock` and `top` props override per instance, and options on an imported query
|
|
80
|
+
are preserved through a serialize round-trip rather than silently dropped.
|
|
81
|
+
- ✨ Preview cards grow to fit their content instead of scrolling internally.
|
|
82
|
+
- 💄 Component header now reads "Query Builder: {entity}" rather than "Edit filters: {entity}".
|
|
83
|
+
- 🔧 Test harness split into **Lookup** and **Query Builder** tabs.
|
|
84
|
+
|
|
85
|
+
## 2026.8.36
|
|
86
|
+
|
|
87
|
+
QueryBuilder field-type and FetchXML correctness pass.
|
|
88
|
+
|
|
89
|
+
- 🐛 **Every field resolved as `string`.** `dataTypeFromAttribute` compared `AttributeTypeName.Value`
|
|
90
|
+
(which is suffixed — `MoneyType`, `PicklistType`, `BooleanType`) against unsuffixed names, so only
|
|
91
|
+
lookups were typed correctly. Money fields offered "Contains", optionsets rendered a text box, and
|
|
92
|
+
booleans never reached their branch.
|
|
93
|
+
- 🐛 **Optionset and boolean options were never loaded** for main-entity fields. The component's field
|
|
94
|
+
loader fetched attributes and lookup targets but no option metadata.
|
|
95
|
+
- 🐛 **Global option sets returned no options** — only `OptionSet` was expanded, never `GlobalOptionSet`.
|
|
96
|
+
- 🐛 **Boolean fields** now use their Dynamics labels ("Allowed" / "Not Allowed") instead of hardcoded
|
|
97
|
+
Yes/No, and match on truthiness so a saved `value="1"` no longer displays as "No".
|
|
98
|
+
- 🐛 **"Does Not Contain" produced invalid FetchXML** (`operator="not-contain"`, which does not exist).
|
|
99
|
+
Now serialized as `not-like` with `%` wildcards.
|
|
100
|
+
- 🐛 **Date picker shifted the day** in UTC+ timezones — `toISOString()` converted local midnight to
|
|
101
|
+
the previous UTC day.
|
|
102
|
+
- 🐛 **`IsValidForAdvancedFind` was never requested**, so the filter meant to hide non-filterable
|
|
103
|
+
attributes did nothing.
|
|
104
|
+
- 🐛 **"Has Value" left the value box enabled**; no-value operators now disable it correctly.
|
|
105
|
+
- 🐛 **"Last X Days" rendered a date picker** instead of a number input.
|
|
106
|
+
- 🐛 **`not-between` and fiscal period-and-year operators had no second value input.**
|
|
107
|
+
- 🐛 **`link-entity` guessed `from="<entity>id"`**, which is wrong for activity entities
|
|
108
|
+
(`email`, `task`, `appointment` all use `activityid`). Now uses `PrimaryIdAttribute`.
|
|
109
|
+
- 🐛 **Invalid OData output.** Untranslatable operators were emitted as a `/* comment */` in the filter
|
|
110
|
+
string; nested related-entity conditions were silently coerced to `eq`. Both are now omitted.
|
|
111
|
+
- ✨ **Edit FetchXML** toolbar button — opens the current query as editable FetchXML to tweak or paste
|
|
112
|
+
over (`showEditFetchXmlButton`).
|
|
113
|
+
- ✨ **Show/Hide OData and FetchXML** toolbar toggles (`showPreviewToggleButtons`).
|
|
114
|
+
- ✨ `QueryBuilderApplyResult.odataUnsupported` reports conditions OData cannot express, surfaced as a
|
|
115
|
+
warning in the OData preview. New `isOperatorConvertibleToOData` helper.
|
|
116
|
+
- ✨ Option metadata is fetched once per attribute type rather than once per field.
|
|
117
|
+
- 💄 Softer, more rounded containers matching other Dynamics surfaces.
|
|
118
|
+
- ⚠️ **Breaking:** `odataUnsupported` is a required field on `QueryBuilderApplyResult`. Consumers only
|
|
119
|
+
reading the result are unaffected; anyone constructing the type will need to add it.
|
|
120
|
+
|
|
121
|
+
## 2026.8.30
|
|
122
|
+
|
|
123
|
+
- ✨ Added multi-entity filter pattern with drill-down header ("← All" back button) in test harness
|
|
124
|
+
- ✨ Added "Details Only (No Secondary Text)" example to test harness
|
|
125
|
+
- ✨ Support for React elements in `secondaryText` and `details[].value` (Badges, icons, styled text)
|
|
126
|
+
- ♻️ Improved `aria-selected`/`aria-disabled` attribute handling
|
|
127
|
+
- 📝 Documentation overhaul with complete API reference and examples
|
|
128
|
+
|
|
129
|
+
## 2026.6.12
|
|
130
|
+
|
|
131
|
+
- ✨ Added React 19 support to peerDependencies
|
|
132
|
+
- 📝 Updated README with cross-document support documentation
|
|
133
|
+
|
|
134
|
+
## 2026.2.19
|
|
135
|
+
|
|
136
|
+
- 🐛 Fixed cross-document dismiss in Dynamics 365 iframes using `ownerDocument`
|
|
137
|
+
|
|
138
|
+
## 2026.2.17
|
|
139
|
+
|
|
140
|
+
- 🐛 Removed `requestAnimationFrame` — handler registers immediately
|
|
141
|
+
- 🐛 Switched to capture phase for dismiss handler to prevent D365 DOM interference
|
|
142
|
+
|
|
143
|
+
## 2026.2.15
|
|
144
|
+
|
|
145
|
+
- ✨ Added controlled `open` and `onOpenChange` props for programmatic dropdown control
|
|
146
|
+
- 🐛 Removed `requestAnimationFrame` from dismiss handler
|
|
147
|
+
|
|
148
|
+
## 2026.2.13
|
|
149
|
+
|
|
150
|
+
- ♻️ Rebuilt popup from scratch using custom element (Fluent UI Popover had unexpected behavior)
|
|
151
|
+
|
|
152
|
+
## 2026.2.11
|
|
153
|
+
|
|
154
|
+
- 🐛 Added `onOpenChange` callback to sync internal state with Popover dismiss events (outside click, Escape, focus loss)
|
|
155
|
+
|
|
156
|
+
## 2026.2.10
|
|
157
|
+
|
|
158
|
+
- 🐛 Fixed Lookup not allowing space character in search input
|
|
159
|
+
|
|
160
|
+
## 2026.2.8
|
|
161
|
+
|
|
162
|
+
- ✨ **QueryBuilder**: Native API integration for field metadata
|
|
163
|
+
- ✨ **QueryBuilder**: Lookup field support with related entity validation
|
|
164
|
+
|
|
165
|
+
## 2026.2.7
|
|
166
|
+
|
|
167
|
+
- ♻️ Removed `Xrm` global dependency — now uses native `/api/data/v9.2/` fetch calls
|
|
168
|
+
|
|
169
|
+
## 2026.2.6
|
|
170
|
+
|
|
171
|
+
- ♻️ **QueryBuilder**: Refactored to reuse shared components and styles
|
|
172
|
+
|
|
173
|
+
## 2026.2.5
|
|
174
|
+
|
|
175
|
+
- ✨ **QueryBuilder**: Initial release (beta) — Advanced Find-style query builder
|
|
176
|
+
- ♻️ **Lookup**: Changed from options-only to popup-based rendering
|
|
177
|
+
|
|
178
|
+
## 2026.2.3
|
|
179
|
+
|
|
180
|
+
- ✨ Added `id` prop — auto-generated if not provided
|
|
181
|
+
|
|
182
|
+
## 2026.2.2
|
|
183
|
+
|
|
184
|
+
- 🐛 Fixed classic JSX transform for React 16 compatibility
|
|
185
|
+
- ✨ Added React 16.8+ support
|
|
186
|
+
|
|
187
|
+
## 2026.2.1
|
|
188
|
+
|
|
189
|
+
- 🎉 Initial release
|
|
190
|
+
- ✨ Lookup component with async search, expandable details, header/footer
|