@multiplatform.one/frappe-ui 7.7.4 → 7.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/ChartCard.native.js.map +1 -1
- package/dist/cjs/FileBrowser/AttachLibrary.native.js.map +1 -1
- package/dist/cjs/FileBrowser/folderTree.native.js.map +1 -1
- package/dist/cjs/FileBrowser/index.native.js.map +1 -1
- package/dist/cjs/FileBrowser/types.native.js.map +1 -1
- package/dist/cjs/FileBrowser/viewPersistence.native.js.map +1 -1
- package/dist/cjs/FormSidebar.native.js.map +1 -1
- package/dist/cjs/FrappeAssignment.cjs +1 -0
- package/dist/cjs/FrappeAssignment.native.js +1 -0
- package/dist/cjs/FrappeAssignment.native.js.map +1 -1
- package/dist/cjs/FrappeCalendar.cjs +22 -18
- package/dist/cjs/FrappeCalendar.native.js +24 -22
- package/dist/cjs/FrappeCalendar.native.js.map +1 -1
- package/dist/cjs/FrappeChartCard.cjs +1 -0
- package/dist/cjs/FrappeChartCard.native.js +1 -0
- package/dist/cjs/FrappeChartCard.native.js.map +1 -1
- package/dist/cjs/FrappeConnectionIndicator.native.js.map +1 -1
- package/dist/cjs/FrappeDashboard.cjs +1 -0
- package/dist/cjs/FrappeDashboard.native.js +1 -0
- package/dist/cjs/FrappeDashboard.native.js.map +1 -1
- package/dist/cjs/FrappeForm.cjs +3 -2
- package/dist/cjs/FrappeForm.native.js +4 -3
- package/dist/cjs/FrappeForm.native.js.map +1 -1
- package/dist/cjs/FrappeGantt.cjs +27 -35
- package/dist/cjs/FrappeGantt.native.js +29 -39
- package/dist/cjs/FrappeGantt.native.js.map +1 -1
- package/dist/cjs/FrappeImageView.cjs +6 -3
- package/dist/cjs/FrappeImageView.native.js +10 -5
- package/dist/cjs/FrappeImageView.native.js.map +1 -1
- package/dist/cjs/FrappeKPICard.cjs +27 -1
- package/dist/cjs/FrappeKPICard.native.js +27 -1
- package/dist/cjs/FrappeKPICard.native.js.map +1 -1
- package/dist/cjs/FrappeKanban.cjs +18 -18
- package/dist/cjs/FrappeKanban.native.js +20 -22
- package/dist/cjs/FrappeKanban.native.js.map +1 -1
- package/dist/cjs/FrappeLikedBy.cjs +2 -1
- package/dist/cjs/FrappeLikedBy.native.js +2 -1
- package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
- package/dist/cjs/FrappeList.cjs +4 -3
- package/dist/cjs/FrappeList.native.js +4 -3
- package/dist/cjs/FrappeList.native.js.map +1 -1
- package/dist/cjs/FrappeListView.cjs +1 -0
- package/dist/cjs/FrappeListView.native.js +1 -0
- package/dist/cjs/FrappeListView.native.js.map +1 -1
- package/dist/cjs/FrappeProvider.cjs +3 -1
- package/dist/cjs/FrappeProvider.native.js +3 -1
- package/dist/cjs/FrappeProvider.native.js.map +1 -1
- package/dist/cjs/FrappeReconnectIndicator.native.js.map +1 -1
- package/dist/cjs/FrappeReportBuilder.cjs +3 -2
- package/dist/cjs/FrappeReportBuilder.native.js +3 -2
- package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
- package/dist/cjs/FrappeReportView.cjs +2 -1
- package/dist/cjs/FrappeReportView.native.js +5 -4
- package/dist/cjs/FrappeReportView.native.js.map +1 -1
- package/dist/cjs/FrappeTable.cjs +37 -39
- package/dist/cjs/FrappeTable.native.js +40 -40
- package/dist/cjs/FrappeTable.native.js.map +1 -1
- package/dist/cjs/FrappeTreeView.cjs +87 -51
- package/dist/cjs/FrappeTreeView.native.js +131 -51
- package/dist/cjs/FrappeTreeView.native.js.map +1 -1
- package/dist/cjs/SyncErrorNotice.native.js.map +1 -1
- package/dist/cjs/commentActions.cjs +1 -1
- package/dist/cjs/commentActions.native.js +1 -1
- package/dist/cjs/commentActions.native.js.map +1 -1
- package/dist/cjs/components/attachments.cjs +1 -0
- package/dist/cjs/components/attachments.native.js +1 -0
- package/dist/cjs/components/attachments.native.js.map +1 -1
- package/dist/cjs/components/tags.cjs +1 -0
- package/dist/cjs/components/tags.native.js +1 -0
- package/dist/cjs/components/tags.native.js.map +1 -1
- package/dist/cjs/components/timeline.cjs +2 -1
- package/dist/cjs/components/timeline.native.js +2 -1
- package/dist/cjs/components/timeline.native.js.map +1 -1
- package/dist/cjs/dependsOn.native.js.map +1 -1
- package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
- package/dist/cjs/desk/DeskFormSidebar.cjs +1 -0
- package/dist/cjs/desk/DeskFormSidebar.native.js +1 -0
- package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/cjs/desk/DeskListPage.native.js.map +1 -1
- package/dist/cjs/desk/DeskShell.cjs +2 -0
- package/dist/cjs/desk/DeskShell.native.js +2 -0
- package/dist/cjs/desk/DeskShell.native.js.map +1 -1
- package/dist/cjs/desk/DeskSidebar.cjs +1 -0
- package/dist/cjs/desk/DeskSidebar.native.js +1 -0
- package/dist/cjs/desk/DeskSidebar.native.js.map +1 -1
- package/dist/cjs/desk/awesomebar.cjs +2 -1
- package/dist/cjs/desk/awesomebar.native.js +2 -1
- package/dist/cjs/desk/awesomebar.native.js.map +1 -1
- package/dist/cjs/fieldOverrides.native.js.map +1 -1
- package/dist/cjs/fieldRegistry.cjs +1 -0
- package/dist/cjs/fieldRegistry.native.js +32 -31
- package/dist/cjs/fieldRegistry.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
- package/dist/cjs/fields/Check/index.native.js.map +1 -1
- package/dist/cjs/fields/CodeEditor/index.native.js.map +1 -1
- package/dist/cjs/fields/Color/index.native.js.map +1 -1
- package/dist/cjs/fields/Data/index.native.js.map +1 -1
- package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +1 -1
- package/dist/cjs/fields/Date/types.native.js.map +1 -1
- package/dist/cjs/fields/Date/wire.native.js.map +1 -1
- package/dist/cjs/fields/DateRange/index.native.js.map +1 -1
- package/dist/cjs/fields/Duration/index.native.js.map +1 -1
- package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload.cjs +1 -0
- package/dist/cjs/fields/FileUpload.native.js +1 -0
- package/dist/cjs/fields/FileUpload.native.js.map +1 -1
- package/dist/cjs/fields/FileUploadField/index.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
- package/dist/cjs/fields/HTML/index.native.js.map +1 -1
- package/dist/cjs/fields/Heading/index.native.js.map +1 -1
- package/dist/cjs/fields/Icon/index.native.js.map +1 -1
- package/dist/cjs/fields/Link.cjs +1 -0
- package/dist/cjs/fields/Link.native.js +1 -0
- package/dist/cjs/fields/Link.native.js.map +1 -1
- package/dist/cjs/fields/LinkTree.cjs +2 -1
- package/dist/cjs/fields/LinkTree.native.js +2 -1
- package/dist/cjs/fields/LinkTree.native.js.map +1 -1
- package/dist/cjs/fields/LongText/index.native.js.map +1 -1
- package/dist/cjs/fields/MentionInput/index.cjs +4 -1
- package/dist/cjs/fields/MentionInput/index.native.js +4 -1
- package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
- package/dist/cjs/fields/Numeric/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
- package/dist/cjs/fields/Password/index.native.js.map +1 -1
- package/dist/cjs/fields/Phone/index.native.js.map +1 -1
- package/dist/cjs/fields/Progress/index.native.js.map +1 -1
- package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/Rating/index.native.js.map +1 -1
- package/dist/cjs/fields/ReadOnly/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Signature/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/index.native.js.map +1 -1
- package/dist/cjs/fields/SmallText/index.native.js.map +1 -1
- package/dist/cjs/fields/Switch/index.native.js.map +1 -1
- package/dist/cjs/fields/TableMultiSelect.cjs +1 -0
- package/dist/cjs/fields/TableMultiSelect.native.js +1 -0
- package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/cjs/fields/TextEditor/types.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
- package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/shared/EditorPreviewPanes.native.js.map +1 -1
- package/dist/cjs/filterFields.native.js.map +1 -1
- package/dist/cjs/formEngine/createPrefill.native.js.map +1 -1
- package/dist/cjs/formEngine/dirtyTracking.native.js.map +1 -1
- package/dist/cjs/formEngine/doctypeMeta.native.js.map +1 -1
- package/dist/cjs/formEngine/fetchFrom.native.js.map +1 -1
- package/dist/cjs/formEngine/fieldPermissions.native.js.map +1 -1
- package/dist/cjs/formEngine/formActions.native.js.map +1 -1
- package/dist/cjs/formEngine/formLayout.native.js.map +1 -1
- package/dist/cjs/formEngine/index.native.js.map +1 -1
- package/dist/cjs/formEngine/useFormEngine.native.js.map +1 -1
- package/dist/cjs/frappeEventColor.native.js.map +1 -1
- package/dist/cjs/frappeStoryTarget.native.js.map +1 -1
- package/dist/cjs/frappeUsers.cjs +1 -0
- package/dist/cjs/frappeUsers.native.js +1 -0
- package/dist/cjs/frappeUsers.native.js.map +1 -1
- package/dist/cjs/index.cjs +4 -0
- package/dist/cjs/index.native.js +38 -34
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/liveErrors.native.js.map +1 -1
- package/dist/cjs/resolveControl.native.js.map +1 -1
- package/dist/cjs/schemaForm/SchemaWizard.native.js.map +1 -1
- package/dist/cjs/schemaForm/applyFieldOrder.native.js.map +1 -1
- package/dist/cjs/schemaForm/index.cjs +10 -9
- package/dist/cjs/schemaForm/index.native.js +11 -10
- package/dist/cjs/schemaForm/index.native.js.map +1 -1
- package/dist/cjs/shared/devWarn.cjs +40 -0
- package/dist/cjs/shared/devWarn.native.js +45 -0
- package/dist/cjs/shared/devWarn.native.js.map +1 -0
- package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/cjs/syncError.native.js.map +1 -1
- package/dist/cjs/useFrappeAggregate.cjs +15 -8
- package/dist/cjs/useFrappeAggregate.native.js +15 -9
- package/dist/cjs/useFrappeAggregate.native.js.map +1 -1
- package/dist/cjs/useFrappeFacets.cjs +10 -9
- package/dist/cjs/useFrappeFacets.native.js +10 -10
- package/dist/cjs/useFrappeFacets.native.js.map +1 -1
- package/dist/cjs/useFrappePagination.native.js.map +1 -1
- package/dist/cjs/useFrappeRows.cjs +113 -0
- package/dist/cjs/useFrappeRows.native.js +129 -0
- package/dist/cjs/useFrappeRows.native.js.map +1 -0
- package/dist/esm/ChartCard.native.js.map +1 -1
- package/dist/esm/FileBrowser/AttachLibrary.native.js.map +1 -1
- package/dist/esm/FileBrowser/folderTree.native.js.map +1 -1
- package/dist/esm/FileBrowser/index.native.js.map +1 -1
- package/dist/esm/FileBrowser/types.native.js.map +1 -1
- package/dist/esm/FileBrowser/viewPersistence.native.js.map +1 -1
- package/dist/esm/FormSidebar.native.js.map +1 -1
- package/dist/esm/FrappeAssignment.mjs +1 -0
- package/dist/esm/FrappeAssignment.mjs.map +1 -1
- package/dist/esm/FrappeAssignment.native.js +1 -0
- package/dist/esm/FrappeAssignment.native.js.map +1 -1
- package/dist/esm/FrappeCalendar.mjs +22 -18
- package/dist/esm/FrappeCalendar.mjs.map +1 -1
- package/dist/esm/FrappeCalendar.native.js +24 -22
- package/dist/esm/FrappeCalendar.native.js.map +1 -1
- package/dist/esm/FrappeChartCard.mjs +1 -0
- package/dist/esm/FrappeChartCard.mjs.map +1 -1
- package/dist/esm/FrappeChartCard.native.js +1 -0
- package/dist/esm/FrappeChartCard.native.js.map +1 -1
- package/dist/esm/FrappeConnectionIndicator.native.js.map +1 -1
- package/dist/esm/FrappeDashboard.mjs +1 -0
- package/dist/esm/FrappeDashboard.mjs.map +1 -1
- package/dist/esm/FrappeDashboard.native.js +1 -0
- package/dist/esm/FrappeDashboard.native.js.map +1 -1
- package/dist/esm/FrappeForm.mjs +3 -2
- package/dist/esm/FrappeForm.mjs.map +1 -1
- package/dist/esm/FrappeForm.native.js +3 -2
- package/dist/esm/FrappeForm.native.js.map +1 -1
- package/dist/esm/FrappeGantt.mjs +29 -37
- package/dist/esm/FrappeGantt.mjs.map +1 -1
- package/dist/esm/FrappeGantt.native.js +31 -41
- package/dist/esm/FrappeGantt.native.js.map +1 -1
- package/dist/esm/FrappeImageView.mjs +7 -4
- package/dist/esm/FrappeImageView.mjs.map +1 -1
- package/dist/esm/FrappeImageView.native.js +11 -6
- package/dist/esm/FrappeImageView.native.js.map +1 -1
- package/dist/esm/FrappeKPICard.mjs +28 -2
- package/dist/esm/FrappeKPICard.mjs.map +1 -1
- package/dist/esm/FrappeKPICard.native.js +28 -2
- package/dist/esm/FrappeKPICard.native.js.map +1 -1
- package/dist/esm/FrappeKanban.mjs +18 -18
- package/dist/esm/FrappeKanban.mjs.map +1 -1
- package/dist/esm/FrappeKanban.native.js +20 -22
- package/dist/esm/FrappeKanban.native.js.map +1 -1
- package/dist/esm/FrappeLikedBy.mjs +2 -1
- package/dist/esm/FrappeLikedBy.mjs.map +1 -1
- package/dist/esm/FrappeLikedBy.native.js +2 -1
- package/dist/esm/FrappeLikedBy.native.js.map +1 -1
- package/dist/esm/FrappeList.mjs +4 -3
- package/dist/esm/FrappeList.mjs.map +1 -1
- package/dist/esm/FrappeList.native.js +4 -3
- package/dist/esm/FrappeList.native.js.map +1 -1
- package/dist/esm/FrappeListView.mjs +1 -0
- package/dist/esm/FrappeListView.mjs.map +1 -1
- package/dist/esm/FrappeListView.native.js +1 -0
- package/dist/esm/FrappeListView.native.js.map +1 -1
- package/dist/esm/FrappeProvider.mjs +3 -1
- package/dist/esm/FrappeProvider.mjs.map +1 -1
- package/dist/esm/FrappeProvider.native.js +3 -1
- package/dist/esm/FrappeProvider.native.js.map +1 -1
- package/dist/esm/FrappeReconnectIndicator.native.js.map +1 -1
- package/dist/esm/FrappeReportBuilder.mjs +3 -2
- package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
- package/dist/esm/FrappeReportBuilder.native.js +3 -2
- package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
- package/dist/esm/FrappeReportView.mjs +2 -1
- package/dist/esm/FrappeReportView.mjs.map +1 -1
- package/dist/esm/FrappeReportView.native.js +2 -1
- package/dist/esm/FrappeReportView.native.js.map +1 -1
- package/dist/esm/FrappeTable.mjs +38 -40
- package/dist/esm/FrappeTable.mjs.map +1 -1
- package/dist/esm/FrappeTable.native.js +41 -41
- package/dist/esm/FrappeTable.native.js.map +1 -1
- package/dist/esm/FrappeTreeView.mjs +91 -56
- package/dist/esm/FrappeTreeView.mjs.map +1 -1
- package/dist/esm/FrappeTreeView.native.js +135 -56
- package/dist/esm/FrappeTreeView.native.js.map +1 -1
- package/dist/esm/SyncErrorNotice.native.js.map +1 -1
- package/dist/esm/commentActions.mjs +1 -1
- package/dist/esm/commentActions.mjs.map +1 -1
- package/dist/esm/commentActions.native.js +1 -1
- package/dist/esm/commentActions.native.js.map +1 -1
- package/dist/esm/components/attachments.mjs +1 -0
- package/dist/esm/components/attachments.mjs.map +1 -1
- package/dist/esm/components/attachments.native.js +1 -0
- package/dist/esm/components/attachments.native.js.map +1 -1
- package/dist/esm/components/tags.mjs +1 -0
- package/dist/esm/components/tags.mjs.map +1 -1
- package/dist/esm/components/tags.native.js +1 -0
- package/dist/esm/components/tags.native.js.map +1 -1
- package/dist/esm/components/timeline.mjs +2 -1
- package/dist/esm/components/timeline.mjs.map +1 -1
- package/dist/esm/components/timeline.native.js +2 -1
- package/dist/esm/components/timeline.native.js.map +1 -1
- package/dist/esm/dependsOn.native.js.map +1 -1
- package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
- package/dist/esm/desk/DeskFormSidebar.mjs +1 -0
- package/dist/esm/desk/DeskFormSidebar.mjs.map +1 -1
- package/dist/esm/desk/DeskFormSidebar.native.js +1 -0
- package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/esm/desk/DeskListPage.native.js.map +1 -1
- package/dist/esm/desk/DeskShell.mjs +2 -0
- package/dist/esm/desk/DeskShell.mjs.map +1 -1
- package/dist/esm/desk/DeskShell.native.js +2 -0
- package/dist/esm/desk/DeskShell.native.js.map +1 -1
- package/dist/esm/desk/DeskSidebar.mjs +1 -0
- package/dist/esm/desk/DeskSidebar.mjs.map +1 -1
- package/dist/esm/desk/DeskSidebar.native.js +1 -0
- package/dist/esm/desk/DeskSidebar.native.js.map +1 -1
- package/dist/esm/desk/awesomebar.mjs +2 -1
- package/dist/esm/desk/awesomebar.mjs.map +1 -1
- package/dist/esm/desk/awesomebar.native.js +2 -1
- package/dist/esm/desk/awesomebar.native.js.map +1 -1
- package/dist/esm/fieldOverrides.native.js.map +1 -1
- package/dist/esm/fieldRegistry.mjs +1 -0
- package/dist/esm/fieldRegistry.mjs.map +1 -1
- package/dist/esm/fieldRegistry.native.js +1 -0
- package/dist/esm/fieldRegistry.native.js.map +1 -1
- package/dist/esm/fields/Barcode/index.native.js.map +1 -1
- package/dist/esm/fields/Check/index.native.js.map +1 -1
- package/dist/esm/fields/CodeEditor/index.native.js.map +1 -1
- package/dist/esm/fields/Color/index.native.js.map +1 -1
- package/dist/esm/fields/Data/index.native.js.map +1 -1
- package/dist/esm/fields/Date/sheetKeyboard.native.js.map +1 -1
- package/dist/esm/fields/Date/types.native.js.map +1 -1
- package/dist/esm/fields/Date/wire.native.js.map +1 -1
- package/dist/esm/fields/DateRange/index.native.js.map +1 -1
- package/dist/esm/fields/Duration/index.native.js.map +1 -1
- package/dist/esm/fields/DynamicLink.native.js.map +1 -1
- package/dist/esm/fields/FileUpload.mjs +1 -0
- package/dist/esm/fields/FileUpload.mjs.map +1 -1
- package/dist/esm/fields/FileUpload.native.js +1 -0
- package/dist/esm/fields/FileUpload.native.js.map +1 -1
- package/dist/esm/fields/FileUploadField/index.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
- package/dist/esm/fields/HTML/index.native.js.map +1 -1
- package/dist/esm/fields/Heading/index.native.js.map +1 -1
- package/dist/esm/fields/Icon/index.native.js.map +1 -1
- package/dist/esm/fields/Link.mjs +1 -0
- package/dist/esm/fields/Link.mjs.map +1 -1
- package/dist/esm/fields/Link.native.js +1 -0
- package/dist/esm/fields/Link.native.js.map +1 -1
- package/dist/esm/fields/LinkTree.mjs +2 -1
- package/dist/esm/fields/LinkTree.mjs.map +1 -1
- package/dist/esm/fields/LinkTree.native.js +2 -1
- package/dist/esm/fields/LinkTree.native.js.map +1 -1
- package/dist/esm/fields/LongText/index.native.js.map +1 -1
- package/dist/esm/fields/MentionInput/index.mjs +4 -1
- package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
- package/dist/esm/fields/MentionInput/index.native.js +4 -1
- package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
- package/dist/esm/fields/Numeric/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
- package/dist/esm/fields/Password/index.native.js.map +1 -1
- package/dist/esm/fields/Phone/index.native.js.map +1 -1
- package/dist/esm/fields/Progress/index.native.js.map +1 -1
- package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/esm/fields/Rating/index.native.js.map +1 -1
- package/dist/esm/fields/ReadOnly/index.native.js.map +1 -1
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Signature/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/index.native.js.map +1 -1
- package/dist/esm/fields/SmallText/index.native.js.map +1 -1
- package/dist/esm/fields/Switch/index.native.js.map +1 -1
- package/dist/esm/fields/TableMultiSelect.mjs +1 -0
- package/dist/esm/fields/TableMultiSelect.mjs.map +1 -1
- package/dist/esm/fields/TableMultiSelect.native.js +1 -0
- package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/esm/fields/TextEditor/types.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
- package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/esm/fields/shared/EditorPreviewPanes.native.js.map +1 -1
- package/dist/esm/filterFields.native.js.map +1 -1
- package/dist/esm/formEngine/createPrefill.native.js.map +1 -1
- package/dist/esm/formEngine/dirtyTracking.native.js.map +1 -1
- package/dist/esm/formEngine/doctypeMeta.native.js.map +1 -1
- package/dist/esm/formEngine/fetchFrom.native.js.map +1 -1
- package/dist/esm/formEngine/fieldPermissions.native.js.map +1 -1
- package/dist/esm/formEngine/formActions.mjs.map +1 -1
- package/dist/esm/formEngine/formActions.native.js.map +1 -1
- package/dist/esm/formEngine/formLayout.native.js.map +1 -1
- package/dist/esm/formEngine/index.native.js.map +1 -1
- package/dist/esm/formEngine/useFormEngine.native.js.map +1 -1
- package/dist/esm/frappeEventColor.native.js.map +1 -1
- package/dist/esm/frappeStoryTarget.native.js.map +1 -1
- package/dist/esm/frappeUsers.mjs +1 -0
- package/dist/esm/frappeUsers.mjs.map +1 -1
- package/dist/esm/frappeUsers.native.js +1 -0
- package/dist/esm/frappeUsers.native.js.map +1 -1
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/liveErrors.native.js.map +1 -1
- package/dist/esm/resolveControl.native.js.map +1 -1
- package/dist/esm/schemaForm/SchemaWizard.native.js.map +1 -1
- package/dist/esm/schemaForm/applyFieldOrder.native.js.map +1 -1
- package/dist/esm/schemaForm/index.mjs +8 -7
- package/dist/esm/schemaForm/index.mjs.map +1 -1
- package/dist/esm/schemaForm/index.native.js +8 -7
- package/dist/esm/schemaForm/index.native.js.map +1 -1
- package/dist/esm/shared/devWarn.mjs +14 -0
- package/dist/esm/shared/devWarn.mjs.map +1 -0
- package/dist/esm/shared/devWarn.native.js +16 -0
- package/dist/esm/shared/devWarn.native.js.map +1 -0
- package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/esm/syncError.native.js.map +1 -1
- package/dist/esm/useFrappeAggregate.mjs +15 -8
- package/dist/esm/useFrappeAggregate.mjs.map +1 -1
- package/dist/esm/useFrappeAggregate.native.js +15 -9
- package/dist/esm/useFrappeAggregate.native.js.map +1 -1
- package/dist/esm/useFrappeFacets.mjs +10 -9
- package/dist/esm/useFrappeFacets.mjs.map +1 -1
- package/dist/esm/useFrappeFacets.native.js +10 -10
- package/dist/esm/useFrappeFacets.native.js.map +1 -1
- package/dist/esm/useFrappePagination.native.js.map +1 -1
- package/dist/esm/useFrappeRows.mjs +86 -0
- package/dist/esm/useFrappeRows.mjs.map +1 -0
- package/dist/esm/useFrappeRows.native.js +99 -0
- package/dist/esm/useFrappeRows.native.js.map +1 -0
- package/dist/jsx/FrappeAssignment.mjs +1 -0
- package/dist/jsx/FrappeAssignment.mjs.map +1 -1
- package/dist/jsx/FrappeAssignment.native.js +1 -0
- package/dist/jsx/FrappeAssignment.native.js.map +1 -1
- package/dist/jsx/FrappeCalendar.mjs +22 -18
- package/dist/jsx/FrappeCalendar.mjs.map +1 -1
- package/dist/jsx/FrappeCalendar.native.js +24 -22
- package/dist/jsx/FrappeCalendar.native.js.map +1 -1
- package/dist/jsx/FrappeChartCard.mjs +1 -0
- package/dist/jsx/FrappeChartCard.mjs.map +1 -1
- package/dist/jsx/FrappeChartCard.native.js +1 -0
- package/dist/jsx/FrappeChartCard.native.js.map +1 -1
- package/dist/jsx/FrappeDashboard.mjs +1 -0
- package/dist/jsx/FrappeDashboard.mjs.map +1 -1
- package/dist/jsx/FrappeDashboard.native.js +1 -0
- package/dist/jsx/FrappeDashboard.native.js.map +1 -1
- package/dist/jsx/FrappeForm.mjs +3 -2
- package/dist/jsx/FrappeForm.mjs.map +1 -1
- package/dist/jsx/FrappeForm.native.js +3 -2
- package/dist/jsx/FrappeForm.native.js.map +1 -1
- package/dist/jsx/FrappeGantt.mjs +29 -37
- package/dist/jsx/FrappeGantt.mjs.map +1 -1
- package/dist/jsx/FrappeGantt.native.js +29 -39
- package/dist/jsx/FrappeGantt.native.js.map +1 -1
- package/dist/jsx/FrappeImageView.mjs +7 -4
- package/dist/jsx/FrappeImageView.mjs.map +1 -1
- package/dist/jsx/FrappeImageView.native.js +10 -5
- package/dist/jsx/FrappeImageView.native.js.map +1 -1
- package/dist/jsx/FrappeKPICard.mjs +28 -2
- package/dist/jsx/FrappeKPICard.mjs.map +1 -1
- package/dist/jsx/FrappeKPICard.native.js +27 -1
- package/dist/jsx/FrappeKPICard.native.js.map +1 -1
- package/dist/jsx/FrappeKanban.mjs +18 -18
- package/dist/jsx/FrappeKanban.mjs.map +1 -1
- package/dist/jsx/FrappeKanban.native.js +20 -22
- package/dist/jsx/FrappeKanban.native.js.map +1 -1
- package/dist/jsx/FrappeLikedBy.mjs +2 -1
- package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
- package/dist/jsx/FrappeLikedBy.native.js +2 -1
- package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
- package/dist/jsx/FrappeList.mjs +4 -3
- package/dist/jsx/FrappeList.mjs.map +1 -1
- package/dist/jsx/FrappeList.native.js +4 -3
- package/dist/jsx/FrappeList.native.js.map +1 -1
- package/dist/jsx/FrappeListView.mjs +1 -0
- package/dist/jsx/FrappeListView.mjs.map +1 -1
- package/dist/jsx/FrappeListView.native.js +1 -0
- package/dist/jsx/FrappeListView.native.js.map +1 -1
- package/dist/jsx/FrappeProvider.mjs +3 -1
- package/dist/jsx/FrappeProvider.mjs.map +1 -1
- package/dist/jsx/FrappeProvider.native.js +3 -1
- package/dist/jsx/FrappeProvider.native.js.map +1 -1
- package/dist/jsx/FrappeReportBuilder.mjs +3 -2
- package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
- package/dist/jsx/FrappeReportBuilder.native.js +3 -2
- package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
- package/dist/jsx/FrappeReportView.mjs +2 -1
- package/dist/jsx/FrappeReportView.mjs.map +1 -1
- package/dist/jsx/FrappeReportView.native.js +2 -1
- package/dist/jsx/FrappeReportView.native.js.map +1 -1
- package/dist/jsx/FrappeTable.mjs +38 -40
- package/dist/jsx/FrappeTable.mjs.map +1 -1
- package/dist/jsx/FrappeTable.native.js +40 -40
- package/dist/jsx/FrappeTable.native.js.map +1 -1
- package/dist/jsx/FrappeTreeView.mjs +91 -56
- package/dist/jsx/FrappeTreeView.mjs.map +1 -1
- package/dist/jsx/FrappeTreeView.native.js +131 -51
- package/dist/jsx/FrappeTreeView.native.js.map +1 -1
- package/dist/jsx/commentActions.mjs +1 -1
- package/dist/jsx/commentActions.mjs.map +1 -1
- package/dist/jsx/commentActions.native.js +1 -1
- package/dist/jsx/commentActions.native.js.map +1 -1
- package/dist/jsx/components/attachments.mjs +1 -0
- package/dist/jsx/components/attachments.mjs.map +1 -1
- package/dist/jsx/components/attachments.native.js +1 -0
- package/dist/jsx/components/attachments.native.js.map +1 -1
- package/dist/jsx/components/tags.mjs +1 -0
- package/dist/jsx/components/tags.mjs.map +1 -1
- package/dist/jsx/components/tags.native.js +1 -0
- package/dist/jsx/components/tags.native.js.map +1 -1
- package/dist/jsx/components/timeline.mjs +2 -1
- package/dist/jsx/components/timeline.mjs.map +1 -1
- package/dist/jsx/components/timeline.native.js +2 -1
- package/dist/jsx/components/timeline.native.js.map +1 -1
- package/dist/jsx/desk/DeskFormSidebar.mjs +1 -0
- package/dist/jsx/desk/DeskFormSidebar.mjs.map +1 -1
- package/dist/jsx/desk/DeskFormSidebar.native.js +1 -0
- package/dist/jsx/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/jsx/desk/DeskShell.mjs +2 -0
- package/dist/jsx/desk/DeskShell.mjs.map +1 -1
- package/dist/jsx/desk/DeskShell.native.js +2 -0
- package/dist/jsx/desk/DeskShell.native.js.map +1 -1
- package/dist/jsx/desk/DeskSidebar.mjs +1 -0
- package/dist/jsx/desk/DeskSidebar.mjs.map +1 -1
- package/dist/jsx/desk/DeskSidebar.native.js +1 -0
- package/dist/jsx/desk/DeskSidebar.native.js.map +1 -1
- package/dist/jsx/desk/awesomebar.mjs +2 -1
- package/dist/jsx/desk/awesomebar.mjs.map +1 -1
- package/dist/jsx/desk/awesomebar.native.js +2 -1
- package/dist/jsx/desk/awesomebar.native.js.map +1 -1
- package/dist/jsx/fieldRegistry.mjs +1 -0
- package/dist/jsx/fieldRegistry.mjs.map +1 -1
- package/dist/jsx/fieldRegistry.native.js +1 -0
- package/dist/jsx/fieldRegistry.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload.mjs +1 -0
- package/dist/jsx/fields/FileUpload.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload.native.js +1 -0
- package/dist/jsx/fields/FileUpload.native.js.map +1 -1
- package/dist/jsx/fields/Link.mjs +1 -0
- package/dist/jsx/fields/Link.mjs.map +1 -1
- package/dist/jsx/fields/Link.native.js +1 -0
- package/dist/jsx/fields/Link.native.js.map +1 -1
- package/dist/jsx/fields/LinkTree.mjs +2 -1
- package/dist/jsx/fields/LinkTree.mjs.map +1 -1
- package/dist/jsx/fields/LinkTree.native.js +2 -1
- package/dist/jsx/fields/LinkTree.native.js.map +1 -1
- package/dist/jsx/fields/MentionInput/index.mjs +4 -1
- package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
- package/dist/jsx/fields/MentionInput/index.native.js +4 -1
- package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
- package/dist/jsx/fields/TableMultiSelect.mjs +1 -0
- package/dist/jsx/fields/TableMultiSelect.mjs.map +1 -1
- package/dist/jsx/fields/TableMultiSelect.native.js +1 -0
- package/dist/jsx/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/jsx/formEngine/formActions.mjs.map +1 -1
- package/dist/jsx/formEngine/formActions.native.js.map +1 -1
- package/dist/jsx/frappeUsers.mjs +1 -0
- package/dist/jsx/frappeUsers.mjs.map +1 -1
- package/dist/jsx/frappeUsers.native.js +1 -0
- package/dist/jsx/frappeUsers.native.js.map +1 -1
- package/dist/jsx/index.js +2 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +2 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +4 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/schemaForm/index.mjs +8 -7
- package/dist/jsx/schemaForm/index.mjs.map +1 -1
- package/dist/jsx/schemaForm/index.native.js +10 -9
- package/dist/jsx/schemaForm/index.native.js.map +1 -1
- package/dist/jsx/shared/devWarn.mjs +14 -0
- package/dist/jsx/shared/devWarn.mjs.map +1 -0
- package/dist/jsx/shared/devWarn.native.js +45 -0
- package/dist/jsx/shared/devWarn.native.js.map +1 -0
- package/dist/jsx/useFrappeAggregate.mjs +15 -8
- package/dist/jsx/useFrappeAggregate.mjs.map +1 -1
- package/dist/jsx/useFrappeAggregate.native.js +15 -9
- package/dist/jsx/useFrappeAggregate.native.js.map +1 -1
- package/dist/jsx/useFrappeFacets.mjs +10 -9
- package/dist/jsx/useFrappeFacets.mjs.map +1 -1
- package/dist/jsx/useFrappeFacets.native.js +10 -10
- package/dist/jsx/useFrappeFacets.native.js.map +1 -1
- package/dist/jsx/useFrappeRows.mjs +86 -0
- package/dist/jsx/useFrappeRows.mjs.map +1 -0
- package/dist/jsx/useFrappeRows.native.js +129 -0
- package/dist/jsx/useFrappeRows.native.js.map +1 -0
- package/package.json +17 -16
- package/src/FileBrowser/FileBrowser.spec.tsx +11 -1
- package/src/FrappeAssignment.tsx +1 -0
- package/src/FrappeCalendar.tsx +27 -22
- package/src/FrappeChartCard.tsx +1 -0
- package/src/FrappeDashboard.tsx +3 -0
- package/src/FrappeForm.tsx +9 -3
- package/src/FrappeGantt.tsx +31 -39
- package/src/FrappeImageView.tsx +7 -3
- package/src/FrappeKPICard.spec.tsx +128 -0
- package/src/FrappeKPICard.tsx +45 -4
- package/src/FrappeKanban.tsx +26 -17
- package/src/FrappeLikedBy.tsx +2 -1
- package/src/FrappeList.tsx +5 -2
- package/src/FrappeListView.tsx +1 -0
- package/src/FrappeProvider.fixturesOnly.spec.tsx +129 -0
- package/src/FrappeProvider.realtime.spec.tsx +59 -0
- package/src/FrappeProvider.tsx +33 -7
- package/src/FrappeReportBuilder.tsx +5 -2
- package/src/FrappeReportView.tsx +5 -2
- package/src/FrappeTable.autoHeight.spec.tsx +142 -0
- package/src/FrappeTable.rowAccumulator.spec.tsx +110 -0
- package/src/FrappeTable.tsx +77 -48
- package/src/FrappeTreeView.stories.tsx +59 -0
- package/src/FrappeTreeView.tsx +168 -56
- package/src/commentActions.ts +1 -1
- package/src/components/attachments.tsx +1 -0
- package/src/components/tags.tsx +1 -0
- package/src/components/timeline.tsx +2 -1
- package/src/desk/DeskFormSidebar.tsx +1 -0
- package/src/desk/DeskShell.tsx +2 -0
- package/src/desk/DeskSidebar.tsx +6 -1
- package/src/desk/awesomebar.tsx +11 -3
- package/src/fieldRegistry.ts +1 -0
- package/src/fields/CodeEditor/CodeEditor.spec.tsx +10 -9
- package/src/fields/Date/typeParity.spec.tsx +19 -9
- package/src/fields/Duration/Duration.spec.tsx +73 -0
- package/src/fields/FileUpload.tsx +1 -0
- package/src/fields/Link.tsx +6 -1
- package/src/fields/LinkTree.tsx +2 -1
- package/src/fields/MentionInput/MentionInput.spec.tsx +110 -0
- package/src/fields/MentionInput/index.tsx +4 -1
- package/src/fields/Password/index.tsx +1 -1
- package/src/fields/Progress/Progress.spec.tsx +9 -0
- package/src/fields/RadioGroup/RadioGroup.spec.tsx +93 -0
- package/src/fields/Signature/Signature.spec.tsx +105 -0
- package/src/fields/Slider/Slider.spec.tsx +73 -0
- package/src/fields/Switch/Switch.spec.tsx +65 -0
- package/src/fields/TableMultiSelect.tsx +1 -0
- package/src/fields/TextEditor/TextEditor.spec.tsx +2 -3
- package/src/fields/TextEditor/TextEditor.stories.tsx +31 -1
- package/src/fields/ToggleGroup/ToggleGroup.spec.tsx +110 -0
- package/src/formEngine/formActions.ts +2 -0
- package/src/frappeUsers.ts +1 -0
- package/src/frappeViews.designLaw.spec.ts +11 -7
- package/src/index.ts +13 -0
- package/src/schemaForm/index.tsx +6 -7
- package/src/shared/devWarn.ts +42 -0
- package/src/useFrappeAggregate.ts +19 -11
- package/src/useFrappeFacets.ts +17 -10
- package/src/useFrappeRows.spec.tsx +176 -0
- package/src/useFrappeRows.ts +293 -0
- package/types/FrappeAssignment.d.ts.map +1 -1
- package/types/FrappeCalendar.d.ts.map +1 -1
- package/types/FrappeChartCard.d.ts.map +1 -1
- package/types/FrappeDashboard.d.ts.map +1 -1
- package/types/FrappeForm.d.ts +6 -2
- package/types/FrappeForm.d.ts.map +1 -1
- package/types/FrappeGantt.d.ts.map +1 -1
- package/types/FrappeImageView.d.ts.map +1 -1
- package/types/FrappeKPICard.d.ts +9 -1
- package/types/FrappeKPICard.d.ts.map +1 -1
- package/types/FrappeKanban.d.ts.map +1 -1
- package/types/FrappeLikedBy.d.ts.map +1 -1
- package/types/FrappeList.d.ts.map +1 -1
- package/types/FrappeListView.d.ts.map +1 -1
- package/types/FrappeProvider.d.ts +21 -7
- package/types/FrappeProvider.d.ts.map +1 -1
- package/types/FrappeReportBuilder.d.ts.map +1 -1
- package/types/FrappeReportView.d.ts.map +1 -1
- package/types/FrappeTable.d.ts +20 -1
- package/types/FrappeTable.d.ts.map +1 -1
- package/types/FrappeTreeView.d.ts +38 -1
- package/types/FrappeTreeView.d.ts.map +1 -1
- package/types/components/attachments.d.ts.map +1 -1
- package/types/components/tags.d.ts.map +1 -1
- package/types/components/timeline.d.ts.map +1 -1
- package/types/desk/DeskFormSidebar.d.ts.map +1 -1
- package/types/desk/DeskShell.d.ts.map +1 -1
- package/types/desk/DeskSidebar.d.ts.map +1 -1
- package/types/desk/awesomebar.d.ts.map +1 -1
- package/types/fieldRegistry.d.ts.map +1 -1
- package/types/fields/FileUpload.d.ts.map +1 -1
- package/types/fields/Link.d.ts.map +1 -1
- package/types/fields/LinkTree.d.ts.map +1 -1
- package/types/fields/MentionInput/index.d.ts.map +1 -1
- package/types/fields/Password/index.d.ts +1 -1
- package/types/fields/Password/index.d.ts.map +1 -1
- package/types/fields/TableMultiSelect.d.ts.map +1 -1
- package/types/formEngine/formActions.d.ts +2 -0
- package/types/formEngine/formActions.d.ts.map +1 -1
- package/types/frappeUsers.d.ts.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/schemaForm/index.d.ts.map +1 -1
- package/types/shared/devWarn.d.ts +23 -0
- package/types/shared/devWarn.d.ts.map +1 -0
- package/types/useFrappeAggregate.d.ts +4 -1
- package/types/useFrappeAggregate.d.ts.map +1 -1
- package/types/useFrappeFacets.d.ts +2 -1
- package/types/useFrappeFacets.d.ts.map +1 -1
- package/types/useFrappeRows.d.ts +186 -0
- package/types/useFrappeRows.d.ts.map +1 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SliderField contract specs. The adapter wraps a scalar number as the
|
|
3
|
+
* forms Slider's `[number]` tuple. Pin that value, onChange, disabled,
|
|
4
|
+
* label and error survive the hop.
|
|
5
|
+
*/
|
|
6
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
7
|
+
import { cleanup, fireEvent } from "@testing-library/react";
|
|
8
|
+
import type React from "react";
|
|
9
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
10
|
+
import { getFieldComponent, type FieldRenderProps } from "../../fieldRegistry";
|
|
11
|
+
import { SliderField } from ".";
|
|
12
|
+
|
|
13
|
+
afterEach(cleanup);
|
|
14
|
+
|
|
15
|
+
const thumb = (container: HTMLElement) =>
|
|
16
|
+
container.querySelector('[role="slider"]') as HTMLElement | null;
|
|
17
|
+
|
|
18
|
+
describe("SliderField composes the forms Slider", () => {
|
|
19
|
+
it("paints a controlled value onto the thumb", () => {
|
|
20
|
+
const result = renderWithProviders(
|
|
21
|
+
<SliderField label="Volume" value={40} min={0} max={100} onChange={() => {}} />,
|
|
22
|
+
);
|
|
23
|
+
expect(thumb(result.container)?.getAttribute("aria-valuenow")).toBe("40");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("emits a scalar through canonical onChange", () => {
|
|
27
|
+
const onChange = vi.fn();
|
|
28
|
+
const result = renderWithProviders(
|
|
29
|
+
<SliderField label="Volume" value={40} min={0} max={100} step={1} onChange={onChange} />,
|
|
30
|
+
);
|
|
31
|
+
const el = thumb(result.container) as HTMLElement;
|
|
32
|
+
el.focus();
|
|
33
|
+
fireEvent.keyDown(el, { key: "ArrowRight" });
|
|
34
|
+
expect(onChange).toHaveBeenCalled();
|
|
35
|
+
expect(typeof onChange.mock.calls.at(-1)?.[0]).toBe("number");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("forwards disabled onto the thumb", () => {
|
|
39
|
+
const result = renderWithProviders(
|
|
40
|
+
<SliderField label="Volume" value={40} disabled onChange={() => {}} />,
|
|
41
|
+
);
|
|
42
|
+
const el = thumb(result.container);
|
|
43
|
+
const disabledMarker =
|
|
44
|
+
el?.getAttribute("aria-disabled") === "true" ||
|
|
45
|
+
el?.hasAttribute("data-disabled") ||
|
|
46
|
+
Boolean(el?.closest("[data-disabled]"));
|
|
47
|
+
expect(disabledMarker).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("shows the label and error", () => {
|
|
51
|
+
const result = renderWithProviders(
|
|
52
|
+
<SliderField label="Volume" value={40} error="out of range" onChange={() => {}} />,
|
|
53
|
+
);
|
|
54
|
+
expect(result.container.textContent).toContain("Volume");
|
|
55
|
+
expect(result.container.textContent).toContain("out of range");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe("registry resolution (Slider fieldtype)", () => {
|
|
60
|
+
function propsFor(overrides: Partial<FieldRenderProps> = {}): FieldRenderProps {
|
|
61
|
+
return { value: "", onChange: () => {}, ...overrides };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
it("resolves 'Slider' to SliderField and coerces a non-number to 0", () => {
|
|
65
|
+
const Component = getFieldComponent("Slider")!;
|
|
66
|
+
const element = (Component as Function)(
|
|
67
|
+
propsFor({ value: "nope", label: "Volume" }),
|
|
68
|
+
) as React.ReactElement<Record<string, unknown>>;
|
|
69
|
+
expect(element.type).toBe(SliderField);
|
|
70
|
+
expect(element.props.value).toBe(0);
|
|
71
|
+
expect(element.props.label).toBe("Volume");
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SwitchField contract specs. Frappe Switch is 1/0 in the doc; this adapter
|
|
3
|
+
* maps that onto the forms Switch's boolean checked/onCheckedChange. Pin
|
|
4
|
+
* that value, onChange, disabled, label and error survive the hop.
|
|
5
|
+
*/
|
|
6
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
7
|
+
import { act, cleanup, fireEvent } from "@testing-library/react";
|
|
8
|
+
import type React from "react";
|
|
9
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
10
|
+
import { getFieldComponent, type FieldRenderProps } from "../../fieldRegistry";
|
|
11
|
+
import { SwitchField } from ".";
|
|
12
|
+
|
|
13
|
+
afterEach(cleanup);
|
|
14
|
+
|
|
15
|
+
describe("SwitchField composes the forms Switch", () => {
|
|
16
|
+
it("paints a controlled true value as aria-checked=true", () => {
|
|
17
|
+
const result = renderWithProviders(
|
|
18
|
+
<SwitchField label="Enabled" value={true} onChange={() => {}} />,
|
|
19
|
+
);
|
|
20
|
+
expect(result.getSwitch()?.getAttribute("aria-checked")).toBe("true");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("emits a boolean through canonical onChange", async () => {
|
|
24
|
+
const onChange = vi.fn();
|
|
25
|
+
const result = renderWithProviders(
|
|
26
|
+
<SwitchField label="Enabled" value={false} onChange={onChange} />,
|
|
27
|
+
);
|
|
28
|
+
await act(async () => {
|
|
29
|
+
fireEvent.click(result.getSwitch() as HTMLElement);
|
|
30
|
+
});
|
|
31
|
+
expect(onChange).toHaveBeenCalledWith(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("forwards disabled onto the switch", () => {
|
|
35
|
+
const result = renderWithProviders(
|
|
36
|
+
<SwitchField label="Enabled" value={false} disabled onChange={() => {}} />,
|
|
37
|
+
);
|
|
38
|
+
const el = result.getSwitch();
|
|
39
|
+
expect(el?.hasAttribute("disabled") || el?.getAttribute("aria-disabled") === "true").toBe(true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("shows the label and error", () => {
|
|
43
|
+
const result = renderWithProviders(
|
|
44
|
+
<SwitchField label="Enabled" value={false} error="cannot enable" onChange={() => {}} />,
|
|
45
|
+
);
|
|
46
|
+
expect(result.container.textContent).toContain("Enabled");
|
|
47
|
+
expect(result.container.textContent).toContain("cannot enable");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe("registry resolution (Switch fieldtype)", () => {
|
|
52
|
+
function propsFor(overrides: Partial<FieldRenderProps> = {}): FieldRenderProps {
|
|
53
|
+
return { value: "", onChange: () => {}, ...overrides };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
it("resolves 'Switch' to SwitchField and maps a truthy doc value to true", () => {
|
|
57
|
+
const Component = getFieldComponent("Switch")!;
|
|
58
|
+
const element = (Component as Function)(
|
|
59
|
+
propsFor({ value: 1, label: "Enabled" }),
|
|
60
|
+
) as React.ReactElement<Record<string, unknown>>;
|
|
61
|
+
expect(element.type).toBe(SwitchField);
|
|
62
|
+
expect(element.props.value).toBe(true);
|
|
63
|
+
expect(element.props.label).toBe("Enabled");
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -51,11 +51,10 @@ describe("TextEditor initialization emissions", () => {
|
|
|
51
51
|
await waitFor(() => {
|
|
52
52
|
expect(utils.container.querySelector(".ProseMirror")).toBeTruthy();
|
|
53
53
|
});
|
|
54
|
-
//
|
|
55
|
-
// sync is the house editor's contract, not a forked TipTap in this wrapper.
|
|
54
|
+
// An external update changes the actual document without echoing an edit.
|
|
56
55
|
utils.rerender(<TextEditor label="Description" value="<p>second</p>" onChange={onChange} />);
|
|
57
56
|
await waitFor(() => {
|
|
58
|
-
expect(utils.container.querySelector(".ProseMirror")).
|
|
57
|
+
expect(utils.container.querySelector(".ProseMirror")?.textContent).toBe("second");
|
|
59
58
|
});
|
|
60
59
|
expect(onChange).not.toHaveBeenCalled();
|
|
61
60
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { action } from "@multiplatform.one/storybook";
|
|
2
|
+
import { Button } from "@multiplatform.one/forms";
|
|
2
3
|
import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
|
|
3
4
|
import { useState } from "react";
|
|
4
|
-
import { YStack } from "tamagui";
|
|
5
|
+
import { Text, YStack } from "tamagui";
|
|
5
6
|
import { fieldtypeToTableField } from "../../fieldRegistry";
|
|
6
7
|
import { FrappeStoryProvider } from "../../frappeStoryTarget";
|
|
7
8
|
import { TextEditor, type TextEditorProps } from ".";
|
|
@@ -51,6 +52,35 @@ Main.args = {
|
|
|
51
52
|
} as Partial<StoryProps>;
|
|
52
53
|
Main.storyName = "Main";
|
|
53
54
|
|
|
55
|
+
export const ExternalValueUpdates = {
|
|
56
|
+
name: "External value updates",
|
|
57
|
+
render: function ExternalValueUpdatesStory() {
|
|
58
|
+
const [value, setValue] = useState("<p>Original note</p>");
|
|
59
|
+
const [edits, setEdits] = useState(0);
|
|
60
|
+
return (
|
|
61
|
+
<YStack gap="$3" maxWidth={640}>
|
|
62
|
+
<TextEditor
|
|
63
|
+
label="Note"
|
|
64
|
+
value={value}
|
|
65
|
+
onChange={(next) => {
|
|
66
|
+
setValue(next);
|
|
67
|
+
setEdits((count) => count + 1);
|
|
68
|
+
}}
|
|
69
|
+
/>
|
|
70
|
+
<Button
|
|
71
|
+
onPress={() => {
|
|
72
|
+
setEdits(0);
|
|
73
|
+
setValue("<p>Saved note</p>");
|
|
74
|
+
}}
|
|
75
|
+
>
|
|
76
|
+
Load saved note
|
|
77
|
+
</Button>
|
|
78
|
+
<Text testID="editor-user-edits">User edits: {edits}</Text>
|
|
79
|
+
</YStack>
|
|
80
|
+
);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
|
|
54
84
|
export const Empty = (args: StoryProps) => <Controlled {...args} />;
|
|
55
85
|
Empty.args = {
|
|
56
86
|
label: "Empty editor",
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToggleGroupField contract specs. The adapter maps `onChange` onto the forms
|
|
3
|
+
* ToggleGroup's `onValueChange`. Pin that value, onChange, disabled, label
|
|
4
|
+
* and error survive the hop.
|
|
5
|
+
*/
|
|
6
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
7
|
+
import { cleanup, fireEvent } from "@testing-library/react";
|
|
8
|
+
import type React from "react";
|
|
9
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
10
|
+
import { getFieldComponent, type FieldRenderProps } from "../../fieldRegistry";
|
|
11
|
+
import { ToggleGroupField } from ".";
|
|
12
|
+
|
|
13
|
+
afterEach(cleanup);
|
|
14
|
+
|
|
15
|
+
const options = [
|
|
16
|
+
{ label: "Left", value: "left" },
|
|
17
|
+
{ label: "Center", value: "center" },
|
|
18
|
+
{ label: "Right", value: "right" },
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
describe("ToggleGroupField composes the forms ToggleGroup", () => {
|
|
22
|
+
it("paints a controlled value onto the matching item", () => {
|
|
23
|
+
const result = renderWithProviders(
|
|
24
|
+
<ToggleGroupField
|
|
25
|
+
label="Align"
|
|
26
|
+
type="single"
|
|
27
|
+
value="center"
|
|
28
|
+
options={options}
|
|
29
|
+
onChange={() => {}}
|
|
30
|
+
/>,
|
|
31
|
+
);
|
|
32
|
+
expect(result.container.textContent).toContain("Center");
|
|
33
|
+
const pressed = result.container.querySelector('[aria-pressed="true"], [data-state="on"]');
|
|
34
|
+
expect(pressed).toBeTruthy();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("emits the item value through canonical onChange", () => {
|
|
38
|
+
const onChange = vi.fn();
|
|
39
|
+
const result = renderWithProviders(
|
|
40
|
+
<ToggleGroupField
|
|
41
|
+
label="Align"
|
|
42
|
+
type="single"
|
|
43
|
+
value="left"
|
|
44
|
+
options={options}
|
|
45
|
+
onChange={onChange}
|
|
46
|
+
/>,
|
|
47
|
+
);
|
|
48
|
+
const center = result.findTextElement("Center");
|
|
49
|
+
expect(center).toBeTruthy();
|
|
50
|
+
fireEvent.click(center as HTMLElement);
|
|
51
|
+
expect(onChange).toHaveBeenCalledWith("center");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("forwards disabled onto the group", () => {
|
|
55
|
+
const result = renderWithProviders(
|
|
56
|
+
<ToggleGroupField
|
|
57
|
+
label="Align"
|
|
58
|
+
type="single"
|
|
59
|
+
value="left"
|
|
60
|
+
options={options}
|
|
61
|
+
disabled
|
|
62
|
+
onChange={() => {}}
|
|
63
|
+
/>,
|
|
64
|
+
);
|
|
65
|
+
const el =
|
|
66
|
+
result.container.querySelector('[role="group"]') ||
|
|
67
|
+
result.container.querySelector('[data-disabled="true"]') ||
|
|
68
|
+
result.container.querySelector("[disabled]");
|
|
69
|
+
expect(el).toBeTruthy();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("shows the label and error", () => {
|
|
73
|
+
const result = renderWithProviders(
|
|
74
|
+
<ToggleGroupField
|
|
75
|
+
label="Align"
|
|
76
|
+
type="single"
|
|
77
|
+
value="left"
|
|
78
|
+
options={options}
|
|
79
|
+
error="pick a side"
|
|
80
|
+
onChange={() => {}}
|
|
81
|
+
/>,
|
|
82
|
+
);
|
|
83
|
+
expect(result.container.textContent).toContain("Align");
|
|
84
|
+
expect(result.container.textContent).toContain("pick a side");
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe("registry resolution (Toggle Group fieldtype)", () => {
|
|
89
|
+
function propsFor(overrides: Partial<FieldRenderProps> = {}): FieldRenderProps {
|
|
90
|
+
return { value: "", onChange: () => {}, ...overrides };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
it("resolves 'Toggle Group' to ToggleGroupField and splits df.options on newlines", () => {
|
|
94
|
+
const Component = getFieldComponent("Toggle Group")!;
|
|
95
|
+
const element = (Component as Function)(
|
|
96
|
+
propsFor({
|
|
97
|
+
value: "Left",
|
|
98
|
+
label: "Align",
|
|
99
|
+
fieldMeta: { options: "Left\nCenter" },
|
|
100
|
+
} as Partial<FieldRenderProps>),
|
|
101
|
+
) as React.ReactElement<Record<string, unknown>>;
|
|
102
|
+
expect(element.type).toBe(ToggleGroupField);
|
|
103
|
+
expect(element.props.value).toBe("Left");
|
|
104
|
+
expect(element.props.label).toBe("Align");
|
|
105
|
+
expect(element.props.options).toEqual([
|
|
106
|
+
{ label: "Left", value: "Left" },
|
|
107
|
+
{ label: "Center", value: "Center" },
|
|
108
|
+
]);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
@@ -36,6 +36,8 @@ import type { FixtureProvider } from "@multiplatform.one/frappe";
|
|
|
36
36
|
*/
|
|
37
37
|
export interface FrappeConnection {
|
|
38
38
|
baseURL: string;
|
|
39
|
+
/** False keeps HTTP reads without realtime subscriptions. */
|
|
40
|
+
realtime?: boolean;
|
|
39
41
|
socketPort?: number;
|
|
40
42
|
/** Same-origin socket override (see FrappeConfig.socketBaseURL). */
|
|
41
43
|
socketBaseURL?: string;
|
package/src/frappeUsers.ts
CHANGED
|
@@ -55,14 +55,15 @@ describe("Frappe view adapters — design-law 100%", () => {
|
|
|
55
55
|
expect(source).toMatch(/from "@multiplatform.one\/components"/);
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
-
it("FrappeGantt action
|
|
58
|
+
it("FrappeGantt action errors use Alert and keep the adapter boundary", () => {
|
|
59
59
|
const source = read("FrappeGantt.tsx");
|
|
60
|
-
expect(source).
|
|
60
|
+
expect(source).toMatch(/import \{[^}]*Alert[^}]*\} from "@multiplatform.one\/components"/);
|
|
61
|
+
expect(source).toMatch(/<Alert\b[^>]*intent="error"/);
|
|
61
62
|
expect(source).toContain("containerRadius");
|
|
63
|
+
expect(source).not.toContain("knobProps.borderRadius");
|
|
62
64
|
expect(source).not.toMatch(/fontSize=\{knobProps\.sizeToken\}/);
|
|
63
|
-
expect(source).not.
|
|
64
|
-
expect(source).
|
|
65
|
-
expect(source).toContain("MPO-14");
|
|
65
|
+
expect(source).not.toMatch(/\$red\d+/);
|
|
66
|
+
expect(source).not.toMatch(/from ["'](?:@multiplatform\.one\/backoffice|\.\/desk\/)/);
|
|
66
67
|
});
|
|
67
68
|
|
|
68
69
|
it("FrappeReportView uses the house Button and label fragments (LC-54)", () => {
|
|
@@ -81,12 +82,15 @@ describe("Frappe view adapters — design-law 100%", () => {
|
|
|
81
82
|
expect(source).toContain("formCommonColors");
|
|
82
83
|
expect(source).not.toMatch(/fontWeight="600"|fontWeight="500"/);
|
|
83
84
|
expect(source).toContain('fontWeight="400"');
|
|
84
|
-
expect(source).
|
|
85
|
+
expect(source).not.toMatch(/<Button\b[^>]*\b(?:controlFill|backgroundColor|borderColor)=/);
|
|
85
86
|
});
|
|
86
87
|
|
|
87
88
|
it("FrappeTreeView empty chrome is EmptyState and labels use the label fragment", () => {
|
|
88
89
|
const source = read("FrappeTreeView.tsx");
|
|
89
|
-
expect(source).
|
|
90
|
+
expect(source).toMatch(/import \{[^}]*EmptyState[^}]*\} from "@multiplatform.one\/components"/);
|
|
91
|
+
expect(source).toContain("<EmptyState");
|
|
92
|
+
expect(source).toContain("useGlyphColor(formCommonColors.muted)");
|
|
93
|
+
expect(source).not.toMatch(/<TreeStructureIcon\b[^>]*color=\{formCommonColors\./);
|
|
90
94
|
expect(source).not.toMatch(/size=\{48\}/);
|
|
91
95
|
expect(source).toContain("knobProps.label");
|
|
92
96
|
expect(source).not.toMatch(/fontSize=\{display === "compressed" \? 12 : 14\}/);
|
package/src/index.ts
CHANGED
|
@@ -120,6 +120,19 @@ export {
|
|
|
120
120
|
type FrappeChartDataSource,
|
|
121
121
|
} from "./FrappeChartCard";
|
|
122
122
|
|
|
123
|
+
// The composed doctype read (MPO-251) — the supported way to get rows out of
|
|
124
|
+
// a doctype when the panel shape has no shipped component. FrappeTable and
|
|
125
|
+
// the other live views read through it, so there is one implementation.
|
|
126
|
+
export {
|
|
127
|
+
useFrappeRows,
|
|
128
|
+
useFrappeConnection,
|
|
129
|
+
DEFAULT_FRAPPE_ROWS_LIMIT,
|
|
130
|
+
type FrappeRowsConnection,
|
|
131
|
+
type FrappeRowsMessages,
|
|
132
|
+
type UseFrappeRowsOptions,
|
|
133
|
+
type UseFrappeRowsResult,
|
|
134
|
+
} from "./useFrappeRows";
|
|
135
|
+
|
|
123
136
|
export {
|
|
124
137
|
useFrappeAggregate,
|
|
125
138
|
type FrappeAggregateConnection,
|
package/src/schemaForm/index.tsx
CHANGED
|
@@ -17,9 +17,10 @@ import {
|
|
|
17
17
|
type RequiredMarkStrategy,
|
|
18
18
|
} from "@multiplatform.one/forms";
|
|
19
19
|
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
20
|
+
import { Card } from "@multiplatform.one/components";
|
|
20
21
|
import React, { useMemo } from "react";
|
|
21
22
|
import { useTranslation } from "react-i18next";
|
|
22
|
-
import {
|
|
23
|
+
import { Text, XStack, YStack } from "tamagui";
|
|
23
24
|
|
|
24
25
|
import { compileDependsOn } from "../dependsOn";
|
|
25
26
|
import { Heading, type HeadingLevel } from "../fields/Heading";
|
|
@@ -353,13 +354,12 @@ function SchemaFormSectionCard({ section, headingLevel, renderField }: SchemaFor
|
|
|
353
354
|
|
|
354
355
|
return (
|
|
355
356
|
<Card
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
backgroundColor={hideBorder ? "transparent" : undefined}
|
|
357
|
+
data-mpo-schema-form-card=""
|
|
358
|
+
data-mpo-schema-form-borderless={hideBorder ? "" : undefined}
|
|
359
|
+
{...(hideBorder ? { borderWidth: 0, backgroundColor: "transparent" } : {})}
|
|
360
360
|
>
|
|
361
361
|
{(section.label || section.description) && (
|
|
362
|
-
<Card.Header
|
|
362
|
+
<Card.Header>
|
|
363
363
|
{section.label ? (
|
|
364
364
|
<Heading
|
|
365
365
|
label={section.label}
|
|
@@ -380,7 +380,6 @@ function SchemaFormSectionCard({ section, headingLevel, renderField }: SchemaFor
|
|
|
380
380
|
{/* Kept mounted while collapsed (display none) so field state and the
|
|
381
381
|
collapse target survive toggles — matches desk's CSS hide. */}
|
|
382
382
|
<Card.Footer
|
|
383
|
-
{...knobProps.panelPadding}
|
|
384
383
|
display={effectiveCollapsed ? "none" : undefined}
|
|
385
384
|
aria-hidden={effectiveCollapsed || undefined}
|
|
386
385
|
>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package-local DEV guardrails for frappe-ui, warned under a `[frappe-ui]`
|
|
3
|
+
* prefix.
|
|
4
|
+
*
|
|
5
|
+
* The canonical catalog is `devWarn` in `@multiplatform.one/theme`, whose
|
|
6
|
+
* `DevWarnCode` union is closed over design-guardrail codes. Live-data
|
|
7
|
+
* misconfiguration is a frappe-ui concern rather than a design-law one, so
|
|
8
|
+
* it warns from here, the same way AsyncBoundary keeps its own.
|
|
9
|
+
*
|
|
10
|
+
* No-ops when `NODE_ENV === "production"`, and each key warns once per
|
|
11
|
+
* process so a re-render never repeats a line.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export type FrappeDevWarnCode = "kpi-datasource-without-baseurl";
|
|
15
|
+
|
|
16
|
+
export type FrappeDevWarnDetail = {
|
|
17
|
+
component?: string;
|
|
18
|
+
id?: string;
|
|
19
|
+
doctype?: string;
|
|
20
|
+
suggest?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const seen = new Set<string>();
|
|
24
|
+
|
|
25
|
+
export function frappeDevWarn(code: FrappeDevWarnCode, detail: FrappeDevWarnDetail = {}): void {
|
|
26
|
+
if (process.env.NODE_ENV === "production") return;
|
|
27
|
+
const key = [code, detail.component ?? "", detail.id ?? "", detail.doctype ?? ""].join(":");
|
|
28
|
+
if (seen.has(key)) return;
|
|
29
|
+
seen.add(key);
|
|
30
|
+
const bits = [
|
|
31
|
+
detail.component ? `component=${detail.component}` : undefined,
|
|
32
|
+
detail.id ? `id=${detail.id}` : undefined,
|
|
33
|
+
detail.doctype ? `doctype=${detail.doctype}` : undefined,
|
|
34
|
+
detail.suggest ? `suggest=${detail.suggest}` : undefined,
|
|
35
|
+
].filter(Boolean);
|
|
36
|
+
console.warn(`[frappe-ui] ${code}${bits.length ? ` (${bits.join(", ")})` : ""}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** @internal test helper */
|
|
40
|
+
export function __resetFrappeDevWarnSeen(): void {
|
|
41
|
+
seen.clear();
|
|
42
|
+
}
|
|
@@ -41,7 +41,10 @@ export type FrappeAggregateOperation = "count" | "sum" | "avg" | "min" | "max";
|
|
|
41
41
|
|
|
42
42
|
/** Connection shape shared with the other frappe-ui widgets. */
|
|
43
43
|
export interface FrappeAggregateConnection {
|
|
44
|
-
baseURL
|
|
44
|
+
/** Required unless `fixtures` is set (see FrappeConfig.baseURL). */
|
|
45
|
+
baseURL?: string;
|
|
46
|
+
/** False keeps HTTP reads without realtime subscriptions. */
|
|
47
|
+
realtime?: boolean;
|
|
45
48
|
socketPort?: number;
|
|
46
49
|
/** Same-origin socket override (see FrappeConfig.socketBaseURL). */
|
|
47
50
|
socketBaseURL?: string;
|
|
@@ -95,18 +98,18 @@ const DEFAULT_DEBOUNCE_MS = 300;
|
|
|
95
98
|
// One REST client per connection — widgets sharing a bench share it.
|
|
96
99
|
const dbCache = new Map<string, DbModule>();
|
|
97
100
|
|
|
98
|
-
function getDb(
|
|
99
|
-
const key = `${
|
|
101
|
+
function getDb(baseURL: string, auth: FrappeAggregateConnection["auth"]): DbModule {
|
|
102
|
+
const key = `${baseURL}:${auth?.token ?? ""}:${auth?.type ?? ""}`;
|
|
100
103
|
let db = dbCache.get(key);
|
|
101
104
|
if (!db) {
|
|
102
|
-
const authConfig: AuthConfig | undefined =
|
|
105
|
+
const authConfig: AuthConfig | undefined = auth
|
|
103
106
|
? {
|
|
104
|
-
useToken:
|
|
105
|
-
token:
|
|
106
|
-
type:
|
|
107
|
+
useToken: auth.useToken,
|
|
108
|
+
token: auth.token,
|
|
109
|
+
type: auth.type as AuthConfig["type"],
|
|
107
110
|
}
|
|
108
111
|
: undefined;
|
|
109
|
-
db = new DbModule(new HttpClient(
|
|
112
|
+
db = new DbModule(new HttpClient(baseURL, authConfig));
|
|
110
113
|
dbCache.set(key, db);
|
|
111
114
|
}
|
|
112
115
|
return db;
|
|
@@ -269,9 +272,14 @@ export function useFrappeAggregate(
|
|
|
269
272
|
if (!conn || !currentSpec.doctype) return;
|
|
270
273
|
const seq = ++fetchSeq.current;
|
|
271
274
|
try {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
+
let result: AggregateData;
|
|
276
|
+
if (conn.fixtures) {
|
|
277
|
+
result = await fetchFixtureAggregate(conn.fixtures, currentSpec);
|
|
278
|
+
} else if (conn.baseURL) {
|
|
279
|
+
result = await fetchLiveAggregate(getDb(conn.baseURL, conn.auth), currentSpec);
|
|
280
|
+
} else {
|
|
281
|
+
throw new Error("useFrappeAggregate requires a connection with baseURL or fixtures");
|
|
282
|
+
}
|
|
275
283
|
if (seq !== fetchSeq.current) return; // stale response — a newer fetch won
|
|
276
284
|
setData(result);
|
|
277
285
|
setError(undefined);
|
package/src/useFrappeFacets.ts
CHANGED
|
@@ -78,7 +78,8 @@ export interface FrappeFacetState {
|
|
|
78
78
|
|
|
79
79
|
/** Connection shape shared with the other frappe-ui widgets. */
|
|
80
80
|
export interface FrappeFacetsConnection {
|
|
81
|
-
baseURL
|
|
81
|
+
/** Required unless `fixtures` is set (see FrappeConfig.baseURL). */
|
|
82
|
+
baseURL?: string;
|
|
82
83
|
auth?: { useToken?: boolean; token?: string | (() => string | Promise<string>); type?: string };
|
|
83
84
|
fixtures?: FixtureProvider;
|
|
84
85
|
}
|
|
@@ -169,18 +170,18 @@ export function scrubUserFacetRows(
|
|
|
169
170
|
// One RPC client per connection — facets sharing a bench share it.
|
|
170
171
|
const callCache = new Map<string, CallModule>();
|
|
171
172
|
|
|
172
|
-
function getCall(
|
|
173
|
-
const key = `${
|
|
173
|
+
function getCall(baseURL: string, auth: FrappeFacetsConnection["auth"]): CallModule {
|
|
174
|
+
const key = `${baseURL}:${auth?.token ?? ""}:${auth?.type ?? ""}`;
|
|
174
175
|
let call = callCache.get(key);
|
|
175
176
|
if (!call) {
|
|
176
|
-
const authConfig: AuthConfig | undefined =
|
|
177
|
+
const authConfig: AuthConfig | undefined = auth
|
|
177
178
|
? {
|
|
178
|
-
useToken:
|
|
179
|
-
token:
|
|
180
|
-
type:
|
|
179
|
+
useToken: auth.useToken,
|
|
180
|
+
token: auth.token,
|
|
181
|
+
type: auth.type as AuthConfig["type"],
|
|
181
182
|
}
|
|
182
183
|
: undefined;
|
|
183
|
-
call = new CallModule(new HttpClient(
|
|
184
|
+
call = new CallModule(new HttpClient(baseURL, authConfig));
|
|
184
185
|
callCache.set(key, call);
|
|
185
186
|
}
|
|
186
187
|
return call;
|
|
@@ -439,7 +440,9 @@ export function useFrappeFacets(
|
|
|
439
440
|
useEffect(() => {
|
|
440
441
|
if (!enabled) return;
|
|
441
442
|
const conn = connectionRef.current;
|
|
442
|
-
|
|
443
|
+
// Neither a corpus nor a bench can answer, so stay idle instead of
|
|
444
|
+
// entering a loading state nothing will ever resolve.
|
|
445
|
+
if (!conn || (!conn.fixtures && !conn.baseURL)) return;
|
|
443
446
|
const seq = ++fetchSeq.current;
|
|
444
447
|
const activeFilters = JSON.parse(filtersKey) as FrappeFacetFilters;
|
|
445
448
|
|
|
@@ -525,7 +528,11 @@ export function useFrappeFacets(
|
|
|
525
528
|
return;
|
|
526
529
|
}
|
|
527
530
|
|
|
528
|
-
|
|
531
|
+
// Narrowing only: the guard at the top of the effect already returned
|
|
532
|
+
// when neither a corpus nor a baseURL is configured.
|
|
533
|
+
if (!conn.baseURL) return;
|
|
534
|
+
|
|
535
|
+
const call = getCall(conn.baseURL, conn.auth);
|
|
529
536
|
fetchGroupByCount(call, doctype, filtersExcludingField(activeFilters, "_assign"), "assigned_to")
|
|
530
537
|
.then((rows) => done("assigned", rows))
|
|
531
538
|
.catch((error) => fail("assigned", error));
|