@multiplatform.one/frappe-ui 6.7.0 → 7.0.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/FrappeAssignment.cjs +2 -0
- package/dist/cjs/FrappeAssignment.native.js +2 -0
- package/dist/cjs/FrappeAssignment.native.js.map +1 -1
- package/dist/cjs/FrappeCalendar.cjs +5 -7
- package/dist/cjs/FrappeCalendar.native.js +5 -9
- package/dist/cjs/FrappeCalendar.native.js.map +1 -1
- package/dist/cjs/FrappeChartCard.cjs +2 -0
- package/dist/cjs/FrappeChartCard.native.js +2 -0
- package/dist/cjs/FrappeChartCard.native.js.map +1 -1
- package/dist/cjs/FrappeDashboard.cjs +11 -22
- package/dist/cjs/FrappeDashboard.native.js +20 -22
- package/dist/cjs/FrappeDashboard.native.js.map +1 -1
- package/dist/cjs/FrappeForm.cjs +3 -1
- package/dist/cjs/FrappeForm.native.js +3 -1
- package/dist/cjs/FrappeForm.native.js.map +1 -1
- package/dist/cjs/FrappeGantt.cjs +5 -7
- package/dist/cjs/FrappeGantt.native.js +5 -9
- package/dist/cjs/FrappeGantt.native.js.map +1 -1
- package/dist/cjs/FrappeImageView.cjs +3 -1
- package/dist/cjs/FrappeImageView.native.js +3 -1
- package/dist/cjs/FrappeImageView.native.js.map +1 -1
- package/dist/cjs/FrappeKPICard.cjs +2 -0
- package/dist/cjs/FrappeKPICard.native.js +2 -0
- package/dist/cjs/FrappeKPICard.native.js.map +1 -1
- package/dist/cjs/FrappeKanban.cjs +3 -1
- package/dist/cjs/FrappeKanban.native.js +3 -1
- package/dist/cjs/FrappeKanban.native.js.map +1 -1
- package/dist/cjs/FrappeLikedBy.cjs +2 -0
- package/dist/cjs/FrappeLikedBy.native.js +2 -0
- package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
- package/dist/cjs/FrappeList.cjs +3 -1
- package/dist/cjs/FrappeList.native.js +3 -1
- package/dist/cjs/FrappeList.native.js.map +1 -1
- package/dist/cjs/FrappeListView.cjs +6 -12
- package/dist/cjs/FrappeListView.native.js +13 -12
- package/dist/cjs/FrappeListView.native.js.map +1 -1
- package/dist/cjs/FrappeProvider.cjs +5 -1
- package/dist/cjs/FrappeProvider.native.js +5 -1
- package/dist/cjs/FrappeProvider.native.js.map +1 -1
- package/dist/cjs/FrappeReportBuilder.cjs +2 -0
- package/dist/cjs/FrappeReportBuilder.native.js +2 -0
- package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
- package/dist/cjs/FrappeReportView.cjs +23 -45
- package/dist/cjs/FrappeReportView.native.js +35 -50
- package/dist/cjs/FrappeReportView.native.js.map +1 -1
- package/dist/cjs/FrappeTable.cjs +105 -31
- package/dist/cjs/FrappeTable.native.js +140 -42
- package/dist/cjs/FrappeTable.native.js.map +1 -1
- package/dist/cjs/FrappeTreeView.cjs +3 -1
- package/dist/cjs/FrappeTreeView.native.js +3 -1
- package/dist/cjs/FrappeTreeView.native.js.map +1 -1
- package/dist/cjs/SyncErrorNotice.cjs +76 -0
- package/dist/cjs/SyncErrorNotice.native.js +92 -0
- package/dist/cjs/SyncErrorNotice.native.js.map +1 -0
- package/dist/cjs/commentActions.cjs +120 -0
- package/dist/cjs/commentActions.native.js +129 -0
- package/dist/cjs/commentActions.native.js.map +1 -0
- package/dist/cjs/components/attachments.cjs +2 -0
- package/dist/cjs/components/attachments.native.js +2 -0
- package/dist/cjs/components/attachments.native.js.map +1 -1
- package/dist/cjs/components/tags.cjs +5 -0
- package/dist/cjs/components/tags.native.js +5 -0
- package/dist/cjs/components/tags.native.js.map +1 -1
- package/dist/cjs/components/timeline.cjs +29 -2
- package/dist/cjs/components/timeline.native.js +33 -2
- package/dist/cjs/components/timeline.native.js.map +1 -1
- package/dist/cjs/desk/DeskFormSidebar.cjs +2 -0
- package/dist/cjs/desk/DeskFormSidebar.native.js +2 -0
- package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/cjs/fieldRegistry.cjs +2 -0
- package/dist/cjs/fieldRegistry.native.js +2 -0
- package/dist/cjs/fieldRegistry.native.js.map +1 -1
- package/dist/cjs/fields/Date/index.cjs +71 -7
- package/dist/cjs/fields/Date/index.native.js +325 -37
- package/dist/cjs/fields/Date/index.native.js.map +1 -1
- package/dist/cjs/fields/Date/types.cjs +18 -0
- package/dist/cjs/fields/Date/types.native.js +21 -0
- package/dist/cjs/fields/Date/types.native.js.map +1 -0
- package/dist/cjs/fields/Date/wire.cjs +4 -8
- package/dist/cjs/fields/Date/wire.native.js +4 -11
- package/dist/cjs/fields/Date/wire.native.js.map +1 -1
- package/dist/cjs/fields/DynamicLink.cjs +2 -0
- package/dist/cjs/fields/DynamicLink.native.js +2 -0
- package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload.cjs +2 -0
- package/dist/cjs/fields/FileUpload.native.js +2 -0
- package/dist/cjs/fields/FileUpload.native.js.map +1 -1
- package/dist/cjs/fields/TableMultiSelect.cjs +6 -1
- package/dist/cjs/fields/TableMultiSelect.native.js +6 -1
- package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/cjs/frappeStoryTarget.cjs +88 -0
- package/dist/cjs/frappeStoryTarget.native.js +100 -0
- package/dist/cjs/frappeStoryTarget.native.js.map +1 -1
- package/dist/cjs/frappeUsers.cjs +2 -0
- package/dist/cjs/frappeUsers.native.js +2 -0
- package/dist/cjs/frappeUsers.native.js.map +1 -1
- package/dist/cjs/index.cjs +17 -4
- package/dist/cjs/index.native.js +17 -4
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/liveErrors.cjs +5 -1
- package/dist/cjs/liveErrors.native.js +5 -1
- package/dist/cjs/liveErrors.native.js.map +1 -1
- package/dist/cjs/useFrappeAggregate.cjs +13 -1
- package/dist/cjs/useFrappeAggregate.native.js +14 -1
- package/dist/cjs/useFrappeAggregate.native.js.map +1 -1
- package/dist/cjs/useFrappeFacets.cjs +329 -0
- package/dist/cjs/useFrappeFacets.native.js +632 -0
- package/dist/cjs/useFrappeFacets.native.js.map +1 -0
- package/dist/esm/FrappeAssignment.mjs +2 -0
- package/dist/esm/FrappeAssignment.mjs.map +1 -1
- package/dist/esm/FrappeAssignment.native.js +2 -0
- package/dist/esm/FrappeAssignment.native.js.map +1 -1
- package/dist/esm/FrappeCalendar.mjs +6 -8
- package/dist/esm/FrappeCalendar.mjs.map +1 -1
- package/dist/esm/FrappeCalendar.native.js +6 -10
- package/dist/esm/FrappeCalendar.native.js.map +1 -1
- package/dist/esm/FrappeChartCard.mjs +2 -0
- package/dist/esm/FrappeChartCard.mjs.map +1 -1
- package/dist/esm/FrappeChartCard.native.js +2 -0
- package/dist/esm/FrappeChartCard.native.js.map +1 -1
- package/dist/esm/FrappeDashboard.mjs +12 -19
- package/dist/esm/FrappeDashboard.mjs.map +1 -1
- package/dist/esm/FrappeDashboard.native.js +23 -21
- package/dist/esm/FrappeDashboard.native.js.map +1 -1
- package/dist/esm/FrappeForm.mjs +3 -1
- package/dist/esm/FrappeForm.mjs.map +1 -1
- package/dist/esm/FrappeForm.native.js +3 -1
- package/dist/esm/FrappeForm.native.js.map +1 -1
- package/dist/esm/FrappeGantt.mjs +6 -8
- package/dist/esm/FrappeGantt.mjs.map +1 -1
- package/dist/esm/FrappeGantt.native.js +6 -10
- package/dist/esm/FrappeGantt.native.js.map +1 -1
- package/dist/esm/FrappeImageView.mjs +3 -1
- package/dist/esm/FrappeImageView.mjs.map +1 -1
- package/dist/esm/FrappeImageView.native.js +3 -1
- package/dist/esm/FrappeImageView.native.js.map +1 -1
- package/dist/esm/FrappeKPICard.mjs +2 -0
- package/dist/esm/FrappeKPICard.mjs.map +1 -1
- package/dist/esm/FrappeKPICard.native.js +2 -0
- package/dist/esm/FrappeKPICard.native.js.map +1 -1
- package/dist/esm/FrappeKanban.mjs +3 -1
- package/dist/esm/FrappeKanban.mjs.map +1 -1
- package/dist/esm/FrappeKanban.native.js +3 -1
- package/dist/esm/FrappeKanban.native.js.map +1 -1
- package/dist/esm/FrappeLikedBy.mjs +2 -0
- package/dist/esm/FrappeLikedBy.mjs.map +1 -1
- package/dist/esm/FrappeLikedBy.native.js +2 -0
- package/dist/esm/FrappeLikedBy.native.js.map +1 -1
- package/dist/esm/FrappeList.mjs +3 -1
- package/dist/esm/FrappeList.mjs.map +1 -1
- package/dist/esm/FrappeList.native.js +3 -1
- package/dist/esm/FrappeList.native.js.map +1 -1
- package/dist/esm/FrappeListView.mjs +7 -13
- package/dist/esm/FrappeListView.mjs.map +1 -1
- package/dist/esm/FrappeListView.native.js +15 -14
- package/dist/esm/FrappeListView.native.js.map +1 -1
- package/dist/esm/FrappeProvider.mjs +5 -1
- package/dist/esm/FrappeProvider.mjs.map +1 -1
- package/dist/esm/FrappeProvider.native.js +5 -1
- package/dist/esm/FrappeProvider.native.js.map +1 -1
- package/dist/esm/FrappeReportBuilder.mjs +2 -0
- package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
- package/dist/esm/FrappeReportBuilder.native.js +2 -0
- package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
- package/dist/esm/FrappeReportView.mjs +26 -49
- package/dist/esm/FrappeReportView.mjs.map +1 -1
- package/dist/esm/FrappeReportView.native.js +38 -54
- package/dist/esm/FrappeReportView.native.js.map +1 -1
- package/dist/esm/FrappeTable.mjs +107 -33
- package/dist/esm/FrappeTable.mjs.map +1 -1
- package/dist/esm/FrappeTable.native.js +142 -44
- package/dist/esm/FrappeTable.native.js.map +1 -1
- package/dist/esm/FrappeTreeView.mjs +3 -1
- package/dist/esm/FrappeTreeView.mjs.map +1 -1
- package/dist/esm/FrappeTreeView.native.js +3 -1
- package/dist/esm/FrappeTreeView.native.js.map +1 -1
- package/dist/esm/SyncErrorNotice.mjs +51 -0
- package/dist/esm/SyncErrorNotice.mjs.map +1 -0
- package/dist/esm/SyncErrorNotice.native.js +53 -0
- package/dist/esm/SyncErrorNotice.native.js.map +1 -0
- package/dist/esm/commentActions.mjs +95 -0
- package/dist/esm/commentActions.mjs.map +1 -0
- package/dist/esm/commentActions.native.js +101 -0
- package/dist/esm/commentActions.native.js.map +1 -0
- package/dist/esm/components/attachments.mjs +2 -0
- package/dist/esm/components/attachments.mjs.map +1 -1
- package/dist/esm/components/attachments.native.js +2 -0
- package/dist/esm/components/attachments.native.js.map +1 -1
- package/dist/esm/components/tags.mjs +5 -0
- package/dist/esm/components/tags.mjs.map +1 -1
- package/dist/esm/components/tags.native.js +5 -0
- package/dist/esm/components/tags.native.js.map +1 -1
- package/dist/esm/components/timeline.mjs +31 -4
- package/dist/esm/components/timeline.mjs.map +1 -1
- package/dist/esm/components/timeline.native.js +35 -4
- package/dist/esm/components/timeline.native.js.map +1 -1
- package/dist/esm/desk/DeskFormSidebar.mjs +2 -0
- package/dist/esm/desk/DeskFormSidebar.mjs.map +1 -1
- package/dist/esm/desk/DeskFormSidebar.native.js +2 -0
- package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/esm/fieldRegistry.mjs +2 -0
- package/dist/esm/fieldRegistry.mjs.map +1 -1
- package/dist/esm/fieldRegistry.native.js +2 -0
- package/dist/esm/fieldRegistry.native.js.map +1 -1
- package/dist/esm/fields/Date/index.mjs +73 -9
- package/dist/esm/fields/Date/index.mjs.map +1 -1
- package/dist/esm/fields/Date/index.native.js +315 -38
- package/dist/esm/fields/Date/index.native.js.map +1 -1
- package/dist/esm/fields/Date/types.mjs +2 -0
- package/dist/esm/fields/Date/types.mjs.map +1 -0
- package/dist/esm/fields/Date/types.native.js +2 -0
- package/dist/esm/fields/Date/types.native.js.map +1 -0
- package/dist/esm/fields/Date/wire.mjs +4 -8
- package/dist/esm/fields/Date/wire.mjs.map +1 -1
- package/dist/esm/fields/Date/wire.native.js +4 -11
- package/dist/esm/fields/Date/wire.native.js.map +1 -1
- package/dist/esm/fields/DynamicLink.mjs +2 -0
- package/dist/esm/fields/DynamicLink.mjs.map +1 -1
- package/dist/esm/fields/DynamicLink.native.js +2 -0
- package/dist/esm/fields/DynamicLink.native.js.map +1 -1
- package/dist/esm/fields/FileUpload.mjs +2 -0
- package/dist/esm/fields/FileUpload.mjs.map +1 -1
- package/dist/esm/fields/FileUpload.native.js +2 -0
- package/dist/esm/fields/FileUpload.native.js.map +1 -1
- package/dist/esm/fields/TableMultiSelect.mjs +7 -2
- package/dist/esm/fields/TableMultiSelect.mjs.map +1 -1
- package/dist/esm/fields/TableMultiSelect.native.js +7 -2
- package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/esm/frappeStoryTarget.mjs +88 -2
- package/dist/esm/frappeStoryTarget.mjs.map +1 -1
- package/dist/esm/frappeStoryTarget.native.js +100 -2
- package/dist/esm/frappeStoryTarget.native.js.map +1 -1
- package/dist/esm/frappeUsers.mjs +2 -0
- package/dist/esm/frappeUsers.mjs.map +1 -1
- package/dist/esm/frappeUsers.native.js +2 -0
- package/dist/esm/frappeUsers.native.js.map +1 -1
- package/dist/esm/index.mjs +7 -3
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +7 -3
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/liveErrors.mjs +5 -1
- package/dist/esm/liveErrors.mjs.map +1 -1
- package/dist/esm/liveErrors.native.js +5 -1
- package/dist/esm/liveErrors.native.js.map +1 -1
- package/dist/esm/useFrappeAggregate.mjs +13 -1
- package/dist/esm/useFrappeAggregate.mjs.map +1 -1
- package/dist/esm/useFrappeAggregate.native.js +14 -1
- package/dist/esm/useFrappeAggregate.native.js.map +1 -1
- package/dist/esm/useFrappeFacets.mjs +299 -0
- package/dist/esm/useFrappeFacets.mjs.map +1 -0
- package/dist/esm/useFrappeFacets.native.js +599 -0
- package/dist/esm/useFrappeFacets.native.js.map +1 -0
- package/dist/jsx/FrappeAssignment.mjs +2 -0
- package/dist/jsx/FrappeAssignment.mjs.map +1 -1
- package/dist/jsx/FrappeAssignment.native.js +2 -0
- package/dist/jsx/FrappeAssignment.native.js.map +1 -1
- package/dist/jsx/FrappeCalendar.mjs +6 -8
- package/dist/jsx/FrappeCalendar.mjs.map +1 -1
- package/dist/jsx/FrappeCalendar.native.js +5 -9
- package/dist/jsx/FrappeCalendar.native.js.map +1 -1
- package/dist/jsx/FrappeChartCard.mjs +2 -0
- package/dist/jsx/FrappeChartCard.mjs.map +1 -1
- package/dist/jsx/FrappeChartCard.native.js +2 -0
- package/dist/jsx/FrappeChartCard.native.js.map +1 -1
- package/dist/jsx/FrappeDashboard.mjs +12 -19
- package/dist/jsx/FrappeDashboard.mjs.map +1 -1
- package/dist/jsx/FrappeDashboard.native.js +20 -22
- package/dist/jsx/FrappeDashboard.native.js.map +1 -1
- package/dist/jsx/FrappeForm.mjs +3 -1
- package/dist/jsx/FrappeForm.mjs.map +1 -1
- package/dist/jsx/FrappeForm.native.js +3 -1
- package/dist/jsx/FrappeForm.native.js.map +1 -1
- package/dist/jsx/FrappeGantt.mjs +6 -8
- package/dist/jsx/FrappeGantt.mjs.map +1 -1
- package/dist/jsx/FrappeGantt.native.js +5 -9
- package/dist/jsx/FrappeGantt.native.js.map +1 -1
- package/dist/jsx/FrappeImageView.mjs +3 -1
- package/dist/jsx/FrappeImageView.mjs.map +1 -1
- package/dist/jsx/FrappeImageView.native.js +3 -1
- package/dist/jsx/FrappeImageView.native.js.map +1 -1
- package/dist/jsx/FrappeKPICard.mjs +2 -0
- package/dist/jsx/FrappeKPICard.mjs.map +1 -1
- package/dist/jsx/FrappeKPICard.native.js +2 -0
- package/dist/jsx/FrappeKPICard.native.js.map +1 -1
- package/dist/jsx/FrappeKanban.mjs +3 -1
- package/dist/jsx/FrappeKanban.mjs.map +1 -1
- package/dist/jsx/FrappeKanban.native.js +3 -1
- package/dist/jsx/FrappeKanban.native.js.map +1 -1
- package/dist/jsx/FrappeLikedBy.mjs +2 -0
- package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
- package/dist/jsx/FrappeLikedBy.native.js +2 -0
- package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
- package/dist/jsx/FrappeList.mjs +3 -1
- package/dist/jsx/FrappeList.mjs.map +1 -1
- package/dist/jsx/FrappeList.native.js +3 -1
- package/dist/jsx/FrappeList.native.js.map +1 -1
- package/dist/jsx/FrappeListView.mjs +7 -13
- package/dist/jsx/FrappeListView.mjs.map +1 -1
- package/dist/jsx/FrappeListView.native.js +13 -12
- package/dist/jsx/FrappeListView.native.js.map +1 -1
- package/dist/jsx/FrappeProvider.mjs +5 -1
- package/dist/jsx/FrappeProvider.mjs.map +1 -1
- package/dist/jsx/FrappeProvider.native.js +5 -1
- package/dist/jsx/FrappeProvider.native.js.map +1 -1
- package/dist/jsx/FrappeReportBuilder.mjs +2 -0
- package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
- package/dist/jsx/FrappeReportBuilder.native.js +2 -0
- package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
- package/dist/jsx/FrappeReportView.mjs +26 -49
- package/dist/jsx/FrappeReportView.mjs.map +1 -1
- package/dist/jsx/FrappeReportView.native.js +35 -50
- package/dist/jsx/FrappeReportView.native.js.map +1 -1
- package/dist/jsx/FrappeTable.mjs +107 -33
- package/dist/jsx/FrappeTable.mjs.map +1 -1
- package/dist/jsx/FrappeTable.native.js +140 -42
- package/dist/jsx/FrappeTable.native.js.map +1 -1
- package/dist/jsx/FrappeTreeView.mjs +3 -1
- package/dist/jsx/FrappeTreeView.mjs.map +1 -1
- package/dist/jsx/FrappeTreeView.native.js +3 -1
- package/dist/jsx/FrappeTreeView.native.js.map +1 -1
- package/dist/jsx/SyncErrorNotice.mjs +51 -0
- package/dist/jsx/SyncErrorNotice.mjs.map +1 -0
- package/dist/jsx/SyncErrorNotice.native.js +92 -0
- package/dist/jsx/SyncErrorNotice.native.js.map +1 -0
- package/dist/jsx/commentActions.mjs +95 -0
- package/dist/jsx/commentActions.mjs.map +1 -0
- package/dist/jsx/commentActions.native.js +129 -0
- package/dist/jsx/commentActions.native.js.map +1 -0
- package/dist/jsx/components/attachments.mjs +2 -0
- package/dist/jsx/components/attachments.mjs.map +1 -1
- package/dist/jsx/components/attachments.native.js +2 -0
- package/dist/jsx/components/attachments.native.js.map +1 -1
- package/dist/jsx/components/tags.mjs +5 -0
- package/dist/jsx/components/tags.mjs.map +1 -1
- package/dist/jsx/components/tags.native.js +5 -0
- package/dist/jsx/components/tags.native.js.map +1 -1
- package/dist/jsx/components/timeline.mjs +31 -4
- package/dist/jsx/components/timeline.mjs.map +1 -1
- package/dist/jsx/components/timeline.native.js +33 -2
- package/dist/jsx/components/timeline.native.js.map +1 -1
- package/dist/jsx/desk/DeskFormSidebar.mjs +2 -0
- package/dist/jsx/desk/DeskFormSidebar.mjs.map +1 -1
- package/dist/jsx/desk/DeskFormSidebar.native.js +2 -0
- package/dist/jsx/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/jsx/fieldRegistry.mjs +2 -0
- package/dist/jsx/fieldRegistry.mjs.map +1 -1
- package/dist/jsx/fieldRegistry.native.js +2 -0
- package/dist/jsx/fieldRegistry.native.js.map +1 -1
- package/dist/jsx/fields/Date/index.mjs +73 -9
- package/dist/jsx/fields/Date/index.mjs.map +1 -1
- package/dist/jsx/fields/Date/index.native.js +325 -37
- package/dist/jsx/fields/Date/index.native.js.map +1 -1
- package/dist/jsx/fields/Date/types.mjs +2 -0
- package/dist/jsx/fields/Date/types.mjs.map +1 -0
- package/dist/jsx/fields/Date/types.native.js +21 -0
- package/dist/jsx/fields/Date/types.native.js.map +1 -0
- package/dist/jsx/fields/Date/wire.mjs +4 -8
- package/dist/jsx/fields/Date/wire.mjs.map +1 -1
- package/dist/jsx/fields/Date/wire.native.js +4 -11
- package/dist/jsx/fields/Date/wire.native.js.map +1 -1
- package/dist/jsx/fields/DynamicLink.mjs +2 -0
- package/dist/jsx/fields/DynamicLink.mjs.map +1 -1
- package/dist/jsx/fields/DynamicLink.native.js +2 -0
- package/dist/jsx/fields/DynamicLink.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload.mjs +2 -0
- package/dist/jsx/fields/FileUpload.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload.native.js +2 -0
- package/dist/jsx/fields/FileUpload.native.js.map +1 -1
- package/dist/jsx/fields/TableMultiSelect.mjs +7 -2
- package/dist/jsx/fields/TableMultiSelect.mjs.map +1 -1
- package/dist/jsx/fields/TableMultiSelect.native.js +6 -1
- package/dist/jsx/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/jsx/frappeStoryTarget.mjs +88 -2
- package/dist/jsx/frappeStoryTarget.mjs.map +1 -1
- package/dist/jsx/frappeStoryTarget.native.js +100 -0
- package/dist/jsx/frappeStoryTarget.native.js.map +1 -1
- package/dist/jsx/frappeUsers.mjs +2 -0
- package/dist/jsx/frappeUsers.mjs.map +1 -1
- package/dist/jsx/frappeUsers.native.js +2 -0
- package/dist/jsx/frappeUsers.native.js.map +1 -1
- package/dist/jsx/index.js +7 -3
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +7 -3
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +17 -4
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/liveErrors.mjs +5 -1
- package/dist/jsx/liveErrors.mjs.map +1 -1
- package/dist/jsx/liveErrors.native.js +5 -1
- package/dist/jsx/liveErrors.native.js.map +1 -1
- package/dist/jsx/useFrappeAggregate.mjs +13 -1
- package/dist/jsx/useFrappeAggregate.mjs.map +1 -1
- package/dist/jsx/useFrappeAggregate.native.js +14 -1
- package/dist/jsx/useFrappeAggregate.native.js.map +1 -1
- package/dist/jsx/useFrappeFacets.mjs +299 -0
- package/dist/jsx/useFrappeFacets.mjs.map +1 -0
- package/dist/jsx/useFrappeFacets.native.js +632 -0
- package/dist/jsx/useFrappeFacets.native.js.map +1 -0
- package/package.json +20 -20
- package/src/FormSidebar.stories.tsx +88 -10
- package/src/FrappeAssignment.tsx +2 -0
- package/src/FrappeCalendar.tsx +12 -7
- package/src/FrappeChartCard.tsx +9 -2
- package/src/FrappeDashboard.spec.tsx +95 -0
- package/src/FrappeDashboard.tsx +20 -41
- package/src/FrappeForm.stories.tsx +53 -46
- package/src/FrappeForm.tsx +11 -1
- package/src/FrappeGantt.tsx +12 -7
- package/src/FrappeImageView.tsx +11 -1
- package/src/FrappeKPICard.stories.tsx +4 -1
- package/src/FrappeKPICard.tsx +2 -0
- package/src/FrappeKanban.tsx +4 -0
- package/src/FrappeLikedBy.stories.tsx +26 -10
- package/src/FrappeLikedBy.tsx +2 -0
- package/src/FrappeList.tsx +11 -1
- package/src/FrappeListView.spec.tsx +144 -0
- package/src/FrappeListView.tsx +11 -23
- package/src/FrappeProvider.tsx +30 -2
- package/src/FrappeReportBuilder.tsx +2 -0
- package/src/FrappeReportView.spec.tsx +140 -16
- package/src/FrappeReportView.stories.tsx +12 -6
- package/src/FrappeReportView.tsx +62 -61
- package/src/FrappeTable.keepRows.spec.tsx +200 -0
- package/src/FrappeTable.retryStorm.spec.tsx +140 -0
- package/src/FrappeTable.spec.tsx +222 -0
- package/src/FrappeTable.tsx +211 -54
- package/src/FrappeTreeView.tsx +11 -1
- package/src/SyncErrorNotice.spec.tsx +60 -0
- package/src/SyncErrorNotice.tsx +81 -0
- package/src/commentActions.ts +157 -0
- package/src/components/attachments.tsx +2 -0
- package/src/components/tags.tsx +14 -1
- package/src/components/timeline.optimistic.spec.tsx +106 -0
- package/src/components/timeline.tsx +36 -4
- package/src/desk/DeskFormSidebar.tsx +2 -0
- package/src/fieldRegistry.ts +2 -0
- package/src/fields/Date/index.native.tsx +410 -0
- package/src/fields/Date/index.tsx +138 -57
- package/src/fields/Date/nativePresentation.spec.tsx +251 -0
- package/src/fields/Date/typeParity.spec.tsx +480 -0
- package/src/fields/Date/types.ts +53 -0
- package/src/fields/Date/wire.spec.ts +63 -1
- package/src/fields/Date/wire.ts +17 -17
- package/src/fields/DynamicLink.tsx +2 -0
- package/src/fields/FileUpload.tsx +2 -0
- package/src/fields/TableMultiSelect.tsx +6 -3
- package/src/frappeStoryTarget.tsx +104 -1
- package/src/frappeUsers.ts +2 -0
- package/src/index.spec.ts +62 -0
- package/src/index.ts +36 -2
- package/src/liveErrors.spec.ts +50 -0
- package/src/liveErrors.ts +11 -1
- package/src/useFrappeAggregate.ts +20 -1
- package/src/useFrappeFacets.spec.tsx +436 -0
- package/src/useFrappeFacets.ts +568 -0
- package/types/FrappeAssignment.d.ts.map +1 -1
- package/types/FrappeCalendar.d.ts.map +1 -1
- package/types/FrappeChartCard.d.ts +1 -2
- package/types/FrappeChartCard.d.ts.map +1 -1
- package/types/FrappeDashboard.d.ts +0 -1
- package/types/FrappeDashboard.d.ts.map +1 -1
- package/types/FrappeForm.d.ts.map +1 -1
- package/types/FrappeGantt.d.ts.map +1 -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 +18 -1
- package/types/FrappeProvider.d.ts.map +1 -1
- package/types/FrappeReportBuilder.d.ts.map +1 -1
- package/types/FrappeReportView.d.ts +22 -15
- package/types/FrappeReportView.d.ts.map +1 -1
- package/types/FrappeTable.d.ts +21 -2
- package/types/FrappeTable.d.ts.map +1 -1
- package/types/FrappeTreeView.d.ts.map +1 -1
- package/types/SyncErrorNotice.d.ts +38 -0
- package/types/SyncErrorNotice.d.ts.map +1 -0
- package/types/commentActions.d.ts +46 -0
- package/types/commentActions.d.ts.map +1 -0
- 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/fieldRegistry.d.ts.map +1 -1
- package/types/fields/Date/index.d.ts +22 -12
- package/types/fields/Date/index.d.ts.map +1 -1
- package/types/fields/Date/index.native.d.ts +14 -0
- package/types/fields/Date/index.native.d.ts.map +1 -0
- package/types/fields/Date/types.d.ts +27 -0
- package/types/fields/Date/types.d.ts.map +1 -0
- package/types/fields/Date/wire.d.ts +13 -9
- package/types/fields/Date/wire.d.ts.map +1 -1
- package/types/fields/DynamicLink.d.ts.map +1 -1
- package/types/fields/FileUpload.d.ts.map +1 -1
- package/types/fields/TableMultiSelect.d.ts.map +1 -1
- package/types/frappeStoryTarget.d.ts +19 -1
- package/types/frappeStoryTarget.d.ts.map +1 -1
- package/types/frappeUsers.d.ts.map +1 -1
- package/types/index.d.ts +6 -2
- package/types/index.d.ts.map +1 -1
- package/types/liveErrors.d.ts +4 -0
- package/types/liveErrors.d.ts.map +1 -1
- package/types/useFrappeAggregate.d.ts +4 -0
- package/types/useFrappeAggregate.d.ts.map +1 -1
- package/types/useFrappeFacets.d.ts +143 -0
- package/types/useFrappeFacets.d.ts.map +1 -0
- package/dist/cjs/fields/Date/date.native.js +0 -277
- package/dist/cjs/fields/Date/date.native.js.map +0 -1
- package/dist/esm/fields/Date/date.native.js +0 -238
- package/dist/esm/fields/Date/date.native.js.map +0 -1
- package/dist/jsx/fields/Date/date.native.js +0 -277
- package/dist/jsx/fields/Date/date.native.js.map +0 -1
- package/src/fields/Date/date.native.tsx +0 -299
- package/types/fields/Date/date.native.d.ts +0 -19
- package/types/fields/Date/date.native.d.ts.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplatform.one/frappe-ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"description": "Pre-wired Tamagui components for Frappe doctypes with live data",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cross-platform",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
68
|
"@phosphor-icons/react": "^2.1.10",
|
|
69
|
-
"@tamagui/colors": "2.
|
|
69
|
+
"@tamagui/colors": "2.7.6",
|
|
70
70
|
"@tanstack/db": "0.6.5",
|
|
71
71
|
"@tanstack/react-hotkeys": "^0.5.1",
|
|
72
72
|
"@tiptap/extension-image": "^3.30.0",
|
|
@@ -77,22 +77,22 @@
|
|
|
77
77
|
"@tiptap/starter-kit": "^3.30.0",
|
|
78
78
|
"html5-qrcode": "^2.3.8",
|
|
79
79
|
"signature_pad": "^5.1.3",
|
|
80
|
-
"tamagui": "2.
|
|
81
|
-
"@multiplatform.one/components": "
|
|
82
|
-
"@multiplatform.one/
|
|
83
|
-
"@multiplatform.one/
|
|
84
|
-
"@multiplatform.one/
|
|
85
|
-
"@multiplatform.one/
|
|
86
|
-
"@multiplatform.one/
|
|
87
|
-
"@multiplatform.one/
|
|
88
|
-
"@multiplatform.one/rich-text": "
|
|
89
|
-
"@multiplatform.one/
|
|
90
|
-
"@multiplatform.one/
|
|
91
|
-
"@multiplatform.one/
|
|
92
|
-
"@multiplatform.one/
|
|
80
|
+
"tamagui": "2.7.6",
|
|
81
|
+
"@multiplatform.one/components": "7.0.0",
|
|
82
|
+
"@multiplatform.one/desktop": "7.0.0",
|
|
83
|
+
"@multiplatform.one/frappe": "7.0.0",
|
|
84
|
+
"@multiplatform.one/forms": "7.0.0",
|
|
85
|
+
"@multiplatform.one/i18n": "7.0.0",
|
|
86
|
+
"@multiplatform.one/markdown": "7.0.0",
|
|
87
|
+
"@multiplatform.one/platform": "7.0.0",
|
|
88
|
+
"@multiplatform.one/rich-text": "7.0.0",
|
|
89
|
+
"@multiplatform.one/router": "7.0.0",
|
|
90
|
+
"@multiplatform.one/store": "7.0.0",
|
|
91
|
+
"@multiplatform.one/table": "7.0.0",
|
|
92
|
+
"@multiplatform.one/theme": "7.0.0"
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
|
-
"@tamagui/build": "2.
|
|
95
|
+
"@tamagui/build": "2.7.6",
|
|
96
96
|
"@testing-library/react": "^16.3.2",
|
|
97
97
|
"@types/react": "~19.2.14",
|
|
98
98
|
"@types/react-dom": "^19.2.3",
|
|
@@ -102,12 +102,12 @@
|
|
|
102
102
|
"react-dom": "19.2.5",
|
|
103
103
|
"react-i18next": "^16.6.6",
|
|
104
104
|
"vitest": "^4.1.5",
|
|
105
|
-
"@multiplatform.one/config": "
|
|
106
|
-
"@multiplatform.one/storybook": "
|
|
107
|
-
"@multiplatform.one/test-utils": "
|
|
105
|
+
"@multiplatform.one/config": "7.0.0",
|
|
106
|
+
"@multiplatform.one/storybook": "7.0.0",
|
|
107
|
+
"@multiplatform.one/test-utils": "7.0.0"
|
|
108
108
|
},
|
|
109
109
|
"peerDependencies": {
|
|
110
|
-
"@react-native-community/datetimepicker": "
|
|
110
|
+
"@react-native-community/datetimepicker": ">=8.0.1",
|
|
111
111
|
"react": "^19.1.0",
|
|
112
112
|
"react-dom": "^19.1.0",
|
|
113
113
|
"react-i18next": ">=14",
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
type SidebarSection,
|
|
27
27
|
} from "./FormSidebar";
|
|
28
28
|
import { FrappeForm } from "./FrappeForm";
|
|
29
|
-
import { FrappeStoryProvider } from "./frappeStoryTarget";
|
|
29
|
+
import { FrappeStoryProvider, LiveToDoGate } from "./frappeStoryTarget";
|
|
30
30
|
|
|
31
31
|
export default {
|
|
32
32
|
title: "FrappeUI/FormSidebar",
|
|
@@ -343,18 +343,92 @@ export const DeskParity = () => {
|
|
|
343
343
|
// Live bench story — sidebar data plumbing over the live data path
|
|
344
344
|
// ---------------------------------------------------------------------------
|
|
345
345
|
|
|
346
|
+
/**
|
|
347
|
+
* Getdoctype-shaped ToDo meta for the fixture fallback, mirroring the bench's
|
|
348
|
+
* own ToDo (title_field `description`, the Reference section, the two fields
|
|
349
|
+
* the story hides). Schema mode cannot render without meta, so the documented
|
|
350
|
+
* "falls back to fixtures when the bench is down" promise needs this entry —
|
|
351
|
+
* without it the offline story only ever showed a failed meta request.
|
|
352
|
+
*/
|
|
353
|
+
const todoFixtureMeta = {
|
|
354
|
+
name: "ToDo",
|
|
355
|
+
doctype: "DocType",
|
|
356
|
+
module: "Desk",
|
|
357
|
+
title_field: "description",
|
|
358
|
+
sort_field: "modified",
|
|
359
|
+
sort_order: "DESC",
|
|
360
|
+
fields: [
|
|
361
|
+
{ fieldname: "description_and_status", fieldtype: "Section Break" },
|
|
362
|
+
{
|
|
363
|
+
fieldname: "status",
|
|
364
|
+
fieldtype: "Select",
|
|
365
|
+
label: "Status",
|
|
366
|
+
options: "Open\nClosed\nCancelled",
|
|
367
|
+
in_list_view: 1,
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
fieldname: "priority",
|
|
371
|
+
fieldtype: "Select",
|
|
372
|
+
label: "Priority",
|
|
373
|
+
options: "High\nMedium\nLow",
|
|
374
|
+
in_list_view: 1,
|
|
375
|
+
},
|
|
376
|
+
{ fieldname: "column_break_2", fieldtype: "Column Break" },
|
|
377
|
+
{ fieldname: "color", fieldtype: "Color", label: "Color" },
|
|
378
|
+
{ fieldname: "date", fieldtype: "Date", label: "Due Date", in_list_view: 1 },
|
|
379
|
+
{ fieldname: "allocated_to", fieldtype: "Link", label: "Allocated To", options: "User" },
|
|
380
|
+
{ fieldname: "description_section", fieldtype: "Section Break" },
|
|
381
|
+
{ fieldname: "description", fieldtype: "Text Editor", label: "Description", reqd: 1 },
|
|
382
|
+
{ fieldname: "section_break_6", fieldtype: "Section Break", label: "Reference" },
|
|
383
|
+
{
|
|
384
|
+
fieldname: "reference_type",
|
|
385
|
+
fieldtype: "Link",
|
|
386
|
+
label: "Reference Type",
|
|
387
|
+
options: "DocType",
|
|
388
|
+
in_list_view: 1,
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
fieldname: "reference_name",
|
|
392
|
+
fieldtype: "Dynamic Link",
|
|
393
|
+
label: "Reference Name",
|
|
394
|
+
options: "reference_type",
|
|
395
|
+
},
|
|
396
|
+
{ fieldname: "column_break_10", fieldtype: "Column Break" },
|
|
397
|
+
{ fieldname: "role", fieldtype: "Link", label: "Role", options: "Role" },
|
|
398
|
+
{ fieldname: "assigned_by", fieldtype: "Link", label: "Assigned By", options: "User" },
|
|
399
|
+
{
|
|
400
|
+
fieldname: "assigned_by_full_name",
|
|
401
|
+
fieldtype: "Read Only",
|
|
402
|
+
label: "Assigned By Full Name",
|
|
403
|
+
},
|
|
404
|
+
{ fieldname: "sender", fieldtype: "Data", label: "Sender", options: "Email" },
|
|
405
|
+
{
|
|
406
|
+
fieldname: "assignment_rule",
|
|
407
|
+
fieldtype: "Link",
|
|
408
|
+
label: "Assignment Rule",
|
|
409
|
+
options: "Assignment Rule",
|
|
410
|
+
read_only: 1,
|
|
411
|
+
},
|
|
412
|
+
],
|
|
413
|
+
permissions: [{ role: "All", read: 1, write: 1 }],
|
|
414
|
+
};
|
|
415
|
+
|
|
346
416
|
/**
|
|
347
417
|
* Live sidebar plumbing: renders FrappeForm (schema mode + showSidebar)
|
|
348
418
|
* against the real bench ToDo doctype so the sidebar's assignments
|
|
349
419
|
* (`_assign`), shares (DocShare) and metadata reflect realtime changes to
|
|
350
420
|
* the open document in place. The `name` arg selects the document
|
|
351
|
-
* (harnesses pass a real doc name via URL args).
|
|
352
|
-
*
|
|
421
|
+
* (harnesses pass a real doc name via URL args). When live with no arg,
|
|
422
|
+
* LiveToDoGate resolves a real ToDo so the story does not 404 on a
|
|
423
|
+
* hash-named doctype. Falls back to fixtures when the bench is down —
|
|
424
|
+
* the `DocType` entry below is what makes the offline branch render a
|
|
425
|
+
* form rather than a meta error.
|
|
353
426
|
*/
|
|
354
427
|
export const Live = (args: { name?: string }) => (
|
|
355
428
|
<FrappeStoryProvider
|
|
356
429
|
fixtures={
|
|
357
430
|
new InMemoryFixtureProvider({
|
|
431
|
+
DocType: [todoFixtureMeta],
|
|
358
432
|
ToDo: [
|
|
359
433
|
{
|
|
360
434
|
name: "TODO-LIVE-001",
|
|
@@ -368,12 +442,16 @@ export const Live = (args: { name?: string }) => (
|
|
|
368
442
|
})
|
|
369
443
|
}
|
|
370
444
|
>
|
|
371
|
-
<
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
445
|
+
<LiveToDoGate name={args.name}>
|
|
446
|
+
{(name) => (
|
|
447
|
+
<FrappeForm
|
|
448
|
+
doctype="ToDo"
|
|
449
|
+
name={name}
|
|
450
|
+
showSidebar
|
|
451
|
+
hideFields={["assigned_by_full_name", "sender"]}
|
|
452
|
+
/>
|
|
453
|
+
)}
|
|
454
|
+
</LiveToDoGate>
|
|
377
455
|
</FrappeStoryProvider>
|
|
378
456
|
);
|
|
379
457
|
Live.args = { name: "" };
|
|
@@ -382,7 +460,7 @@ Live.parameters = {
|
|
|
382
460
|
docs: {
|
|
383
461
|
description: {
|
|
384
462
|
story:
|
|
385
|
-
"Live sidebar over the real bench: assignments (_assign), shares (DocShare subscription) and metadata update in place when the open ToDo changes on the server. Fixture fallback when the bench is down.",
|
|
463
|
+
"Live sidebar over the real bench: assignments (_assign), shares (DocShare subscription) and metadata update in place when the open ToDo changes on the server. Opens a real bench ToDo so the live arm is not a 404. Administrator sees live DocShare rows; an ordinary Desk User is refused DocShare (403) and the Shared With section degrades — that is expected, not a product failure. Fixture fallback when the bench is down.",
|
|
386
464
|
},
|
|
387
465
|
},
|
|
388
466
|
};
|
package/src/FrappeAssignment.tsx
CHANGED
|
@@ -248,6 +248,8 @@ function FrappeAssignmentBody({
|
|
|
248
248
|
? {
|
|
249
249
|
baseURL: config.baseURL,
|
|
250
250
|
socketPort: config.socketPort,
|
|
251
|
+
siteName: config.siteName,
|
|
252
|
+
socketBaseURL: config.socketBaseURL,
|
|
251
253
|
auth: config.auth,
|
|
252
254
|
syncOptions: config.syncOptions,
|
|
253
255
|
fixtures: config.fixtures,
|
package/src/FrappeCalendar.tsx
CHANGED
|
@@ -9,7 +9,12 @@ import { Spinner } from "@multiplatform.one/forms";
|
|
|
9
9
|
import React, { useMemo, useCallback, useState, type ReactNode } from "react";
|
|
10
10
|
import { Text, YStack, type YStackProps } from "tamagui";
|
|
11
11
|
import { useTranslation } from "react-i18next";
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
formatCalendarDate,
|
|
14
|
+
parseCalendarDate,
|
|
15
|
+
useChartPalette,
|
|
16
|
+
useResolvedKnobs,
|
|
17
|
+
} from "@multiplatform.one/theme";
|
|
13
18
|
import { FrappeConnectionIndicator } from "./FrappeConnectionIndicator";
|
|
14
19
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
15
20
|
import { describeSyncError } from "./syncError";
|
|
@@ -64,12 +69,8 @@ export interface FrappeCalendarProps<TDoc extends { name: string; doctype: strin
|
|
|
64
69
|
*/
|
|
65
70
|
function toFrappeFieldValue(original: unknown, next: Date): unknown {
|
|
66
71
|
if (original instanceof Date) return next;
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
if (typeof original === "string" && original.includes(":")) {
|
|
70
|
-
return `${datePart} ${pad(next.getHours())}:${pad(next.getMinutes())}:${pad(next.getSeconds())}`;
|
|
71
|
-
}
|
|
72
|
-
return datePart;
|
|
72
|
+
const carriesTime = typeof original === "string" && original.includes(":");
|
|
73
|
+
return formatCalendarDate(next, carriesTime ? "datetime" : "date");
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
/**
|
|
@@ -141,6 +142,8 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
|
|
|
141
142
|
() => ({
|
|
142
143
|
baseURL: finalBaseURL,
|
|
143
144
|
socketPort: config?.socketPort,
|
|
145
|
+
siteName: config?.siteName,
|
|
146
|
+
socketBaseURL: config?.socketBaseURL,
|
|
144
147
|
auth: finalAuth,
|
|
145
148
|
syncOptions: finalSyncOptions,
|
|
146
149
|
socketOptions: config?.socketOptions,
|
|
@@ -149,6 +152,8 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
|
|
|
149
152
|
[
|
|
150
153
|
finalBaseURL,
|
|
151
154
|
config?.socketPort,
|
|
155
|
+
config?.siteName,
|
|
156
|
+
config?.socketBaseURL,
|
|
152
157
|
finalAuth,
|
|
153
158
|
finalSyncOptions,
|
|
154
159
|
config?.socketOptions,
|
package/src/FrappeChartCard.tsx
CHANGED
|
@@ -16,12 +16,17 @@
|
|
|
16
16
|
* returns no groups, and a subtle stale dim while a post-event refetch is
|
|
17
17
|
* in flight.
|
|
18
18
|
*/
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
AsyncBoundary,
|
|
21
|
+
Skeleton,
|
|
22
|
+
type ChartCardProps,
|
|
23
|
+
type ChartConfig,
|
|
24
|
+
} from "@multiplatform.one/components";
|
|
20
25
|
import React, { useMemo } from "react";
|
|
21
26
|
import { useTranslation } from "react-i18next";
|
|
22
27
|
import { Card, YStack, type YStackProps } from "tamagui";
|
|
23
28
|
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
24
|
-
import { ChartCard
|
|
29
|
+
import { ChartCard } from "./FrappeDashboard";
|
|
25
30
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
26
31
|
import {
|
|
27
32
|
useFrappeAggregate,
|
|
@@ -101,6 +106,8 @@ export function FrappeChartCard({
|
|
|
101
106
|
? {
|
|
102
107
|
baseURL: finalBaseURL,
|
|
103
108
|
socketPort: providerConfig?.socketPort,
|
|
109
|
+
siteName: providerConfig?.siteName,
|
|
110
|
+
socketBaseURL: providerConfig?.socketBaseURL,
|
|
104
111
|
auth: auth ?? providerConfig?.auth,
|
|
105
112
|
syncOptions: syncOptions ?? providerConfig?.syncOptions,
|
|
106
113
|
fixtures: providerConfig?.fixtures,
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// FrappeDashboard refresh trigger — LC-54 PRESS-FLOOR-CHANNEL (amendment
|
|
2
|
+
// 2026-08-13, "the grown box NEVER PAINTS"): the refresh affordance used to
|
|
3
|
+
// be a raw tamagui Button riding a grown transparent press target (negative
|
|
4
|
+
// outsets escaping the header slot) whose default hover fill painted the
|
|
5
|
+
// whole escaped 44px floor. The fix migrates it to the house forms Button
|
|
6
|
+
// with `circular`, whose painted box ITSELF is the 44×44 control — feedback
|
|
7
|
+
// stays inside its own reserved layout slot (box-is-control mechanism).
|
|
8
|
+
//
|
|
9
|
+
// jsdom never applies :hover, but tamagui compiles style props into
|
|
10
|
+
// value-carrying atomic classes, so both the escape mechanism (negative
|
|
11
|
+
// margin atoms) and the paint channel are asserted through the atoms each
|
|
12
|
+
// node carries, with a positive control proving the detectors see them.
|
|
13
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
14
|
+
import { pressTargetStyle } from "@multiplatform.one/theme";
|
|
15
|
+
import { cleanup, screen } from "@testing-library/react";
|
|
16
|
+
import i18next from "i18next";
|
|
17
|
+
import { initReactI18next } from "react-i18next";
|
|
18
|
+
import { View } from "tamagui";
|
|
19
|
+
import { afterEach, beforeAll, describe, expect, it } from "vitest";
|
|
20
|
+
import { FrappeDashboard } from "./FrappeDashboard";
|
|
21
|
+
import { FrappeProvider } from "./FrappeProvider";
|
|
22
|
+
|
|
23
|
+
beforeAll(async () => {
|
|
24
|
+
await i18next.use(initReactI18next).init({
|
|
25
|
+
lng: "en",
|
|
26
|
+
interpolation: { escapeValue: false },
|
|
27
|
+
resources: { en: { translation: {} } },
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
afterEach(cleanup);
|
|
32
|
+
|
|
33
|
+
/** The retired anatomy, re-created as the positive control for both detectors. */
|
|
34
|
+
function OldGrownPaintedFloor() {
|
|
35
|
+
return (
|
|
36
|
+
<View
|
|
37
|
+
data-testid="old-anatomy"
|
|
38
|
+
{...pressTargetStyle()}
|
|
39
|
+
marginVertical={-8}
|
|
40
|
+
marginHorizontal={-8}
|
|
41
|
+
hoverStyle={{ backgroundColor: "$color4" }}
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Grown-box escape mechanism: any negative margin atom on the press floor.
|
|
47
|
+
const negativeMarginAtom = /_m[trbl]--\d/;
|
|
48
|
+
// Painted state feedback: any non-transparent hover/press background atom.
|
|
49
|
+
const paintedStateAtom = /_bg-0(?:hover|active)-(?!transparent)/;
|
|
50
|
+
|
|
51
|
+
describe("FrappeDashboard refresh press floor (LC-54 amendment)", () => {
|
|
52
|
+
const renderStatic = () =>
|
|
53
|
+
renderWithProviders(
|
|
54
|
+
<FrappeProvider baseURL="https://dashboard.spec.test">
|
|
55
|
+
<FrappeDashboard title="Sales" widgets={[]} />
|
|
56
|
+
</FrappeProvider>,
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
it("positive control: the detectors see the retired grown painted anatomy", () => {
|
|
60
|
+
renderWithProviders(<OldGrownPaintedFloor />);
|
|
61
|
+
const oldFloor = screen.getByTestId("old-anatomy");
|
|
62
|
+
expect(oldFloor.className).toMatch(negativeMarginAtom);
|
|
63
|
+
expect(oldFloor.className).toMatch(paintedStateAtom);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("renders the refresh trigger as a role=button with its accessible name", () => {
|
|
67
|
+
const { container } = renderStatic();
|
|
68
|
+
const refresh = container.querySelector('[aria-label="Refresh"]') as HTMLElement;
|
|
69
|
+
expect(refresh).not.toBeNull();
|
|
70
|
+
expect(refresh.getAttribute("role")).toBe("button");
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("the refresh floor is its own box — no grown-target negative outset", () => {
|
|
74
|
+
const { container } = renderStatic();
|
|
75
|
+
const refresh = container.querySelector('[aria-label="Refresh"]') as HTMLElement;
|
|
76
|
+
// The house circular Button reserves the 44px floor as REAL layout
|
|
77
|
+
// (box-is-control); the escape mechanism (negative margins pulling the
|
|
78
|
+
// grown box over neighbors) must be gone.
|
|
79
|
+
expect(refresh.className).not.toMatch(negativeMarginAtom);
|
|
80
|
+
expect(refresh.className).toMatch(/_mih-44px/);
|
|
81
|
+
expect(refresh.className).toMatch(/_miw-44px/);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("hover feedback rides the button's own in-slot box (house channel)", () => {
|
|
85
|
+
const { container } = renderStatic();
|
|
86
|
+
const refresh = container.querySelector('[aria-label="Refresh"]') as HTMLElement;
|
|
87
|
+
// Paint on the OWN box is the sanctioned own-size mechanism — what the
|
|
88
|
+
// amendment bans is paint on a box that escapes its slot. With the
|
|
89
|
+
// outset gone (arm above), the house hover fill on this node is legal
|
|
90
|
+
// and expected; its absence would mean the house Button stopped
|
|
91
|
+
// owning the feedback.
|
|
92
|
+
expect(refresh.className).toMatch(paintedStateAtom);
|
|
93
|
+
expect(refresh.querySelector("svg")).not.toBeNull();
|
|
94
|
+
});
|
|
95
|
+
});
|
package/src/FrappeDashboard.tsx
CHANGED
|
@@ -13,28 +13,9 @@ import {
|
|
|
13
13
|
import { ArrowsClockwiseIcon } from "@phosphor-icons/react";
|
|
14
14
|
import React, { useMemo, useCallback, useState, useEffect, useRef } from "react";
|
|
15
15
|
import { useTranslation } from "react-i18next";
|
|
16
|
-
import { Spinner } from "@multiplatform.one/forms";
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
formatTimeOfDay,
|
|
20
|
-
MIN_PRESS_TARGET,
|
|
21
|
-
pressTargetHitSlop,
|
|
22
|
-
pressTargetStyle,
|
|
23
|
-
useResolvedKnobs,
|
|
24
|
-
} from "@multiplatform.one/theme";
|
|
25
|
-
|
|
26
|
-
// DG-LAY-04 / D-02 press-floor: the chromeless $2 refresh button paints
|
|
27
|
-
// ~28×28; the press box is floored at 44 via the house pressTarget* channel
|
|
28
|
-
// (grown transparent box + negative outset + hitSlop). Layout stays put; the
|
|
29
|
-
// only adjacent node is non-interactive text, so no target overlap.
|
|
30
|
-
const REFRESH_VISUAL = 28;
|
|
31
|
-
const REFRESH_OUTSET = Math.ceil((MIN_PRESS_TARGET - REFRESH_VISUAL) / 2);
|
|
32
|
-
const refreshPressFloorProps = {
|
|
33
|
-
...pressTargetStyle(),
|
|
34
|
-
marginVertical: -REFRESH_OUTSET,
|
|
35
|
-
marginHorizontal: -REFRESH_OUTSET,
|
|
36
|
-
hitSlop: pressTargetHitSlop(REFRESH_VISUAL),
|
|
37
|
-
} as const;
|
|
16
|
+
import { Button, Spinner } from "@multiplatform.one/forms";
|
|
17
|
+
import { Text, XStack, YStack, type YStackProps, H3 } from "tamagui";
|
|
18
|
+
import { formatTimeOfDay, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
38
19
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
39
20
|
|
|
40
21
|
/**
|
|
@@ -75,6 +56,10 @@ export interface FrappeDashboardProps<TDoc extends { name: string; doctype: stri
|
|
|
75
56
|
type ConnectionConfig = {
|
|
76
57
|
baseURL: string;
|
|
77
58
|
socketPort?: number;
|
|
59
|
+
/** Same-origin socket override (see FrappeConfig.socketBaseURL). */
|
|
60
|
+
socketBaseURL?: string;
|
|
61
|
+
/** Frappe site name — the realtime Socket.IO namespace. */
|
|
62
|
+
siteName?: string;
|
|
78
63
|
auth?: FrappeDashboardProps<{ name: string; doctype: string }>["auth"];
|
|
79
64
|
syncOptions?: unknown;
|
|
80
65
|
fixtures?: unknown;
|
|
@@ -221,14 +206,20 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
|
|
|
221
206
|
time: formatTimeOfDay(dataUpdatedAt ?? lastRefresh),
|
|
222
207
|
})}
|
|
223
208
|
</Text>
|
|
209
|
+
{/* LC-54 (amendment 2026-08-13): house Button, own-box floor —
|
|
210
|
+
the raw tamagui Button + grown transparent target painted
|
|
211
|
+
its hover fill across the escaped 44px floor. `circular`
|
|
212
|
+
makes the painted box ITSELF the 44×44 control (box-is-
|
|
213
|
+
control mechanism), so feedback stays inside its own slot.
|
|
214
|
+
`loading` (not bare `disabled`) is the derived busy state. */}
|
|
224
215
|
<Button
|
|
225
216
|
size="$2"
|
|
217
|
+
circular
|
|
226
218
|
icon={ArrowsClockwiseIcon}
|
|
227
219
|
onPress={onRefresh}
|
|
228
|
-
|
|
220
|
+
loading={isRefreshing || isLiveLoading}
|
|
229
221
|
chromeless
|
|
230
222
|
aria-label={t("Refresh")}
|
|
231
|
-
{...refreshPressFloorProps}
|
|
232
223
|
/>
|
|
233
224
|
</XStack>
|
|
234
225
|
)}
|
|
@@ -293,6 +284,8 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
|
|
|
293
284
|
? {
|
|
294
285
|
baseURL: finalBaseURL,
|
|
295
286
|
socketPort: config?.socketPort,
|
|
287
|
+
siteName: config?.siteName,
|
|
288
|
+
socketBaseURL: config?.socketBaseURL,
|
|
296
289
|
auth: finalAuth,
|
|
297
290
|
syncOptions: finalSyncOptions,
|
|
298
291
|
fixtures: config?.fixtures,
|
|
@@ -332,14 +325,15 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
|
|
|
332
325
|
{t("Last updated: {{time}}", { time: formatTimeOfDay(lastRefresh) })}
|
|
333
326
|
</Text>
|
|
334
327
|
)}
|
|
328
|
+
{/* LC-54: house Button, own-box floor (see the live-path refresh). */}
|
|
335
329
|
<Button
|
|
336
330
|
size="$2"
|
|
331
|
+
circular
|
|
337
332
|
icon={ArrowsClockwiseIcon}
|
|
338
333
|
onPress={bumpRefresh}
|
|
339
|
-
|
|
334
|
+
loading={isRefreshing}
|
|
340
335
|
chromeless
|
|
341
336
|
aria-label={t("Refresh")}
|
|
342
|
-
{...refreshPressFloorProps}
|
|
343
337
|
/>
|
|
344
338
|
</XStack>
|
|
345
339
|
</XStack>
|
|
@@ -386,21 +380,6 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
|
|
|
386
380
|
);
|
|
387
381
|
}
|
|
388
382
|
|
|
389
|
-
export {
|
|
390
|
-
KPICard,
|
|
391
|
-
calculateTrend,
|
|
392
|
-
calculatePercentageChange,
|
|
393
|
-
aggregateData,
|
|
394
|
-
type DashboardWidget,
|
|
395
|
-
type KPICardConfig,
|
|
396
|
-
type KPICardProps,
|
|
397
|
-
type ChartConfig,
|
|
398
|
-
type ChartCardProps,
|
|
399
|
-
type ChartDataPoint,
|
|
400
|
-
type ChartType,
|
|
401
|
-
type TrendDirection,
|
|
402
|
-
} from "@multiplatform.one/components";
|
|
403
|
-
|
|
404
383
|
/**
|
|
405
384
|
* ChartCard bridge that sanitizes series rows before render: values are
|
|
406
385
|
* coerced to numbers and rows without a finite value (missing, NaN,
|
|
@@ -9,7 +9,7 @@ import { Date } from "./fields/Date";
|
|
|
9
9
|
import { Numeric } from "./fields/Numeric";
|
|
10
10
|
import { FrappeForm } from "./FrappeForm";
|
|
11
11
|
import { FrappeProvider } from "./FrappeProvider";
|
|
12
|
-
import { FrappeStoryProvider } from "./frappeStoryTarget";
|
|
12
|
+
import { FrappeStoryProvider, LiveToDoGate } from "./frappeStoryTarget";
|
|
13
13
|
|
|
14
14
|
export default {
|
|
15
15
|
title: "FrappeUI/FrappeForm",
|
|
@@ -421,54 +421,61 @@ const liveFormFixtures = new InMemoryFixtureProvider({
|
|
|
421
421
|
* user has dirty are preserved and flagged via the conflict banner;
|
|
422
422
|
* `doc_deleted` for the open doc renders the read-only deleted banner. The
|
|
423
423
|
* `name` arg selects the document (harnesses pass the real doc name via URL
|
|
424
|
-
* args).
|
|
424
|
+
* args). When live with no arg, {@link LiveToDoGate} resolves a real ToDo
|
|
425
|
+
* (TODO-LIVE-001 if present, else the first readable row, else a seeded one)
|
|
426
|
+
* so the story does not 404 on a hash-named doctype. Falls back to fixtures
|
|
427
|
+
* when the bench is down.
|
|
425
428
|
*/
|
|
426
429
|
export const Live = (args: { name?: string }) => (
|
|
427
430
|
<FrappeStoryProvider fixtures={liveFormFixtures}>
|
|
428
|
-
<
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
431
|
+
<LiveToDoGate name={args.name}>
|
|
432
|
+
{(name) => (
|
|
433
|
+
<FrappeForm<LiveToDo>
|
|
434
|
+
doctype="ToDo"
|
|
435
|
+
name={name}
|
|
436
|
+
fields={["name", "description", "status", "priority"]}
|
|
437
|
+
onSave={action("onSave")}
|
|
438
|
+
onCancel={action("onCancel")}
|
|
439
|
+
>
|
|
440
|
+
{({ doc, setValue, errors, disabled }) => (
|
|
441
|
+
<YStack gap="$3" width={420}>
|
|
442
|
+
<Data
|
|
443
|
+
label="Description"
|
|
444
|
+
value={doc.description || ""}
|
|
445
|
+
onChange={(v) => setValue("description", v)}
|
|
446
|
+
error={errors.description}
|
|
447
|
+
disabled={disabled}
|
|
448
|
+
/>
|
|
449
|
+
{/* The real ToDo doctype pins 3-option enums; DG-CTRL-01 routes short
|
|
450
|
+
single choices to RadioGroup, so the live arm composes the honest
|
|
451
|
+
control instead of tripping `select-too-few-options` at rest. */}
|
|
452
|
+
<RadioGroupField
|
|
453
|
+
label="Status"
|
|
454
|
+
value={doc.status || ""}
|
|
455
|
+
onChange={(v) => setValue("status", v)}
|
|
456
|
+
options={[
|
|
457
|
+
{ label: "Open", value: "Open" },
|
|
458
|
+
{ label: "Closed", value: "Closed" },
|
|
459
|
+
{ label: "Cancelled", value: "Cancelled" },
|
|
460
|
+
]}
|
|
461
|
+
disabled={disabled}
|
|
462
|
+
/>
|
|
463
|
+
<RadioGroupField
|
|
464
|
+
label="Priority"
|
|
465
|
+
value={doc.priority || ""}
|
|
466
|
+
onChange={(v) => setValue("priority", v)}
|
|
467
|
+
options={[
|
|
468
|
+
{ label: "Low", value: "Low" },
|
|
469
|
+
{ label: "Medium", value: "Medium" },
|
|
470
|
+
{ label: "High", value: "High" },
|
|
471
|
+
]}
|
|
472
|
+
disabled={disabled}
|
|
473
|
+
/>
|
|
474
|
+
</YStack>
|
|
475
|
+
)}
|
|
476
|
+
</FrappeForm>
|
|
470
477
|
)}
|
|
471
|
-
</
|
|
478
|
+
</LiveToDoGate>
|
|
472
479
|
</FrappeStoryProvider>
|
|
473
480
|
);
|
|
474
481
|
Live.args = { name: "" };
|
|
@@ -477,7 +484,7 @@ Live.parameters = {
|
|
|
477
484
|
docs: {
|
|
478
485
|
description: {
|
|
479
486
|
story:
|
|
480
|
-
"Live ToDo edit form over the real bench: realtime doc_update patches clean fields in place, dirty fields are preserved with an honest conflict banner, doc_deleted renders the read-only deleted state. Fixture fallback when the bench is down.",
|
|
487
|
+
"Live ToDo edit form over the real bench: realtime doc_update patches clean fields in place, dirty fields are preserved with an honest conflict banner, doc_deleted renders the read-only deleted state. Opens a real bench ToDo (TODO-LIVE-001 when present, else the first readable row / a seeded one) so the live arm is not a 404 on a hash-named doctype. Fixture fallback when the bench is down. DocShare 403 for an ordinary Desk User is expected — the form still renders; Administrator sees live shares.",
|
|
481
488
|
},
|
|
482
489
|
},
|
|
483
490
|
};
|
package/src/FrappeForm.tsx
CHANGED
|
@@ -315,11 +315,21 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
315
315
|
() => ({
|
|
316
316
|
baseURL: finalBaseURL,
|
|
317
317
|
socketPort: config?.socketPort,
|
|
318
|
+
siteName: config?.siteName,
|
|
319
|
+
socketBaseURL: config?.socketBaseURL,
|
|
318
320
|
auth: finalAuth,
|
|
319
321
|
syncOptions: finalSyncOptions,
|
|
320
322
|
fixtures: config?.fixtures,
|
|
321
323
|
}),
|
|
322
|
-
[
|
|
324
|
+
[
|
|
325
|
+
finalBaseURL,
|
|
326
|
+
config?.socketPort,
|
|
327
|
+
config?.siteName,
|
|
328
|
+
config?.socketBaseURL,
|
|
329
|
+
finalAuth,
|
|
330
|
+
finalSyncOptions,
|
|
331
|
+
config?.fixtures,
|
|
332
|
+
],
|
|
323
333
|
);
|
|
324
334
|
|
|
325
335
|
// Fetch DocType metadata
|