@xh/hoist 83.1.0 → 84.0.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.
Files changed (250) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/admin/tabs/cluster/instances/logs/levels/LogLevelDialogModel.ts +106 -10
  3. package/admin/tabs/cluster/metrics/MetricsModel.ts +3 -3
  4. package/appcontainer/AppContainerModel.ts +1 -1
  5. package/appcontainer/README.md +20 -0
  6. package/assets.d.ts +34 -0
  7. package/build/types/cmp/ag-grid/AgGrid.d.ts +8 -19
  8. package/build/types/cmp/ag-grid/AgGridModel.d.ts +18 -5
  9. package/build/types/cmp/card/Card.d.ts +9 -4
  10. package/build/types/cmp/card/CardModel.d.ts +15 -2
  11. package/build/types/cmp/chart/Chart.d.ts +2 -2
  12. package/build/types/cmp/chart/ChartModel.d.ts +11 -1
  13. package/build/types/cmp/dataview/DataView.d.ts +4 -2
  14. package/build/types/cmp/dataview/DataViewModel.d.ts +16 -4
  15. package/build/types/cmp/filter/FilterChooserModel.d.ts +7 -1
  16. package/build/types/cmp/form/Form.d.ts +2 -1
  17. package/build/types/cmp/form/FormModel.d.ts +12 -0
  18. package/build/types/cmp/form/field/BaseFieldModel.d.ts +7 -0
  19. package/build/types/cmp/form/formfieldset/FormFieldSetModel.d.ts +7 -1
  20. package/build/types/cmp/grid/GridModel.d.ts +16 -1
  21. package/build/types/cmp/grid/GridSorter.d.ts +14 -0
  22. package/build/types/cmp/grid/Types.d.ts +18 -0
  23. package/build/types/cmp/grid/columns/Column.d.ts +40 -2
  24. package/build/types/cmp/grid/columns/ColumnGroup.d.ts +10 -0
  25. package/build/types/cmp/grouping/GroupingChooserModel.d.ts +9 -2
  26. package/build/types/cmp/layout/Box.d.ts +19 -7
  27. package/build/types/cmp/layout/Frame.d.ts +17 -5
  28. package/build/types/cmp/loadingindicator/LoadingIndicator.d.ts +6 -4
  29. package/build/types/cmp/pinpad/PinPadModel.d.ts +6 -1
  30. package/build/types/cmp/spinner/Spinner.d.ts +31 -10
  31. package/build/types/cmp/tab/TabContainerModel.d.ts +11 -0
  32. package/build/types/cmp/tab/TabModel.d.ts +7 -0
  33. package/build/types/cmp/tab/Types.d.ts +4 -0
  34. package/build/types/cmp/treemap/TreeMapModel.d.ts +3 -3
  35. package/build/types/cmp/viewmanager/ViewManagerModel.d.ts +9 -0
  36. package/build/types/cmp/zoneGrid/ZoneGridModel.d.ts +22 -3
  37. package/build/types/cmp/zoneGrid/impl/ZoneMapperModel.d.ts +6 -0
  38. package/build/types/core/HoistComponent.d.ts +29 -8
  39. package/build/types/core/HoistProps.d.ts +9 -3
  40. package/build/types/core/load/LoadSpec.d.ts +1 -1
  41. package/build/types/core/persist/provider/ViewManagerProvider.d.ts +7 -0
  42. package/build/types/data/Store.d.ts +35 -1
  43. package/build/types/data/StoreSelectionModel.d.ts +18 -2
  44. package/build/types/data/cube/Cube.d.ts +26 -6
  45. package/build/types/data/cube/Query.d.ts +10 -0
  46. package/build/types/data/cube/View.d.ts +21 -2
  47. package/build/types/data/cube/aggregate/Aggregator.d.ts +13 -0
  48. package/build/types/data/cube/aggregate/AverageAggregator.d.ts +1 -0
  49. package/build/types/data/cube/aggregate/AverageStrictAggregator.d.ts +1 -0
  50. package/build/types/data/cube/aggregate/ChildCountAggregator.d.ts +1 -0
  51. package/build/types/data/cube/aggregate/LeafCountAggregator.d.ts +1 -0
  52. package/build/types/data/cube/aggregate/MaxAggregator.d.ts +1 -0
  53. package/build/types/data/cube/aggregate/MinAggregator.d.ts +1 -0
  54. package/build/types/data/cube/aggregate/NullAggregator.d.ts +1 -0
  55. package/build/types/data/cube/aggregate/SingleAggregator.d.ts +1 -0
  56. package/build/types/data/cube/aggregate/SumAggregator.d.ts +1 -0
  57. package/build/types/data/cube/aggregate/SumStrictAggregator.d.ts +1 -0
  58. package/build/types/data/cube/aggregate/UniqueAggregator.d.ts +1 -0
  59. package/build/types/data/filter/BaseFilterFieldSpec.d.ts +9 -0
  60. package/build/types/data/filter/Types.d.ts +12 -0
  61. package/build/types/desktop/cmp/button/AppMenuButton.d.ts +5 -0
  62. package/build/types/desktop/cmp/button/Button.d.ts +5 -1
  63. package/build/types/desktop/cmp/dash/canvas/DashCanvasModel.d.ts +12 -3
  64. package/build/types/desktop/cmp/dash/container/DashContainerModel.d.ts +9 -0
  65. package/build/types/desktop/cmp/dock/DockViewModel.d.ts +7 -0
  66. package/build/types/desktop/cmp/filechooser/FileChooserModel.d.ts +8 -0
  67. package/build/types/desktop/cmp/grid/editors/BooleanEditor.d.ts +1 -0
  68. package/build/types/desktop/cmp/grid/editors/DateEditor.d.ts +1 -0
  69. package/build/types/desktop/cmp/grid/editors/NumberEditor.d.ts +1 -0
  70. package/build/types/desktop/cmp/grid/editors/SelectEditor.d.ts +1 -0
  71. package/build/types/desktop/cmp/grid/editors/TextAreaEditor.d.ts +1 -0
  72. package/build/types/desktop/cmp/grid/editors/TextEditor.d.ts +1 -0
  73. package/build/types/desktop/cmp/input/Picker.d.ts +1 -1
  74. package/build/types/desktop/cmp/input/SegmentedControl.d.ts +16 -2
  75. package/build/types/desktop/cmp/leftrightchooser/LeftRightChooserModel.d.ts +7 -0
  76. package/build/types/desktop/cmp/modalsupport/ModalSupportModel.d.ts +28 -2
  77. package/build/types/desktop/cmp/panel/Panel.d.ts +5 -2
  78. package/build/types/desktop/cmp/panel/PanelModel.d.ts +12 -2
  79. package/build/types/desktop/cmp/rest/RestGrid.d.ts +10 -0
  80. package/build/types/desktop/cmp/rest/RestGridModel.d.ts +9 -1
  81. package/build/types/desktop/cmp/toolbar/Toolbar.d.ts +4 -1
  82. package/build/types/format/FormatDate.d.ts +4 -4
  83. package/build/types/icon/Icon.d.ts +3 -0
  84. package/build/types/kit/blueprint/Wrappers.d.ts +12 -1
  85. package/build/types/mobile/cmp/navigator/NavigatorModel.d.ts +8 -0
  86. package/build/types/mobile/cmp/navigator/PageModel.d.ts +7 -0
  87. package/build/types/mobile/cmp/panel/DialogPanel.d.ts +0 -2
  88. package/build/types/security/BaseOAuthClient.d.ts +9 -0
  89. package/build/types/security/authzero/AuthZeroClient.d.ts +6 -0
  90. package/build/types/security/msal/MsalClient.d.ts +6 -0
  91. package/build/types/svc/FetchService.d.ts +10 -7
  92. package/build/types/svc/TraceService.d.ts +17 -2
  93. package/build/types/utils/async/Timer.d.ts +6 -0
  94. package/build/types/utils/js/LangUtils.d.ts +1 -1
  95. package/build/types/utils/js/TestUtils.d.ts +1 -1
  96. package/build/types/utils/react/index.d.ts +0 -1
  97. package/build/types/utils/telemetry/Span.d.ts +12 -2
  98. package/cmp/ag-grid/AgGrid.ts +8 -19
  99. package/cmp/ag-grid/AgGridModel.ts +18 -5
  100. package/cmp/card/Card.ts +9 -4
  101. package/cmp/card/CardModel.ts +15 -2
  102. package/cmp/chart/Chart.ts +2 -2
  103. package/cmp/chart/ChartModel.ts +11 -1
  104. package/cmp/dataview/DataView.ts +4 -2
  105. package/cmp/dataview/DataViewModel.ts +16 -4
  106. package/cmp/filter/FilterChooserModel.ts +7 -1
  107. package/cmp/form/Form.ts +2 -1
  108. package/cmp/form/FormModel.ts +12 -0
  109. package/cmp/form/README.md +13 -0
  110. package/cmp/form/field/BaseFieldModel.ts +7 -0
  111. package/cmp/form/formfieldset/FormFieldSetModel.ts +7 -1
  112. package/cmp/grid/Grid.scss +14 -8
  113. package/cmp/grid/GridModel.ts +16 -1
  114. package/cmp/grid/GridSorter.ts +14 -0
  115. package/cmp/grid/README.md +12 -0
  116. package/cmp/grid/Types.ts +18 -0
  117. package/cmp/grid/columns/Column.ts +40 -2
  118. package/cmp/grid/columns/ColumnGroup.ts +10 -0
  119. package/cmp/grouping/GroupingChooserModel.ts +9 -2
  120. package/cmp/layout/Box.ts +19 -7
  121. package/cmp/layout/Frame.ts +17 -5
  122. package/cmp/layout/README.md +16 -21
  123. package/cmp/loadingindicator/LoadingIndicator.scss +1 -1
  124. package/cmp/loadingindicator/LoadingIndicator.ts +11 -9
  125. package/cmp/pinpad/PinPadModel.ts +6 -1
  126. package/cmp/spinner/Spinner.scss +13 -0
  127. package/cmp/spinner/Spinner.ts +58 -20
  128. package/cmp/tab/TabContainerModel.ts +11 -0
  129. package/cmp/tab/TabModel.ts +7 -0
  130. package/cmp/tab/Types.ts +4 -0
  131. package/cmp/treemap/TreeMapModel.ts +3 -3
  132. package/cmp/viewmanager/ViewManagerModel.ts +9 -0
  133. package/cmp/zoneGrid/ZoneGridModel.ts +22 -3
  134. package/cmp/zoneGrid/impl/ZoneMapperModel.ts +6 -0
  135. package/core/ExceptionHandler.ts +1 -1
  136. package/core/HoistComponent.ts +36 -11
  137. package/core/HoistProps.ts +9 -3
  138. package/core/README.md +68 -6
  139. package/core/impl/InstanceManager.ts +1 -0
  140. package/core/load/LoadSpec.ts +1 -1
  141. package/core/persist/provider/ViewManagerProvider.ts +7 -0
  142. package/data/README.md +48 -124
  143. package/data/Store.ts +35 -1
  144. package/data/StoreSelectionModel.ts +18 -2
  145. package/data/cube/Cube.ts +26 -6
  146. package/data/cube/Query.ts +10 -0
  147. package/data/cube/README.md +236 -0
  148. package/data/cube/View.ts +21 -2
  149. package/data/cube/aggregate/Aggregator.ts +13 -0
  150. package/data/cube/aggregate/AverageAggregator.ts +1 -0
  151. package/data/cube/aggregate/AverageStrictAggregator.ts +1 -0
  152. package/data/cube/aggregate/ChildCountAggregator.ts +1 -0
  153. package/data/cube/aggregate/LeafCountAggregator.ts +1 -0
  154. package/data/cube/aggregate/MaxAggregator.ts +1 -0
  155. package/data/cube/aggregate/MinAggregator.ts +1 -0
  156. package/data/cube/aggregate/NullAggregator.ts +1 -0
  157. package/data/cube/aggregate/SingleAggregator.ts +1 -0
  158. package/data/cube/aggregate/SumAggregator.ts +1 -0
  159. package/data/cube/aggregate/SumStrictAggregator.ts +1 -0
  160. package/data/cube/aggregate/UniqueAggregator.ts +1 -0
  161. package/data/filter/BaseFilterFieldSpec.ts +9 -0
  162. package/data/filter/Types.ts +12 -0
  163. package/desktop/README.md +131 -9
  164. package/desktop/appcontainer/AboutDialog.ts +2 -0
  165. package/desktop/appcontainer/Banner.ts +5 -2
  166. package/desktop/appcontainer/ChangelogDialog.ts +1 -0
  167. package/desktop/appcontainer/ExceptionDialog.ts +4 -0
  168. package/desktop/appcontainer/ExceptionDialogDetails.ts +4 -1
  169. package/desktop/appcontainer/FeedbackDialog.ts +4 -1
  170. package/desktop/appcontainer/ImpersonationBar.ts +4 -0
  171. package/desktop/appcontainer/LockoutPanel.ts +4 -1
  172. package/desktop/appcontainer/LoginPanel.ts +7 -3
  173. package/desktop/appcontainer/Message.ts +9 -3
  174. package/desktop/appcontainer/OptionsDialog.ts +3 -1
  175. package/desktop/appcontainer/VersionBar.ts +1 -0
  176. package/desktop/appcontainer/suspend/IdlePanel.ts +4 -4
  177. package/desktop/appcontainer/suspend/SuspendPanel.ts +3 -0
  178. package/desktop/cmp/button/AppMenuButton.ts +5 -0
  179. package/desktop/cmp/button/Button.ts +14 -4
  180. package/desktop/cmp/dash/README.md +14 -0
  181. package/desktop/cmp/dash/canvas/DashCanvasModel.ts +12 -3
  182. package/desktop/cmp/dash/container/DashContainerModel.ts +9 -0
  183. package/desktop/cmp/dock/DockViewModel.ts +7 -0
  184. package/desktop/cmp/filechooser/FileChooserModel.ts +9 -2
  185. package/desktop/cmp/grid/editors/BooleanEditor.ts +1 -0
  186. package/desktop/cmp/grid/editors/DateEditor.ts +1 -0
  187. package/desktop/cmp/grid/editors/NumberEditor.ts +1 -0
  188. package/desktop/cmp/grid/editors/SelectEditor.ts +1 -0
  189. package/desktop/cmp/grid/editors/TextAreaEditor.ts +1 -0
  190. package/desktop/cmp/grid/editors/TextEditor.ts +1 -0
  191. package/desktop/cmp/input/Picker.ts +2 -2
  192. package/desktop/cmp/input/SegmentedControl.ts +20 -2
  193. package/desktop/cmp/leftrightchooser/LeftRightChooserModel.ts +7 -0
  194. package/desktop/cmp/modalsupport/ModalSupportModel.ts +31 -2
  195. package/desktop/cmp/panel/Panel.ts +29 -21
  196. package/desktop/cmp/panel/PanelModel.ts +12 -2
  197. package/desktop/cmp/panel/README.md +20 -0
  198. package/desktop/cmp/rest/RestGrid.ts +10 -0
  199. package/desktop/cmp/rest/RestGridModel.ts +9 -1
  200. package/desktop/cmp/toolbar/Toolbar.ts +9 -2
  201. package/desktop/cmp/viewmanager/ViewManager.ts +1 -1
  202. package/docs/README.md +9 -4
  203. package/docs/coding-conventions.md +29 -21
  204. package/docs/doc-registry.json +31 -15
  205. package/docs/planning/docs-roadmap-log.md +11 -0
  206. package/docs/planning/docs-roadmap.md +1 -0
  207. package/docs/upgrade-notes/v84-upgrade-notes.md +136 -0
  208. package/docs/version-compatibility.md +2 -0
  209. package/format/FormatDate.ts +4 -4
  210. package/icon/Icon.ts +9 -0
  211. package/icon/README.md +62 -22
  212. package/icon/index.ts +24 -0
  213. package/kit/README.md +8 -2
  214. package/kit/blueprint/Wrappers.ts +12 -1
  215. package/mcp/README.md +47 -26
  216. package/mcp/cli/ts.ts +39 -4
  217. package/mcp/data/ts-registry.ts +57 -17
  218. package/mcp/tools/typescript.ts +32 -4
  219. package/mobile/appcontainer/AboutDialog.ts +3 -0
  220. package/mobile/appcontainer/Banner.ts +2 -0
  221. package/mobile/appcontainer/ExceptionDialog.ts +4 -0
  222. package/mobile/appcontainer/ExceptionDialogDetails.ts +1 -0
  223. package/mobile/appcontainer/FeedbackDialog.ts +4 -1
  224. package/mobile/appcontainer/ImpersonationBar.ts +2 -0
  225. package/mobile/appcontainer/LockoutPanel.ts +2 -0
  226. package/mobile/appcontainer/LoginPanel.ts +7 -3
  227. package/mobile/appcontainer/Message.ts +9 -3
  228. package/mobile/appcontainer/OptionsDialog.ts +5 -1
  229. package/mobile/appcontainer/VersionBar.ts +1 -0
  230. package/mobile/appcontainer/suspend/IdlePanel.ts +5 -6
  231. package/mobile/appcontainer/suspend/SuspendPanel.ts +3 -0
  232. package/mobile/cmp/navigator/NavigatorModel.ts +8 -0
  233. package/mobile/cmp/navigator/PageModel.ts +7 -0
  234. package/mobile/cmp/panel/DialogPanel.ts +0 -2
  235. package/package.json +11 -11
  236. package/security/BaseOAuthClient.ts +9 -0
  237. package/security/authzero/AuthZeroClient.ts +6 -0
  238. package/security/msal/MsalClient.ts +6 -0
  239. package/styles/vars.scss +14 -0
  240. package/svc/FetchService.ts +25 -15
  241. package/svc/README.md +39 -9
  242. package/svc/TraceService.ts +69 -11
  243. package/utils/README.md +0 -1
  244. package/utils/async/Timer.ts +6 -0
  245. package/utils/js/LangUtils.ts +1 -1
  246. package/utils/js/TestUtils.ts +1 -1
  247. package/utils/react/index.ts +0 -1
  248. package/utils/telemetry/Span.ts +21 -4
  249. package/build/types/utils/react/ClassName.d.ts +0 -14
  250. package/utils/react/ClassName.ts +0 -24
package/CHANGELOG.md CHANGED
@@ -1,5 +1,81 @@
1
1
  # Changelog
2
2
 
3
+ ## 84.0.1 - 2026-04-20
4
+
5
+ ### 🐞 Bug Fixes
6
+
7
+ * Fixed an unrecoverable crash when calling `XH.prompt()` (and any other `FormField` rendered
8
+ without an explicit `model` prop). `InstanceManager.registerModelWithTestId()` dereferenced a
9
+ null model when a `testId` was supplied, introduced by the v84 expansion of `testId` coverage on
10
+ built-in appcontainer components.
11
+
12
+ ## 84.0.0 - 2026-04-15
13
+
14
+ ### 💥 Breaking Changes (upgrade difficulty: 🟢 LOW)
15
+
16
+ See [`docs/upgrade-notes/v84-upgrade-notes.md`](docs/upgrade-notes/v84-upgrade-notes.md) for
17
+ detailed, step-by-step upgrade instructions with before/after code examples.
18
+
19
+ * Requires `hoist-core >= 38.0`.
20
+ * Removed the `getClassName()` utility from `@xh/hoist/utils/react`. This function had no
21
+ remaining usages in the framework — the `className` spec field on `hoistCmp.factory()` /
22
+ `hoistCmp.withFactory()` handles base class merging automatically.
23
+
24
+ ### 🎁 New Features
25
+
26
+ * Updated FontAwesome to v7, bringing subtle visual tweaks and performance optimizations to Hoist's
27
+ icon library. All previously supported icons remain and no app changes should be required.
28
+ * Replaced animated PNG `Spinner` with a FontAwesome icon-based spinner, making it scalable,
29
+ themeable, and consistent with the rest of the icon system. The icon and weight can be
30
+ configured globally via `Spinner.defaults` or per-instance via props. A `usePng` flag is
31
+ available to preserve the original PNG appearance if desired.
32
+ * Added client-side span sampling to `TraceService`. Evaluates `xhTraceConfig.sampleRules` at span
33
+ creation, with child spans inheriting their parent's decision. Error spans are always exported
34
+ when `alwaysSampleErrors` is enabled. The `traceparent` header now propagates the sampling flag to
35
+ the server.
36
+ * `FetchOptions.span` now accepts a `string` or `SpanConfig` in addition to an existing `Span`.
37
+ When a string or config is provided, `FetchService` creates and manages the parent span
38
+ internally, simplifying a common tracing pattern for fetch calls.
39
+
40
+ ### 🤖 AI Docs + Tooling
41
+
42
+ * Added JSDoc to ~60 exported Config/Spec interfaces and improved class-level docs on key
43
+ framework classes. Added README cross-references, when-to-use guidance, and `@see` navigation
44
+ links throughout.
45
+ * Split Cube documentation into dedicated `data/cube/README.md` with expanded query patterns
46
+ covering grand totals, leaf drill-down, dynamic updates, and `executeQuery()`.
47
+ * Enhanced MCP/CLI symbol search to match JSDoc content with multi-word AND queries (e.g.
48
+ `"panel modal"` finds `ModalSupportModel`). Added disambiguation hints for duplicate symbol
49
+ names and fixed resolution of symbols shadowed by dynamics stubs.
50
+
51
+ ### ⚙️ Technical
52
+
53
+ * Added support for a typed `defaults` object on `hoistCmp` components — static config that apps
54
+ can override at bootstrap (e.g. `Button.defaults.minimal = false`). Instance props take
55
+ precedence. Added initial defaults to `Button`, `Panel`, `Spinner`, and `Toolbar`.
56
+ * Added `suppressStackTrace` and `includeStartMessages` fields to the Log Levels admin panel,
57
+ supporting the new hoist-core per-logger logging behavior overrides.
58
+ * Added `assets.d.ts` type declarations for image and markdown imports (`*.png`, `*.gif`, `*.jpg`,
59
+ `*.svg`, `*.md`), removing the need for `@ts-ignore` on asset imports.
60
+ * Added hardcoded `xh-` prefixed `testId` props to all desktop and mobile appcontainer components
61
+ for Playwright testing support.
62
+ * Namespaced auto-installed `TraceService` span and metric tags with an `xh.` prefix, aligning
63
+ with OTEL semantic conventions.
64
+
65
+ ### ✨ Styles
66
+
67
+ * Improved default grid tooltip styling — long strings now wrap at a configurable max-width
68
+ (`400px` default) using `pre-wrap`. New `--xh-grid-tooltip-*` CSS variables added for
69
+ app-level customization of background, border, border-radius, padding, and max-width.
70
+
71
+ ### 📚 Libraries
72
+
73
+ * @auth0/auth0-spa-js `2.17 → 2.19`
74
+ * @fortawesome/* `6.0 → 7.2`
75
+ * @fortawesome/react-fontawesome `0.2 → 3.2`
76
+ * dompurify `3.3 → 3.4`
77
+ * lodash `4.17 → 4.18`
78
+
3
79
  ## 83.1.0 - 2026-04-07
4
80
 
5
81
  ### 🐞 Bug Fixes
@@ -8,10 +8,13 @@ import {exportFilenameWithDate} from '@xh/hoist/admin/AdminUtils';
8
8
  import {AppModel} from '@xh/hoist/admin/AppModel';
9
9
  import * as Col from '@xh/hoist/admin/columns/Rest';
10
10
  import {LogViewerModel} from '@xh/hoist/admin/tabs/cluster/instances/logs/LogViewerModel';
11
+ import {ColumnSpec} from '@xh/hoist/cmp/grid';
11
12
  import {HoistModel, managed, lookup, LoadSpec} from '@xh/hoist/core';
12
13
  import {FieldSpec} from '@xh/hoist/data';
13
- import {textInput} from '@xh/hoist/desktop/cmp/input';
14
+ import {segmentedControl, textInput} from '@xh/hoist/desktop/cmp/input';
14
15
  import {RestGridModel} from '@xh/hoist/desktop/cmp/rest';
16
+ import {Icon} from '@xh/hoist/icon';
17
+ import {isNil} from 'lodash';
15
18
 
16
19
  /**
17
20
  * @internal
@@ -59,12 +62,44 @@ export class LogLevelDialogModel extends HoistModel {
59
62
  displayName: 'Package/Class',
60
63
  required: true
61
64
  },
62
- {name: 'level', type: 'string', displayName: 'Override', lookupName: 'levels'},
63
- {name: 'defaultLevel', type: 'string', displayName: 'Initial', editable: false},
65
+ {
66
+ name: 'level',
67
+ type: 'string',
68
+ displayName: 'Level Override',
69
+ lookupName: 'levels'
70
+ },
71
+ {
72
+ name: 'suppressStackTrace',
73
+ type: 'bool',
74
+ displayName: 'Suppress Stack'
75
+ },
76
+ {
77
+ name: 'includeStartMessages',
78
+ type: 'bool',
79
+ displayName: 'Start Msgs'
80
+ },
81
+ {
82
+ name: 'defaultLevel',
83
+ type: 'string',
84
+ displayName: 'Log Level',
85
+ editable: false
86
+ },
64
87
  {
65
88
  name: 'effectiveLevel',
66
89
  type: 'string',
67
- displayName: 'Effective',
90
+ displayName: 'Log Level (effective)',
91
+ editable: false
92
+ },
93
+ {
94
+ name: 'effectiveSuppressStackTrace',
95
+ type: 'bool',
96
+ displayName: 'Suppress Stack (effective)',
97
+ editable: false
98
+ },
99
+ {
100
+ name: 'effectiveIncludeStartMessages',
101
+ type: 'bool',
102
+ displayName: 'Start Msgs (effective)',
68
103
  editable: false
69
104
  },
70
105
  {...(Col.lastUpdated.field as FieldSpec), editable: false},
@@ -75,9 +110,45 @@ export class LogLevelDialogModel extends HoistModel {
75
110
  filterFields: ['name'],
76
111
  columns: [
77
112
  {field: 'name', width: 400},
78
- {field: 'defaultLevel', width: 110},
79
- {field: 'level', width: 110},
80
- {field: 'effectiveLevel', width: 110},
113
+ {
114
+ groupId: 'initial',
115
+ headerName: 'Initial',
116
+ headerAlign: 'center',
117
+ children: [{field: 'defaultLevel', width: 110}]
118
+ },
119
+ {
120
+ groupId: 'override',
121
+ headerName: 'Override',
122
+ headerAlign: 'center',
123
+ children: [
124
+ {
125
+ field: 'level',
126
+ headerName: 'Log Level',
127
+ width: 110,
128
+ renderer: v => (isNil(v) ? '-' : v)
129
+ },
130
+ {...customBoolCheckCol, field: 'suppressStackTrace'},
131
+ {...customBoolCheckCol, field: 'includeStartMessages'}
132
+ ]
133
+ },
134
+ {
135
+ groupId: 'effective',
136
+ headerName: 'Effective',
137
+ headerAlign: 'center',
138
+ children: [
139
+ {field: 'effectiveLevel', headerName: 'Log Level', width: 110},
140
+ {
141
+ ...customBoolCheckCol,
142
+ field: 'effectiveSuppressStackTrace',
143
+ headerName: 'Suppress Stack'
144
+ },
145
+ {
146
+ ...customBoolCheckCol,
147
+ field: 'effectiveIncludeStartMessages',
148
+ headerName: 'Start Msgs'
149
+ }
150
+ ]
151
+ },
81
152
  Col.lastUpdated,
82
153
  Col.lastUpdatedBy
83
154
  ],
@@ -87,13 +158,21 @@ export class LogLevelDialogModel extends HoistModel {
87
158
  formField: {
88
159
  item: textInput({
89
160
  placeholder: 'com.myapp.MyClassWithLogging (or partial path)'
90
- })
161
+ }),
162
+ info: 'Hint - leave in place with no overrides set below to easily adjust again later.'
91
163
  }
92
164
  },
165
+ {field: 'level'},
93
166
  {
94
- field: 'level',
167
+ field: 'suppressStackTrace',
95
168
  formField: {
96
- info: 'Hint - clear to leave at default while keeping record in place to adjust again later.'
169
+ item: segmentedControl({options: customBoolSegmentOptions})
170
+ }
171
+ },
172
+ {
173
+ field: 'includeStartMessages',
174
+ formField: {
175
+ item: segmentedControl({options: customBoolSegmentOptions})
97
176
  }
98
177
  },
99
178
  {field: 'lastUpdated'},
@@ -102,3 +181,20 @@ export class LogLevelDialogModel extends HoistModel {
102
181
  });
103
182
  }
104
183
  }
184
+
185
+ const customBoolSegmentOptions = [
186
+ {label: 'Inherit', value: null},
187
+ {label: 'On', value: true},
188
+ {label: 'Off', value: false}
189
+ ];
190
+
191
+ const customBoolCheckCol: ColumnSpec = {
192
+ align: 'center',
193
+ width: 120,
194
+ renderer: v =>
195
+ isNil(v)
196
+ ? '-'
197
+ : v
198
+ ? Icon.check({prefix: 'fas', intent: 'success'})
199
+ : Icon.cross({prefix: 'fas', intent: 'warning'})
200
+ };
@@ -176,8 +176,8 @@ export class MetricsModel extends BaseAdminTabModel {
176
176
  if (loadSpec.isStale) return;
177
177
 
178
178
  const enriched = data.map(it => {
179
- const instance = it.tags.find(t => t.key === 'instance')?.value,
180
- source = it.tags.find(t => t.key === 'source')?.value,
179
+ const instance = it.tags.find(t => t.key === 'xh.instance')?.value,
180
+ source = it.tags.find(t => t.key === 'xh.source')?.value,
181
181
  tags = sortTags(it.tags).map(t => `${t.key}: ${t.value}`);
182
182
  return {...it, instance, source, tags};
183
183
  });
@@ -282,7 +282,7 @@ export class MetricsModel extends BaseAdminTabModel {
282
282
  }
283
283
  }
284
284
 
285
- const PRIORITY_KEYS = ['application', 'source', 'instance'];
285
+ const PRIORITY_KEYS = ['xh.application', 'xh.source', 'xh.instance'];
286
286
 
287
287
  function sortTags(tags: {key: string; value: string}[]) {
288
288
  return [...tags].sort((a, b) => {
@@ -360,7 +360,7 @@ export class AppContainerModel extends HoistModel {
360
360
  let startTime = loadStarted;
361
361
 
362
362
  const emit = (name: string, duration: number, parent?: Span): Span => {
363
- const span = svc.createSpan({name, parent, startTime, tags: {source: 'hoist'}});
363
+ const span = svc.createSpan({name, parent, startTime, tags: {'xh.source': 'hoist'}});
364
364
  if (span) {
365
365
  span.endTime = startTime + duration;
366
366
  span.status = 'ok';
@@ -1,5 +1,25 @@
1
1
  # AppContainer Package
2
2
 
3
+ | Section | Description |
4
+ |---------|-------------|
5
+ | [Overview](#overview) | App shell purpose and AppContainerModel coordination |
6
+ | [Architecture](#architecture) | Directory structure and sub-model ownership |
7
+ | [Messages](#messages) | Modal dialogs: alert, confirm, prompt, and message API |
8
+ | [Toasts](#toasts) | Non-modal notifications with auto-dismiss and actions |
9
+ | [Banners](#banners) | Persistent app-wide messages across the viewport |
10
+ | [Exception Handling](#exception-handling) | Centralized error logging, reporting, and display |
11
+ | [App Options Dialog](#app-options-dialog) | User-configurable preferences UI |
12
+ | [Theme](#theme) | Light, dark, and system-matching theme management |
13
+ | [Sizing Mode](#sizing-mode) | UI density control: compact, standard, large |
14
+ | [Viewport & Device Detection](#viewport--device-detection) | Browser dimensions, orientation, and device classification |
15
+ | [About Dialog & Changelog](#about-dialog--changelog) | App info display and release notes |
16
+ | [Feedback Dialog](#feedback-dialog) | User feedback collection via TrackService |
17
+ | [Impersonation](#impersonation) | Admin impersonation bar for debugging and support |
18
+ | [Routing](#routing) | Client-side routing via Router5 with observable state |
19
+ | [Login Panel](#login-panel) | Username/password authentication for non-SSO apps |
20
+ | [Version Bar](#version-bar) | Desktop footer with app info and quick-access icons |
21
+ | [Related Packages](#related-packages) | Links to related hoist-react packages and docs |
22
+
3
23
  ## Overview
4
24
 
5
25
  The `/appcontainer/` package is the framework's application shell — it orchestrates the app
package/assets.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Ambient type declarations for non-code asset imports (images, markdown).
3
+ *
4
+ * These allow TypeScript to understand `import img from './foo.png'` without @ts-ignore.
5
+ * Webpack's asset loaders resolve these imports to string URLs at build time.
6
+ *
7
+ * Note: as ambient declarations, these are visible to downstream apps that resolve into
8
+ * hoist-react's source directory via path mapping. This is intentional — all Hoist apps
9
+ * share the same Webpack build tooling and loader configuration.
10
+ */
11
+ declare module '*.png' {
12
+ const src: string;
13
+ export default src;
14
+ }
15
+
16
+ declare module '*.gif' {
17
+ const src: string;
18
+ export default src;
19
+ }
20
+
21
+ declare module '*.jpg' {
22
+ const src: string;
23
+ export default src;
24
+ }
25
+
26
+ declare module '*.svg' {
27
+ const src: string;
28
+ export default src;
29
+ }
30
+
31
+ declare module '*.md' {
32
+ const content: string;
33
+ export default content;
34
+ }
@@ -5,26 +5,15 @@ import { AgGridModel } from './AgGridModel';
5
5
  export interface AgGridProps extends HoistProps<AgGridModel>, GridOptions, LayoutProps, TestSupportProps {
6
6
  }
7
7
  /**
8
- * Minimal wrapper for AgGridReact, supporting direct use of the ag-Grid component with limited
9
- * enhancements for consistent Hoist themes/styling, layout support, and a
10
- * backing model for convenient access to the ag-Grid APIs and other utility methods.
8
+ * Low-level escape hatch for direct use of ag-Grid - most applications should use the standard
9
+ * Hoist {@link Grid} component and {@link GridModel} instead.
11
10
  *
12
- * All ag-Grid Grid Properties can be passed as props directly to this component.
13
- * See {@link https://www.ag-grid.com/javascript-grid-properties/}. Pass an {@link AgGridModel}
14
- * via the `model` prop to control additional Hoist customizations.
11
+ * This minimal wrapper around AgGridReact provides Hoist theming/styling, layout support, and
12
+ * an {@link AgGridModel} for access to the ag-Grid APIs. All ag-Grid Grid Properties can be
13
+ * passed as props directly. It is intended for advanced use cases that require ag-Grid features
14
+ * not yet exposed by the managed Hoist Grid layer (most notably pivoting).
15
15
  *
16
- * This component complements and contrasts with the primary Hoist `Grid` class, which provides a
17
- * significantly more managed and opinionated use of ag-Grid and a number of Hoist-specific
18
- * extensions and customizations. That fully managed component is expected to cover the majority of
19
- * use cases within Hoist apps and is recommended as the primary grid class within the toolkit.
20
- *
21
- * This wrapper is provided for advanced usages of grid that wish to leverage features of the
22
- * underlying component not yet supported by the Hoist layer - most notably pivoting - where the
23
- * managed option would conflict with or complicate access to those features.
24
- *
25
- * Note that this component uses the ag-Grid `getRowHeight` prop to provide the grid with row
26
- * heights. As of 4/2023, this may cause scrolling to be slow in large data sets, and
27
- * applications may wish to set this prop to `null` and use either a fixed `rowWidth` property, or
28
- * an explicit per-row setting instead. See GridModel for a more efficient, data aware approach.
16
+ * @see Grid
17
+ * @see GridModel
29
18
  */
30
19
  export declare const AgGrid: any, agGrid: import("@xh/hoist/core").ElementFactory<AgGridProps>;
@@ -1,6 +1,16 @@
1
1
  import { HoistModel, PlainObject, SizingMode, Some } from '@xh/hoist/core';
2
2
  import type { GridApi, IRowNode, SortDirection } from '@xh/hoist/kit/ag-grid';
3
3
  import { GridSorterLike } from '../grid/GridSorter';
4
+ /**
5
+ * Configuration for an {@link AgGridModel} - the low-level model backing the Hoist `AgGrid`
6
+ * component. This interface is only relevant when using `AgGrid` directly for advanced or
7
+ * minimally-managed ag-Grid use cases. Most applications should use {@link GridConfig} and
8
+ * the standard {@link GridModel} instead, which extends this with columns, store binding,
9
+ * selection, filtering, and other managed features.
10
+ *
11
+ * @see AgGridModel
12
+ * @see GridConfig
13
+ */
4
14
  export interface AgGridModelConfig {
5
15
  sizingMode?: SizingMode;
6
16
  /** True to highlight the currently hovered row. */
@@ -44,12 +54,15 @@ export interface AgGridState {
44
54
  errors?: Record<string, string>;
45
55
  }
46
56
  /**
47
- * Model for an AgGrid, provides reactive support for setting grid styling as well as access to the
48
- * ag-Grid API and Column API references for interacting with ag-Grid.
57
+ * Low-level model backing the {@link AgGrid} escape-hatch component - most applications should
58
+ * use {@link GridModel} instead, which extends this class with columns, store binding,
59
+ * selection, filtering, and other managed features.
60
+ *
61
+ * Provides reactive grid styling properties, access to the ag-Grid API, and utility methods
62
+ * for getting/setting serializable grid state.
49
63
  *
50
- * Also provides a series of utility methods that are generally useful when managing grid state.
51
- * This includes the ability to get and set the full state of the grid in a serializable form,
52
- * allowing applications to save "views" of the grid.
64
+ * @see AgGridModelConfig
65
+ * @see GridModel
53
66
  */
54
67
  export declare class AgGridModel extends HoistModel {
55
68
  static AUTO_GROUP_COL_ID: string;
@@ -15,9 +15,14 @@ export interface CardProps<M extends CardModel = CardModel> extends HoistProps<M
15
15
  contentBoxProps?: BoxProps;
16
16
  }
17
17
  /**
18
- * A bordered container for grouping related content with optional inline header and collapsibility.
19
- * Children are arranged vertically in a flexbox container by default. contentBoxProps can be
20
- * passed to control the flex direction and other layout aspects of the content container.
21
- * This component leverages an HTML fieldset and legend to provide base styling.
18
+ * A bordered container for grouping related content, rendered as an HTML fieldset/legend.
19
+ * Supports an optional inline header (`title`, `icon`, `intent`) and user-driven
20
+ * collapse/expand via its backing {@link CardModel}.
21
+ *
22
+ * Children are arranged vertically in a flexbox container by default - pass
23
+ * `contentBoxProps` to customize the content layout.
24
+ *
25
+ * @see CardModel
26
+ * @see FormFieldSet
22
27
  */
23
28
  export declare const Card: import("react").FC<CardProps<CardModel>>, card: import("@xh/hoist/core").ElementFactory<CardProps<CardModel>>;
@@ -1,4 +1,11 @@
1
1
  import { HoistModel, Persistable, PersistableState, PersistOptions, RenderMode } from '@xh/hoist/core';
2
+ /**
3
+ * Configuration for a {@link CardModel}. A CardModel is created automatically by {@link Card}
4
+ * when not provided explicitly - pass a config via the Card's `model` prop to customize.
5
+ *
6
+ * @see CardModel
7
+ * @see Card
8
+ */
2
9
  export interface CardModelConfig {
3
10
  /** Can card be collapsed? */
4
11
  collapsible?: boolean;
@@ -13,8 +20,14 @@ export interface CardPersistState {
13
20
  collapsed?: boolean;
14
21
  }
15
22
  /**
16
- * CardModel supports configuration and state-management for user-driven expand/collapse,
17
- * along with support for saving this state via a configured PersistenceProvider.
23
+ * Model for a {@link Card} - manages collapsible state and render mode for the Card's content.
24
+ * Created automatically by Card when not provided - pass via the Card's `model` prop to
25
+ * customize collapsibility, default state, or persistence.
26
+ *
27
+ * Also serves as the base class for {@link FormFieldSetModel}.
28
+ *
29
+ * @see CardModelConfig
30
+ * @see Card
18
31
  */
19
32
  export declare class CardModel extends HoistModel implements Persistable<CardPersistState> {
20
33
  config: CardModelConfig;
@@ -11,7 +11,7 @@ export interface ChartProps<M extends ChartModel = ChartModel> extends HoistProp
11
11
  }
12
12
  /**
13
13
  * Wrapper Component for a Highcharts chart. Provides basic rendering / lifecycle management
14
- * as well as configuration and theme defaults. The chart's core configuration should be sourced
15
- * from a ChartModel prop passed to this component.
14
+ * as well as configuration and theme defaults. Sourced from a {@link ChartModel}, either
15
+ * passed directly via the `model` prop or resolved from context.
16
16
  */
17
17
  export declare const Chart: import("react").FC<ChartProps<ChartModel>>, chart: import("@xh/hoist/core").ElementFactory<ChartProps<ChartModel>>;
@@ -16,7 +16,17 @@ export interface ChartModelDefaults {
16
16
  contextMenu?: ChartMenuToken[];
17
17
  }
18
18
  /**
19
- * Model to hold and maintain the configuration and data series for a Highcharts chart.
19
+ * Model for a Highcharts-based {@link Chart} component. Holds the Highcharts configuration
20
+ * object and data series, providing observable state that drives chart rendering.
21
+ *
22
+ * Set `highchartsConfig` for chart-level options (chart type, axes, legend, etc.) and
23
+ * `series` for the data to display. Both are observable and can be updated at any time
24
+ * via their setters to trigger a re-render.
25
+ *
26
+ * The underlying Highcharts instance is available via the `highchart` property for
27
+ * read-only access - mutations should go through `setHighchartsConfig` or `setSeries`.
28
+ *
29
+ * @see Chart
20
30
  */
21
31
  export declare class ChartModel extends HoistModel {
22
32
  /** App-level defaults for ChartModel. Instance config takes precedence. */
@@ -15,7 +15,9 @@ export interface DataViewProps<M extends DataViewModel = DataViewModel> extends
15
15
  agOptions?: GridOptions;
16
16
  }
17
17
  /**
18
- * A DataView is a specialized version of the Grid component. It displays its data within a
19
- * single column, using a configured component for rendering each item.
18
+ * A DataView is a specialized version of the {@link Grid} component. It displays its data within
19
+ * a single column, using a configured component for rendering each item.
20
+ *
21
+ * @see DataViewModel
20
22
  */
21
23
  export declare const DataView: import("react").FC<DataViewProps<DataViewModel>>, dataView: import("@xh/hoist/core").ElementFactory<DataViewProps<DataViewModel>>;
@@ -4,7 +4,10 @@ import { HoistModel, LoadSpec, PlainObject, Some } from '@xh/hoist/core';
4
4
  import { Store, StoreConfig, StoreRecord, StoreRecordOrId, StoreSelectionConfig, StoreSelectionModel, StoreTransaction } from '@xh/hoist/data';
5
5
  import { ReactNode } from 'react';
6
6
  /**
7
- * Configuration for a DataView.
7
+ * Configuration for a {@link DataViewModel} - a list-style data component that renders
8
+ * each record using a custom `renderer` function. Built on {@link GridModel} internally.
9
+ *
10
+ * @see DataViewModel
8
11
  */
9
12
  export interface DataViewConfig {
10
13
  /** A Store instance, or a config to create one. */
@@ -80,10 +83,19 @@ export type ItemHeightFn = (params: {
80
83
  agParams: RowHeightParams;
81
84
  }) => number;
82
85
  /**
83
- * DataViewModel is a wrapper around GridModel, which shows sorted data in a single column,
84
- * using a configured component for rendering each item.
86
+ * Model for a {@link DataView} - a list-style data component that renders each record
87
+ * using a custom `renderer` function. Built on {@link GridModel} internally.
88
+ *
89
+ * Use DataView when you need full control over how each row is rendered as a single
90
+ * custom element (e.g. a card or summary tile), as opposed to the column-based layout
91
+ * of a standard Grid. For a middle ground with multi-zone row layouts, see
92
+ * {@link ZoneGridModel}.
93
+ *
94
+ * Key configs: `renderer` (required - produces the visual for each row), `itemHeight`,
95
+ * `groupBy`, and standard store/selection options inherited from GridModel.
85
96
  *
86
- * This is the primary app entry-point for specifying DataView component options and behavior.
97
+ * @see DataView
98
+ * @see DataViewConfig
87
99
  */
88
100
  export declare class DataViewModel extends HoistModel {
89
101
  gridModel: GridModel;
@@ -5,6 +5,12 @@ import { ReactNode } from 'react';
5
5
  import { FilterChooserFieldSpec, FilterChooserFieldSpecConfig } from './FilterChooserFieldSpec';
6
6
  import { FilterChooserOption } from './impl/Option';
7
7
  import { QueryEngine } from './impl/QueryEngine';
8
+ /**
9
+ * Configuration for a {@link FilterChooserModel} - an interactive, tokenized filter builder
10
+ * that binds to a {@link Store} or Cube {@link View}.
11
+ *
12
+ * @see FilterChooserModel
13
+ */
8
14
  export interface FilterChooserConfig {
9
15
  /**
10
16
  * Specifies the fields this model supports for filtering and customizes how their available values
@@ -73,7 +79,7 @@ export interface FilterChooserConfig {
73
79
  * across multiple data fields.
74
80
  *
75
81
  * Manages the current filter value, user-managed favorites, and available field specs. Supports
76
- * bidirectional binding to a {@link Store} or Cube {@link View} via the `bind` config filters
82
+ * bidirectional binding to a {@link Store} or Cube {@link View} via the `bind` config - filters
77
83
  * are automatically applied to the target as they change, and external filter changes on the
78
84
  * target are reflected back into this model.
79
85
  *
@@ -20,7 +20,8 @@ export declare const FormContext: import("react").Context<FormContextType>;
20
20
  export interface FormProps<M extends FormModel = FormModel> extends HoistProps<M>, TestSupportProps {
21
21
  /**
22
22
  * Defaults for certain props on child/nested FormFields.
23
- * @see FormField (note there are both desktop and mobile implementations).
23
+ * Note there are both desktop and mobile implementations of FormField.
24
+ * @see FormField
24
25
  */
25
26
  fieldDefaults?: Partial<BaseFormFieldProps> & DefaultHoistProps;
26
27
  }
@@ -2,6 +2,15 @@ import { HoistModel, PersistOptions, PlainObject } from '@xh/hoist/core';
2
2
  import { ValidationState } from '@xh/hoist/data';
3
3
  import { BaseFieldConfig, BaseFieldModel } from './field/BaseFieldModel';
4
4
  import { SubformsFieldConfig, SubformsFieldModel } from './field/SubformsFieldModel';
5
+ /**
6
+ * Configuration for a {@link FormModel}. Provide `fields` to define the form's data schema
7
+ * and validation rules. Optionally supply `initialValues` to pre-populate the form.
8
+ *
9
+ * See the form package README (`cmp/form/README.md`) for usage patterns and validation.
10
+ *
11
+ * @see FormModel
12
+ * @see BaseFieldConfig
13
+ */
5
14
  export interface FormConfig {
6
15
  /** FieldModels, or configs to create them, for all data fields managed by the model. */
7
16
  fields?: Array<BaseFieldModel | BaseFieldConfig | SubformsFieldConfig | SubformsFieldModel>;
@@ -46,6 +55,9 @@ export interface FormValidateOptions {
46
55
  * where each split has its own internal fields for broker, quantity, and time).
47
56
  *
48
57
  * See {@link FieldModel} for details on state/validation maintained at the individual field level.
58
+ *
59
+ * See the form package README (`cmp/form/README.md`) for full documentation including field
60
+ * configuration, validation patterns, and FormField component binding.
49
61
  */
50
62
  export declare class FormModel extends HoistModel {
51
63
  /** Container object for FieldModel instances, keyed by field name.*/
@@ -1,6 +1,13 @@
1
1
  import { HoistModel } from '@xh/hoist/core';
2
2
  import { Rule, RuleLike, ValidationResult, ValidationState } from '@xh/hoist/data';
3
3
  import { FormModel } from '../FormModel';
4
+ /**
5
+ * Configuration for a {@link BaseFieldModel} - defines a single field within a
6
+ * {@link FormModel} including its name, initial value, and validation rules.
7
+ *
8
+ * @see FieldModel
9
+ * @see FormConfig
10
+ */
4
11
  export interface BaseFieldConfig {
5
12
  /** Unique name for this field within its parent FormModel. */
6
13
  name: string;
@@ -2,6 +2,12 @@ import { CardModel } from '@xh/hoist/cmp/card/CardModel';
2
2
  import { FieldModel } from '@xh/hoist/cmp/form';
3
3
  import { type PersistOptions } from '@xh/hoist/core';
4
4
  import { ValidationSeverity } from '@xh/hoist/data';
5
+ /**
6
+ * Configuration for a {@link FormFieldSetModel} - a collapsible container for grouping
7
+ * related form fields with aggregated validation state.
8
+ *
9
+ * @see FormFieldSetModel
10
+ */
5
11
  export interface FormFieldSetConfig {
6
12
  /** Can form field set be collapsed? */
7
13
  collapsible?: boolean;
@@ -15,7 +21,7 @@ export interface FormFieldSetConfig {
15
21
  persistWith?: PersistOptions;
16
22
  }
17
23
  /**
18
- * Model for a FormFieldSet a collapsible container for grouping related form fields.
24
+ * Model for a FormFieldSet - a collapsible container for grouping related form fields.
19
25
  *
20
26
  * Aggregates validation state from all descendant FieldModels and child FormFieldSetModels,
21
27
  * and supports disabling or setting readonly state on all contained fields at once.