@multiplatform.one/frappe-ui 6.6.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 +21 -21
- 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/src/FrappeGantt.tsx
CHANGED
|
@@ -8,7 +8,12 @@ import {
|
|
|
8
8
|
import React, { useCallback, useMemo, useState, type ReactNode } from "react";
|
|
9
9
|
import { Text, YStack, type YStackProps } from "tamagui";
|
|
10
10
|
import { useTranslation } from "react-i18next";
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
formatCalendarDate,
|
|
13
|
+
parseCalendarDate,
|
|
14
|
+
useChartPalette,
|
|
15
|
+
useResolvedKnobs,
|
|
16
|
+
} from "@multiplatform.one/theme";
|
|
12
17
|
import { FrappeConnectionIndicator } from "./FrappeConnectionIndicator";
|
|
13
18
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
14
19
|
import { describeSyncError } from "./syncError";
|
|
@@ -63,12 +68,8 @@ export interface FrappeGanttProps<TDoc extends { name: string; doctype: string }
|
|
|
63
68
|
*/
|
|
64
69
|
function toFrappeFieldValue(original: unknown, next: Date): unknown {
|
|
65
70
|
if (original instanceof Date) return next;
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
if (typeof original === "string" && original.includes(":")) {
|
|
69
|
-
return `${datePart} ${pad(next.getHours())}:${pad(next.getMinutes())}:${pad(next.getSeconds())}`;
|
|
70
|
-
}
|
|
71
|
-
return datePart;
|
|
71
|
+
const carriesTime = typeof original === "string" && original.includes(":");
|
|
72
|
+
return formatCalendarDate(next, carriesTime ? "datetime" : "date");
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
/**
|
|
@@ -139,6 +140,8 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
|
|
|
139
140
|
() => ({
|
|
140
141
|
baseURL: finalBaseURL,
|
|
141
142
|
socketPort: config?.socketPort,
|
|
143
|
+
siteName: config?.siteName,
|
|
144
|
+
socketBaseURL: config?.socketBaseURL,
|
|
142
145
|
auth: finalAuth,
|
|
143
146
|
syncOptions: finalSyncOptions,
|
|
144
147
|
socketOptions: config?.socketOptions,
|
|
@@ -147,6 +150,8 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
|
|
|
147
150
|
[
|
|
148
151
|
finalBaseURL,
|
|
149
152
|
config?.socketPort,
|
|
153
|
+
config?.siteName,
|
|
154
|
+
config?.socketBaseURL,
|
|
150
155
|
finalAuth,
|
|
151
156
|
finalSyncOptions,
|
|
152
157
|
config?.socketOptions,
|
package/src/FrappeImageView.tsx
CHANGED
|
@@ -185,11 +185,21 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
|
|
|
185
185
|
() => ({
|
|
186
186
|
baseURL: finalBaseURL,
|
|
187
187
|
socketPort: config?.socketPort,
|
|
188
|
+
siteName: config?.siteName,
|
|
189
|
+
socketBaseURL: config?.socketBaseURL,
|
|
188
190
|
auth: finalAuth,
|
|
189
191
|
syncOptions: finalSyncOptions,
|
|
190
192
|
fixtures: config?.fixtures,
|
|
191
193
|
}),
|
|
192
|
-
[
|
|
194
|
+
[
|
|
195
|
+
finalBaseURL,
|
|
196
|
+
config?.socketPort,
|
|
197
|
+
config?.siteName,
|
|
198
|
+
config?.socketBaseURL,
|
|
199
|
+
finalAuth,
|
|
200
|
+
finalSyncOptions,
|
|
201
|
+
config?.fixtures,
|
|
202
|
+
],
|
|
193
203
|
);
|
|
194
204
|
|
|
195
205
|
const { meta, isLoading: isMetaLoading } = useDocTypeMeta(appConfig, doctype);
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
2
|
+
// KPICard comes from the components catalog — the frappe-ui barrel
|
|
3
|
+
// re-exports it from there directly (./FrappeDashboard no longer bounces
|
|
4
|
+
// catalog names it does not define).
|
|
5
|
+
import { KPICard } from "@multiplatform.one/components";
|
|
2
6
|
import { action } from "@multiplatform.one/storybook";
|
|
3
7
|
import { CurrencyDollarIcon } from "@phosphor-icons/react";
|
|
4
8
|
import { XStack } from "tamagui";
|
|
5
|
-
import { KPICard } from "./FrappeDashboard";
|
|
6
9
|
import { FrappeKPICard } from "./FrappeKPICard";
|
|
7
10
|
import { FrappeStoryProvider } from "./frappeStoryTarget";
|
|
8
11
|
|
package/src/FrappeKPICard.tsx
CHANGED
|
@@ -99,6 +99,8 @@ export function FrappeKPICard({
|
|
|
99
99
|
? {
|
|
100
100
|
baseURL: finalBaseURL,
|
|
101
101
|
socketPort: providerConfig?.socketPort,
|
|
102
|
+
siteName: providerConfig?.siteName,
|
|
103
|
+
socketBaseURL: providerConfig?.socketBaseURL,
|
|
102
104
|
auth: auth ?? providerConfig?.auth,
|
|
103
105
|
syncOptions: syncOptions ?? providerConfig?.syncOptions,
|
|
104
106
|
fixtures: providerConfig?.fixtures,
|
package/src/FrappeKanban.tsx
CHANGED
|
@@ -117,6 +117,8 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
|
|
|
117
117
|
() => ({
|
|
118
118
|
baseURL: finalBaseURL,
|
|
119
119
|
socketPort: config?.socketPort,
|
|
120
|
+
siteName: config?.siteName,
|
|
121
|
+
socketBaseURL: config?.socketBaseURL,
|
|
120
122
|
auth: finalAuth,
|
|
121
123
|
syncOptions: finalSyncOptions,
|
|
122
124
|
socketOptions: config?.socketOptions,
|
|
@@ -125,6 +127,8 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
|
|
|
125
127
|
[
|
|
126
128
|
finalBaseURL,
|
|
127
129
|
config?.socketPort,
|
|
130
|
+
config?.siteName,
|
|
131
|
+
config?.socketBaseURL,
|
|
128
132
|
finalAuth,
|
|
129
133
|
finalSyncOptions,
|
|
130
134
|
config?.socketOptions,
|
|
@@ -2,7 +2,7 @@ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
|
2
2
|
import { action } from "@multiplatform.one/storybook";
|
|
3
3
|
import { FrappeLikedBy } from "./FrappeLikedBy";
|
|
4
4
|
import { FrappeProvider } from "./FrappeProvider";
|
|
5
|
-
import { FrappeStoryProvider, frappeStoriesLive } from "./frappeStoryTarget";
|
|
5
|
+
import { FrappeStoryProvider, LiveToDoGate, frappeStoriesLive } from "./frappeStoryTarget";
|
|
6
6
|
import type { FrappeUserDoc } from "./frappeUsers";
|
|
7
7
|
|
|
8
8
|
export default {
|
|
@@ -51,6 +51,18 @@ const makeFixtures = () =>
|
|
|
51
51
|
]),
|
|
52
52
|
},
|
|
53
53
|
],
|
|
54
|
+
// The live story's doctype. `Task` ships with ERPNext, not frappe, so a
|
|
55
|
+
// frappe-only bench answers `/api/resource/Task/TASK-001` with a 500
|
|
56
|
+
// ImportError instead of a document — the live arm has to name a doctype
|
|
57
|
+
// every bench actually has, and this fixture keeps its offline fallback
|
|
58
|
+
// rendering.
|
|
59
|
+
ToDo: [
|
|
60
|
+
{
|
|
61
|
+
name: "TODO-LIVE-001",
|
|
62
|
+
doctype: "ToDo",
|
|
63
|
+
_liked_by: JSON.stringify(["Administrator", "jane@example.com"]),
|
|
64
|
+
},
|
|
65
|
+
],
|
|
54
66
|
User: userFixtures,
|
|
55
67
|
});
|
|
56
68
|
|
|
@@ -153,14 +165,18 @@ export const LoadError = () => (
|
|
|
153
165
|
*/
|
|
154
166
|
export const Live = (args: { doctype?: string; docname?: string }) => (
|
|
155
167
|
<FrappeStoryProvider fixtures={makeFixtures()}>
|
|
156
|
-
<
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
168
|
+
<LiveToDoGate name={args.docname}>
|
|
169
|
+
{(name) => (
|
|
170
|
+
<FrappeLikedBy
|
|
171
|
+
doctype={args.doctype || "ToDo"}
|
|
172
|
+
name={name}
|
|
173
|
+
// Live mode resolves the session user via get_logged_user; the fixture
|
|
174
|
+
// fallback has no session, so pin one for interactivity.
|
|
175
|
+
currentUser={frappeStoriesLive ? undefined : "Administrator"}
|
|
176
|
+
onToggle={action("onToggle")}
|
|
177
|
+
/>
|
|
178
|
+
)}
|
|
179
|
+
</LiveToDoGate>
|
|
164
180
|
</FrappeStoryProvider>
|
|
165
181
|
);
|
|
166
182
|
Live.args = { doctype: "", docname: "" };
|
|
@@ -169,7 +185,7 @@ Live.parameters = {
|
|
|
169
185
|
docs: {
|
|
170
186
|
description: {
|
|
171
187
|
story:
|
|
172
|
-
"Live like toggle over the real bench
|
|
188
|
+
"Live like toggle over the real bench ToDo (not ERPNext Task — a frappe-only bench 500s ImportError on Task). Optimistic flip, `toggle_like` POST, revert on failure; out-of-band likes stream in via the doc subscription. Pass a real `docname` or let the story resolve/seed a readable ToDo. Fixture fallback (ToDo/TODO-LIVE-001) when the bench is down.",
|
|
173
189
|
},
|
|
174
190
|
},
|
|
175
191
|
};
|
package/src/FrappeLikedBy.tsx
CHANGED
|
@@ -127,6 +127,8 @@ function FrappeLikedByBody({
|
|
|
127
127
|
? {
|
|
128
128
|
baseURL: config.baseURL,
|
|
129
129
|
socketPort: config.socketPort,
|
|
130
|
+
siteName: config.siteName,
|
|
131
|
+
socketBaseURL: config.socketBaseURL,
|
|
130
132
|
auth: config.auth,
|
|
131
133
|
syncOptions: config.syncOptions,
|
|
132
134
|
fixtures: config.fixtures,
|
package/src/FrappeList.tsx
CHANGED
|
@@ -59,11 +59,21 @@ export function FrappeList<TDoc extends { name: string; doctype: string }>({
|
|
|
59
59
|
() => ({
|
|
60
60
|
baseURL: finalBaseURL,
|
|
61
61
|
socketPort: config?.socketPort,
|
|
62
|
+
siteName: config?.siteName,
|
|
63
|
+
socketBaseURL: config?.socketBaseURL,
|
|
62
64
|
auth: finalAuth,
|
|
63
65
|
syncOptions: finalSyncOptions,
|
|
64
66
|
fixtures: config?.fixtures,
|
|
65
67
|
}),
|
|
66
|
-
[
|
|
68
|
+
[
|
|
69
|
+
finalBaseURL,
|
|
70
|
+
config?.socketPort,
|
|
71
|
+
config?.siteName,
|
|
72
|
+
config?.socketBaseURL,
|
|
73
|
+
finalAuth,
|
|
74
|
+
finalSyncOptions,
|
|
75
|
+
config?.fixtures,
|
|
76
|
+
],
|
|
67
77
|
);
|
|
68
78
|
|
|
69
79
|
// Bridge VirtualPageManager pagination to generic onLoadMore/hasMore.
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// FrappeListView toolbar refresh — 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 toolbar slot) whose default hover fill painted the
|
|
5
|
+
// whole escaped 44px floor. The fix migrates it to the house forms Button
|
|
6
|
+
// with `circular` — the painted box ITSELF is the 44×44 control, so feedback
|
|
7
|
+
// stays inside its own reserved layout slot (box-is-control mechanism).
|
|
8
|
+
// Same atom-based assertions as FrappeDashboard.spec.tsx (jsdom can't apply
|
|
9
|
+
// :hover; the positive control proving the detectors work lives there).
|
|
10
|
+
//
|
|
11
|
+
// DocType meta is served by a scoped fetch mock (same shape the stories
|
|
12
|
+
// use); documents come from InMemoryFixtureProvider.
|
|
13
|
+
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
14
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
15
|
+
import { cleanup, fireEvent, waitFor } from "@testing-library/react";
|
|
16
|
+
import i18next from "i18next";
|
|
17
|
+
import { initReactI18next } from "react-i18next";
|
|
18
|
+
import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest";
|
|
19
|
+
import { FrappeListView } from "./FrappeListView";
|
|
20
|
+
import { FrappeProvider } from "./FrappeProvider";
|
|
21
|
+
|
|
22
|
+
const MOCK_HOST = "https://listview.spec.test";
|
|
23
|
+
|
|
24
|
+
const metaRaw = {
|
|
25
|
+
name: "QaTodo",
|
|
26
|
+
module: "QA",
|
|
27
|
+
title_field: "description",
|
|
28
|
+
fields: [
|
|
29
|
+
{
|
|
30
|
+
fieldname: "description",
|
|
31
|
+
fieldtype: "Data",
|
|
32
|
+
label: "Description",
|
|
33
|
+
in_list_view: 1,
|
|
34
|
+
reqd: 1,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
fieldname: "status",
|
|
38
|
+
fieldtype: "Select",
|
|
39
|
+
label: "Status",
|
|
40
|
+
options: "Open\nWorking\nCompleted",
|
|
41
|
+
in_list_view: 1,
|
|
42
|
+
in_standard_filter: 1,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const jsonResponse = (body: unknown, status = 200) =>
|
|
49
|
+
new Response(JSON.stringify(body), {
|
|
50
|
+
status,
|
|
51
|
+
headers: { "Content-Type": "application/json" },
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const realFetch = globalThis.fetch;
|
|
55
|
+
beforeAll(async () => {
|
|
56
|
+
await i18next.use(initReactI18next).init({
|
|
57
|
+
lng: "en",
|
|
58
|
+
interpolation: { escapeValue: false },
|
|
59
|
+
resources: { en: { translation: {} } },
|
|
60
|
+
});
|
|
61
|
+
globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
62
|
+
const urlStr =
|
|
63
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
64
|
+
if (urlStr.startsWith(MOCK_HOST)) {
|
|
65
|
+
const url = new URL(urlStr);
|
|
66
|
+
if (/^\/api\/resource\/DocType\/.+$/.test(url.pathname)) {
|
|
67
|
+
return jsonResponse({ data: metaRaw });
|
|
68
|
+
}
|
|
69
|
+
return jsonResponse({ data: [] });
|
|
70
|
+
}
|
|
71
|
+
return realFetch(input as RequestInfo, init);
|
|
72
|
+
}) as typeof fetch;
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
afterAll(() => {
|
|
76
|
+
globalThis.fetch = realFetch;
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
afterEach(cleanup);
|
|
80
|
+
|
|
81
|
+
const fixtures = new InMemoryFixtureProvider({
|
|
82
|
+
QaTodo: [
|
|
83
|
+
{
|
|
84
|
+
name: "QATODO-001",
|
|
85
|
+
doctype: "QaTodo",
|
|
86
|
+
description: "Review document",
|
|
87
|
+
status: "Open",
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// Grown-box escape mechanism: any negative margin atom on the press floor.
|
|
93
|
+
const negativeMarginAtom = /_m[trbl]--\d/;
|
|
94
|
+
// Painted state feedback: any non-transparent hover/press background atom.
|
|
95
|
+
const paintedStateAtom = /_bg-0(?:hover|active)-(?!transparent)/;
|
|
96
|
+
|
|
97
|
+
const renderListView = (props: Partial<Parameters<typeof FrappeListView>[0]> = {}) =>
|
|
98
|
+
renderWithProviders(
|
|
99
|
+
<FrappeProvider baseURL={MOCK_HOST} fixtures={fixtures}>
|
|
100
|
+
<FrappeListView doctype="QaTodo" {...props} />
|
|
101
|
+
</FrappeProvider>,
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const refreshIn = async (container: HTMLElement) => {
|
|
105
|
+
await waitFor(() => {
|
|
106
|
+
expect(container.querySelector('[aria-label="Refresh"]')).not.toBeNull();
|
|
107
|
+
});
|
|
108
|
+
return container.querySelector('[aria-label="Refresh"]') as HTMLElement;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
describe("FrappeListView refresh press floor (LC-54 amendment)", () => {
|
|
112
|
+
it("the refresh floor is its own box — no grown-target negative outset", async () => {
|
|
113
|
+
const { container } = renderListView();
|
|
114
|
+
const refresh = await refreshIn(container);
|
|
115
|
+
expect(refresh.getAttribute("role")).toBe("button");
|
|
116
|
+
// House circular Button: the 44px floor is REAL layout (box-is-control);
|
|
117
|
+
// the escape mechanism (negative margins pulling the grown box over the
|
|
118
|
+
// adjacent Add button) must be gone.
|
|
119
|
+
expect(refresh.className).not.toMatch(negativeMarginAtom);
|
|
120
|
+
expect(refresh.className).toMatch(/_mih-44px/);
|
|
121
|
+
expect(refresh.className).toMatch(/_miw-44px/);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("hover feedback rides the button's own in-slot box (house channel)", async () => {
|
|
125
|
+
const { container } = renderListView();
|
|
126
|
+
const refresh = await refreshIn(container);
|
|
127
|
+
// Paint on the OWN box is the sanctioned own-size mechanism — the
|
|
128
|
+
// amendment bans paint on a box that escapes its slot (arm above).
|
|
129
|
+
expect(refresh.className).toMatch(paintedStateAtom);
|
|
130
|
+
expect(refresh.querySelector("svg")).not.toBeNull();
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("the migrated Add button still activates (house div[role=button])", async () => {
|
|
134
|
+
const onAdd = vi.fn();
|
|
135
|
+
const { container } = renderListView({ onAdd });
|
|
136
|
+
await refreshIn(container);
|
|
137
|
+
const add = Array.from(container.querySelectorAll('[role="button"]')).find((node) =>
|
|
138
|
+
node.textContent?.includes("Add QaTodo"),
|
|
139
|
+
) as HTMLElement;
|
|
140
|
+
expect(add).not.toBeNull();
|
|
141
|
+
fireEvent.click(add);
|
|
142
|
+
expect(onAdd).toHaveBeenCalledTimes(1);
|
|
143
|
+
});
|
|
144
|
+
});
|
package/src/FrappeListView.tsx
CHANGED
|
@@ -3,35 +3,16 @@ import type { DataTableColumn } from "@multiplatform.one/table";
|
|
|
3
3
|
import { ArrowsClockwiseIcon, PlusIcon } from "@phosphor-icons/react";
|
|
4
4
|
import React, { useState, useMemo, useCallback, useEffect } from "react";
|
|
5
5
|
import { useTranslation } from "react-i18next";
|
|
6
|
-
import { SearchInput, Spinner } from "@multiplatform.one/forms";
|
|
7
|
-
import {
|
|
6
|
+
import { Button, SearchInput, Spinner } from "@multiplatform.one/forms";
|
|
7
|
+
import { Text, View, XStack, YStack, isWeb, useTheme, type YStackProps } from "tamagui";
|
|
8
8
|
import { SavedFilterDropdown, useSavedFilters, type ParsedFilter } from "@multiplatform.one/table";
|
|
9
9
|
import { Avatar, ViewSwitcher } from "@multiplatform.one/components";
|
|
10
|
-
import {
|
|
11
|
-
MIN_PRESS_TARGET,
|
|
12
|
-
pressTargetHitSlop,
|
|
13
|
-
pressTargetStyle,
|
|
14
|
-
useResolvedKnobs,
|
|
15
|
-
} from "@multiplatform.one/theme";
|
|
10
|
+
import { pressTargetStyle, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
16
11
|
import { storage } from "@multiplatform.one/store";
|
|
17
12
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
18
13
|
import { FrappeList } from "./FrappeList";
|
|
19
14
|
import { FrappeTable } from "./FrappeTable";
|
|
20
15
|
|
|
21
|
-
// DG-LAY-04 / D-02 press-floor: the chromeless $2 refresh button paints
|
|
22
|
-
// ~28×28; the press box is floored at 44 via the house pressTarget* channel
|
|
23
|
-
// (grown transparent box + negative outset + hitSlop). The horizontal outset
|
|
24
|
-
// (8px) stays under the toolbar gap, so the enlarged target never reaches the
|
|
25
|
-
// adjacent Add button's box.
|
|
26
|
-
const REFRESH_VISUAL = 28;
|
|
27
|
-
const REFRESH_OUTSET = Math.ceil((MIN_PRESS_TARGET - REFRESH_VISUAL) / 2);
|
|
28
|
-
const refreshPressFloorProps = {
|
|
29
|
-
...pressTargetStyle(),
|
|
30
|
-
marginVertical: -REFRESH_OUTSET,
|
|
31
|
-
marginHorizontal: -REFRESH_OUTSET,
|
|
32
|
-
hitSlop: pressTargetHitSlop(REFRESH_VISUAL),
|
|
33
|
-
} as const;
|
|
34
|
-
|
|
35
16
|
interface ListFieldConfig {
|
|
36
17
|
key: string;
|
|
37
18
|
label?: string;
|
|
@@ -164,6 +145,8 @@ export function FrappeListView<TDoc extends { name: string; doctype: string }>({
|
|
|
164
145
|
const connectionConfig = {
|
|
165
146
|
baseURL: finalBaseURL,
|
|
166
147
|
socketPort: config?.socketPort,
|
|
148
|
+
siteName: config?.siteName,
|
|
149
|
+
socketBaseURL: config?.socketBaseURL,
|
|
167
150
|
auth: finalAuth,
|
|
168
151
|
syncOptions: finalSyncOptions,
|
|
169
152
|
fixtures: config?.fixtures,
|
|
@@ -482,13 +465,18 @@ export function FrappeListView<TDoc extends { name: string; doctype: string }>({
|
|
|
482
465
|
</XStack>
|
|
483
466
|
|
|
484
467
|
<XStack alignItems="center" {...knobProps.gap}>
|
|
468
|
+
{/* LC-54 (amendment 2026-08-13): house Button, own-box floor — the
|
|
469
|
+
raw tamagui Button + grown transparent target painted its hover
|
|
470
|
+
fill across the escaped 44px floor. `circular` makes the painted
|
|
471
|
+
box ITSELF the 44×44 control (box-is-control mechanism), so
|
|
472
|
+
feedback stays inside its own layout slot. */}
|
|
485
473
|
<Button
|
|
486
474
|
size="$2"
|
|
475
|
+
circular
|
|
487
476
|
chromeless
|
|
488
477
|
icon={ArrowsClockwiseIcon}
|
|
489
478
|
onPress={handleRefresh}
|
|
490
479
|
aria-label={t("Refresh")}
|
|
491
|
-
{...refreshPressFloorProps}
|
|
492
480
|
/>
|
|
493
481
|
{onAdd && (
|
|
494
482
|
<Button
|
package/src/FrappeProvider.tsx
CHANGED
|
@@ -20,6 +20,19 @@ export interface FrappeConfig {
|
|
|
20
20
|
* production reverse proxy that routes `/socket.io` to the SocketIO backend.
|
|
21
21
|
*/
|
|
22
22
|
socketPort?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Dial the realtime socket at this origin instead of deriving it from
|
|
25
|
+
* `baseURL` + `socketPort` — for dev servers that proxy `/socket.io` on
|
|
26
|
+
* their own origin, making the handshake same-origin (e.g. the page origin
|
|
27
|
+
* in web dev). Wins over `socketPort`. Omit in production.
|
|
28
|
+
*/
|
|
29
|
+
socketBaseURL?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Frappe site name — the Socket.IO namespace realtime must join. Set it
|
|
32
|
+
* whenever the `baseURL` hostname is not the bench site name (e.g. baseURL
|
|
33
|
+
* http://127.0.0.1:8000 serving site "localhost").
|
|
34
|
+
*/
|
|
35
|
+
siteName?: string;
|
|
23
36
|
/** Authentication configuration */
|
|
24
37
|
auth?: {
|
|
25
38
|
/** Whether to use token-based authentication */
|
|
@@ -55,6 +68,10 @@ export interface FrappeProviderProps {
|
|
|
55
68
|
baseURL: string;
|
|
56
69
|
/** Override port for Socket.IO realtime connection (e.g. 9000 in dev). */
|
|
57
70
|
socketPort?: number;
|
|
71
|
+
/** Dial the realtime socket at this origin (same-origin dev proxy). */
|
|
72
|
+
socketBaseURL?: string;
|
|
73
|
+
/** Frappe site name — the Socket.IO namespace realtime must join. */
|
|
74
|
+
siteName?: string;
|
|
58
75
|
/** Authentication configuration */
|
|
59
76
|
auth?: {
|
|
60
77
|
/** Whether to use token-based authentication */
|
|
@@ -99,14 +116,25 @@ export function FrappeProvider({
|
|
|
99
116
|
children,
|
|
100
117
|
baseURL,
|
|
101
118
|
socketPort,
|
|
119
|
+
socketBaseURL,
|
|
120
|
+
siteName,
|
|
102
121
|
auth,
|
|
103
122
|
syncOptions,
|
|
104
123
|
socketOptions,
|
|
105
124
|
fixtures,
|
|
106
125
|
}: FrappeProviderProps) {
|
|
107
126
|
const value = React.useMemo(
|
|
108
|
-
() => ({
|
|
109
|
-
|
|
127
|
+
() => ({
|
|
128
|
+
baseURL,
|
|
129
|
+
socketPort,
|
|
130
|
+
socketBaseURL,
|
|
131
|
+
siteName,
|
|
132
|
+
auth,
|
|
133
|
+
syncOptions,
|
|
134
|
+
socketOptions,
|
|
135
|
+
fixtures,
|
|
136
|
+
}),
|
|
137
|
+
[baseURL, socketPort, socketBaseURL, siteName, auth, syncOptions, socketOptions, fixtures],
|
|
110
138
|
);
|
|
111
139
|
|
|
112
140
|
return <FrappeContext.Provider value={value}>{children}</FrappeContext.Provider>;
|
|
@@ -130,6 +130,8 @@ export function FrappeReportBuilder({
|
|
|
130
130
|
const connectionConfig = {
|
|
131
131
|
baseURL: finalBaseURL,
|
|
132
132
|
socketPort: config?.socketPort,
|
|
133
|
+
siteName: config?.siteName,
|
|
134
|
+
socketBaseURL: config?.socketBaseURL,
|
|
133
135
|
auth: finalAuth,
|
|
134
136
|
syncOptions: finalSyncOptions,
|
|
135
137
|
fixtures: config?.fixtures,
|