@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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FrappeTable retry-storm regression — a persistently-failing fetch must
|
|
3
|
+
* not loop (fetch → error → evict → refetch at microtask speed; the storm
|
|
4
|
+
* that froze storybook renderers and OOM'd vitest workers).
|
|
5
|
+
*
|
|
6
|
+
* The protection lives at the shared altitude: the collection cache in
|
|
7
|
+
* `@multiplatform.one/frappe` (frappeReact.ts) HOLDS an errored entry while
|
|
8
|
+
* any consumer retains it, so the error-state re-render re-acquires the
|
|
9
|
+
* same entry instead of starting a fresh failing sync; the entry is evicted
|
|
10
|
+
* on LAST release, making retry-by-remount exactly one fresh attempt.
|
|
11
|
+
* FrappeTable/Kanban/Calendar/TreeView/Gantt all consume that one hook —
|
|
12
|
+
* there is no per-view latch (the old attachments.tsx latch is gone).
|
|
13
|
+
*
|
|
14
|
+
* Cache-level pins live in public/frappe/src/frappeReact.spec.ts
|
|
15
|
+
* ("REGRESSION: an error-state consumer does not loop failing fetches").
|
|
16
|
+
* This spec pins the same contract end-to-end through a real view that was
|
|
17
|
+
* once flagged unprotected: FrappeTable with a down bench.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { FixtureProvider } from "@multiplatform.one/frappe";
|
|
21
|
+
import type { DataTableColumn } from "@multiplatform.one/table";
|
|
22
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
23
|
+
import { act, cleanup, screen } from "@testing-library/react";
|
|
24
|
+
import i18next from "i18next";
|
|
25
|
+
import { initReactI18next } from "react-i18next";
|
|
26
|
+
import { afterEach, beforeAll, describe, expect, it } from "vitest";
|
|
27
|
+
import { FrappeProvider } from "./FrappeProvider";
|
|
28
|
+
import { FrappeTable } from "./FrappeTable";
|
|
29
|
+
|
|
30
|
+
beforeAll(async () => {
|
|
31
|
+
await i18next.use(initReactI18next).init({
|
|
32
|
+
lng: "en",
|
|
33
|
+
interpolation: { escapeValue: false },
|
|
34
|
+
resources: { en: { translation: {} } },
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
cleanup();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
interface Customer {
|
|
43
|
+
name: string;
|
|
44
|
+
doctype: string;
|
|
45
|
+
customer_name: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const columns: DataTableColumn<Partial<Customer>>[] = [
|
|
49
|
+
{ id: "name", accessorKey: "name", header: "ID" },
|
|
50
|
+
{ id: "customer_name", accessorKey: "customer_name", header: "Customer Name" },
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
// Explicit filterableFields skip the doctype-meta fetch (hermetic — the
|
|
54
|
+
// only network the table needs is the list subscription itself).
|
|
55
|
+
const filterFields = [{ id: "customer_name", label: "Customer Name", type: "text" as const }];
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* A bench that is down: every list fetch rejects. Counts attempts so the
|
|
59
|
+
* spec can assert the bound. The cap is a safety valve — a regressed
|
|
60
|
+
* (evict-on-error) cache refetches at microtask speed and would hang the
|
|
61
|
+
* worker before any assertion runs; "recovering" after the cap lets the
|
|
62
|
+
* test fail on the count instead.
|
|
63
|
+
*/
|
|
64
|
+
class DownBenchFixtureProvider implements FixtureProvider {
|
|
65
|
+
getListCalls = 0;
|
|
66
|
+
|
|
67
|
+
async getList(): Promise<never[]> {
|
|
68
|
+
this.getListCalls++;
|
|
69
|
+
if (this.getListCalls > 25) return [];
|
|
70
|
+
throw new Error("bench down");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async getDoc(): Promise<null> {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
createDoc(): Promise<never> {
|
|
78
|
+
return Promise.reject(new Error("unsupported"));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
updateDoc(): Promise<never> {
|
|
82
|
+
return Promise.reject(new Error("unsupported"));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
deleteDoc(): Promise<never> {
|
|
86
|
+
return Promise.reject(new Error("unsupported"));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function renderTable(fixtures: FixtureProvider) {
|
|
91
|
+
return renderWithProviders(
|
|
92
|
+
<FrappeProvider baseURL="https://frappetable-retrystorm.spec.test" fixtures={fixtures}>
|
|
93
|
+
<FrappeTable<Customer>
|
|
94
|
+
doctype="Customer"
|
|
95
|
+
columns={columns}
|
|
96
|
+
filterableFields={filterFields}
|
|
97
|
+
layout="table"
|
|
98
|
+
enablePagination={false}
|
|
99
|
+
error={(err) => <div data-testid="table-error">{err.message}</div>}
|
|
100
|
+
/>
|
|
101
|
+
</FrappeProvider>,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
describe("FrappeTable retry-storm regression (persistently-failing fetch)", () => {
|
|
106
|
+
it("surfaces the failure from exactly one bounded fetch attempt — no refetch loop", async () => {
|
|
107
|
+
const fixtures = new DownBenchFixtureProvider();
|
|
108
|
+
renderTable(fixtures);
|
|
109
|
+
|
|
110
|
+
// Honest error surface (not an empty table), carrying the sync detail.
|
|
111
|
+
const errorNode = await screen.findByTestId("table-error");
|
|
112
|
+
expect(errorNode.textContent).toMatch(/bench down/);
|
|
113
|
+
|
|
114
|
+
// The error-state re-render re-acquired the HELD errored entry — the
|
|
115
|
+
// failure came from ONE sync attempt, not a loop.
|
|
116
|
+
expect(fixtures.getListCalls).toBe(1);
|
|
117
|
+
|
|
118
|
+
// Give a storm every chance: run well past the sync layer's debounce
|
|
119
|
+
// and GC grace windows, then re-check the bound.
|
|
120
|
+
await act(() => new Promise((resolve) => setTimeout(resolve, 300)));
|
|
121
|
+
expect(fixtures.getListCalls).toBe(1);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("retry-by-remount starts exactly ONE fresh attempt (bounded, explicit retries)", async () => {
|
|
125
|
+
const fixtures = new DownBenchFixtureProvider();
|
|
126
|
+
const first = renderTable(fixtures);
|
|
127
|
+
await screen.findByTestId("table-error");
|
|
128
|
+
expect(fixtures.getListCalls).toBe(1);
|
|
129
|
+
|
|
130
|
+
// Last consumer releases the errored entry → evicted immediately; the
|
|
131
|
+
// remount (the Retry contract) is the one place a fresh sync starts.
|
|
132
|
+
first.unmount();
|
|
133
|
+
renderTable(fixtures);
|
|
134
|
+
await screen.findByTestId("table-error");
|
|
135
|
+
expect(fixtures.getListCalls).toBe(2);
|
|
136
|
+
|
|
137
|
+
await act(() => new Promise((resolve) => setTimeout(resolve, 300)));
|
|
138
|
+
expect(fixtures.getListCalls).toBe(2);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FrappeTable row activation — the replacement contract for the deleted
|
|
3
|
+
* per-cell pressable layer (onRowClick → DataTable onRowPress).
|
|
4
|
+
*
|
|
5
|
+
* The public prop stays `onRowClick` (backoffice DoctypeListScreen and
|
|
6
|
+
* other consumers keep their API); inside, the ROW is one pressable unit:
|
|
7
|
+
* a single roving tab stop per row set (LC-49), Enter AND Space activate
|
|
8
|
+
* the focused row (LC-50), inner interactive controls (selection
|
|
9
|
+
* checkboxes) win over the row press, and rows are named by document
|
|
10
|
+
* identity — the doctype title-field value when meta is loaded, else the
|
|
11
|
+
* document name (DG-A11Y-06).
|
|
12
|
+
*
|
|
13
|
+
* Fixture-hermetic: documents ride InMemoryFixtureProvider; the one test
|
|
14
|
+
* that needs doctype meta mocks the `getdoctype` fetch.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
18
|
+
import type { DataTableColumn } from "@multiplatform.one/table";
|
|
19
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
20
|
+
import { cleanup, fireEvent, screen, waitFor } from "@testing-library/react";
|
|
21
|
+
import i18next from "i18next";
|
|
22
|
+
import { initReactI18next } from "react-i18next";
|
|
23
|
+
import { afterEach, beforeAll, describe, expect, it, vi } from "vitest";
|
|
24
|
+
import { FrappeProvider } from "./FrappeProvider";
|
|
25
|
+
import { FrappeTable } from "./FrappeTable";
|
|
26
|
+
|
|
27
|
+
beforeAll(async () => {
|
|
28
|
+
await i18next.use(initReactI18next).init({
|
|
29
|
+
lng: "en",
|
|
30
|
+
interpolation: { escapeValue: false },
|
|
31
|
+
resources: { en: { translation: {} } },
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
cleanup();
|
|
37
|
+
vi.restoreAllMocks();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
interface Customer {
|
|
41
|
+
name: string;
|
|
42
|
+
doctype: string;
|
|
43
|
+
customer_name: string;
|
|
44
|
+
status: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const customers: Customer[] = [
|
|
48
|
+
{ name: "CUST-001", doctype: "Customer", customer_name: "Acme Corp", status: "Active" },
|
|
49
|
+
{ name: "CUST-002", doctype: "Customer", customer_name: "Globex", status: "Active" },
|
|
50
|
+
{ name: "CUST-003", doctype: "Customer", customer_name: "Initech", status: "Lead" },
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const columns: DataTableColumn<Partial<Customer>>[] = [
|
|
54
|
+
{ id: "name", accessorKey: "name", header: "ID" },
|
|
55
|
+
{ id: "customer_name", accessorKey: "customer_name", header: "Customer Name" },
|
|
56
|
+
{ id: "status", accessorKey: "status", header: "Status" },
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
// Explicit filterableFields skip the doctype-meta fetch (hermetic — same
|
|
60
|
+
// contract DoctypeListScreen uses); the title-field test omits them and
|
|
61
|
+
// mocks the meta endpoint instead.
|
|
62
|
+
const filterFields = [{ id: "status", label: "Status", type: "text" as const }];
|
|
63
|
+
|
|
64
|
+
function pressRows(container: HTMLElement): HTMLElement[] {
|
|
65
|
+
return Array.from(container.querySelectorAll('[data-row-press="true"]')) as HTMLElement[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function renderTable(extraProps: Record<string, unknown> = {}) {
|
|
69
|
+
const onRowClick = vi.fn();
|
|
70
|
+
const result = renderWithProviders(
|
|
71
|
+
<FrappeProvider
|
|
72
|
+
baseURL="https://frappetable.spec.test"
|
|
73
|
+
fixtures={new InMemoryFixtureProvider({ Customer: customers })}
|
|
74
|
+
>
|
|
75
|
+
<FrappeTable<Customer>
|
|
76
|
+
doctype="Customer"
|
|
77
|
+
columns={columns}
|
|
78
|
+
filterableFields={filterFields}
|
|
79
|
+
layout="table"
|
|
80
|
+
enablePagination={false}
|
|
81
|
+
onRowClick={onRowClick}
|
|
82
|
+
{...extraProps}
|
|
83
|
+
/>
|
|
84
|
+
</FrappeProvider>,
|
|
85
|
+
);
|
|
86
|
+
return { ...result, onRowClick };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
describe("FrappeTable onRowClick → DataTable onRowPress", () => {
|
|
90
|
+
it("activates on mouse click anywhere in the row and on Enter AND Space", async () => {
|
|
91
|
+
const { container, onRowClick } = renderTable();
|
|
92
|
+
await screen.findByText("Acme Corp");
|
|
93
|
+
const rows = pressRows(container);
|
|
94
|
+
expect(rows).toHaveLength(3);
|
|
95
|
+
|
|
96
|
+
fireEvent.click(screen.getByText("Globex"));
|
|
97
|
+
expect(onRowClick).toHaveBeenCalledTimes(1);
|
|
98
|
+
expect(onRowClick).toHaveBeenCalledWith(expect.objectContaining({ name: "CUST-002" }));
|
|
99
|
+
|
|
100
|
+
rows[0].focus();
|
|
101
|
+
fireEvent.keyDown(rows[0], { key: "Enter" });
|
|
102
|
+
expect(onRowClick).toHaveBeenCalledTimes(2);
|
|
103
|
+
expect(onRowClick).toHaveBeenLastCalledWith(expect.objectContaining({ name: "CUST-001" }));
|
|
104
|
+
fireEvent.keyDown(rows[0], { key: " " });
|
|
105
|
+
expect(onRowClick).toHaveBeenCalledTimes(3);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("exposes ONE roving tab stop, names rows by doc name, and keeps cells pressable-free", async () => {
|
|
109
|
+
const { container } = renderTable();
|
|
110
|
+
await screen.findByText("Acme Corp");
|
|
111
|
+
const rows = pressRows(container);
|
|
112
|
+
|
|
113
|
+
// LC-49: exactly one tab stop across the row set; arrows rove it.
|
|
114
|
+
expect(rows.map((row) => row.getAttribute("tabindex"))).toEqual(["0", "-1", "-1"]);
|
|
115
|
+
rows[0].focus();
|
|
116
|
+
fireEvent.keyDown(rows[0], { key: "ArrowDown" });
|
|
117
|
+
expect(document.activeElement).toBe(rows[1]);
|
|
118
|
+
|
|
119
|
+
// DG-A11Y-06: rows named by document identity (name — no meta here).
|
|
120
|
+
expect(rows.map((row) => row.getAttribute("aria-label"))).toEqual([
|
|
121
|
+
"CUST-001",
|
|
122
|
+
"CUST-002",
|
|
123
|
+
"CUST-003",
|
|
124
|
+
]);
|
|
125
|
+
|
|
126
|
+
// The per-cell pressable layer is GONE: no cell-level buttons or
|
|
127
|
+
// extra tab stops inside pressable rows (plain text columns).
|
|
128
|
+
for (const row of rows) {
|
|
129
|
+
expect(row.querySelectorAll('[role="button"]')).toHaveLength(0);
|
|
130
|
+
expect(row.querySelectorAll('[tabindex="0"]')).toHaveLength(0);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("keeps selection checkboxes working without firing the row press", async () => {
|
|
135
|
+
const { onRowClick } = renderTable({ enableRowSelection: true });
|
|
136
|
+
await screen.findByText("Acme Corp");
|
|
137
|
+
|
|
138
|
+
// Selection names ride the same identity channel ("Select row {name}").
|
|
139
|
+
const checkbox = await screen.findByRole("checkbox", { name: "Select row CUST-001" });
|
|
140
|
+
fireEvent.click(checkbox);
|
|
141
|
+
expect(checkbox.getAttribute("aria-checked")).toBe("true");
|
|
142
|
+
expect(onRowClick).not.toHaveBeenCalled();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("labels rows by the doctype title-field value once meta loads", async () => {
|
|
146
|
+
// Distinct host: useDocTypeMeta caches per `${baseURL}:${doctype}`.
|
|
147
|
+
const metaHost = "https://frappetable-meta.spec.test";
|
|
148
|
+
const realFetch = globalThis.fetch;
|
|
149
|
+
vi.spyOn(globalThis, "fetch").mockImplementation(async (input: any, init?: any) => {
|
|
150
|
+
const url =
|
|
151
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
152
|
+
if (url.startsWith(metaHost)) {
|
|
153
|
+
if (url.includes("/api/method/frappe.desk.form.load.getdoctype")) {
|
|
154
|
+
return new Response(
|
|
155
|
+
JSON.stringify({
|
|
156
|
+
docs: [
|
|
157
|
+
{
|
|
158
|
+
name: "Customer",
|
|
159
|
+
module: "Selling",
|
|
160
|
+
title_field: "customer_name",
|
|
161
|
+
fields: [
|
|
162
|
+
{
|
|
163
|
+
fieldname: "customer_name",
|
|
164
|
+
fieldtype: "Data",
|
|
165
|
+
label: "Customer Name",
|
|
166
|
+
in_list_view: 1,
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
permissions: [],
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
}),
|
|
173
|
+
{ status: 200, headers: { "Content-Type": "application/json" } },
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
return new Response(JSON.stringify({ data: [] }), {
|
|
177
|
+
status: 200,
|
|
178
|
+
headers: { "Content-Type": "application/json" },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return realFetch(input, init);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const onRowClick = vi.fn();
|
|
185
|
+
const { container } = renderWithProviders(
|
|
186
|
+
<FrappeProvider
|
|
187
|
+
baseURL={metaHost}
|
|
188
|
+
fixtures={new InMemoryFixtureProvider({ Customer: customers })}
|
|
189
|
+
>
|
|
190
|
+
<FrappeTable<Customer>
|
|
191
|
+
doctype="Customer"
|
|
192
|
+
columns={columns}
|
|
193
|
+
layout="table"
|
|
194
|
+
enablePagination={false}
|
|
195
|
+
onRowClick={onRowClick}
|
|
196
|
+
/>
|
|
197
|
+
</FrappeProvider>,
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
await screen.findByText("Acme Corp");
|
|
201
|
+
await waitFor(() => {
|
|
202
|
+
expect(pressRows(container).map((row) => row.getAttribute("aria-label"))).toEqual([
|
|
203
|
+
"Acme Corp",
|
|
204
|
+
"Globex",
|
|
205
|
+
"Initech",
|
|
206
|
+
]);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe("FrappeTable layout forwarding", () => {
|
|
212
|
+
it("passes layout=list through to DataTable document rows", async () => {
|
|
213
|
+
const { container } = renderTable({ layout: "list" });
|
|
214
|
+
await screen.findByText("Acme Corp");
|
|
215
|
+
expect(container.querySelector('[data-testid="data-table-list"]')).not.toBeNull();
|
|
216
|
+
expect(container.querySelectorAll('[data-testid="data-table-list-row"]').length).toBe(
|
|
217
|
+
customers.length,
|
|
218
|
+
);
|
|
219
|
+
expect(container.querySelector(".is_Table")).toBeNull();
|
|
220
|
+
expect(container.querySelector('[aria-label="Table headers"]')).toBeNull();
|
|
221
|
+
});
|
|
222
|
+
});
|