@multiplatform.one/frappe-ui 7.66.0 → 7.68.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/FileBrowser/index.cjs +15 -25
- package/dist/cjs/FileBrowser/index.native.js +15 -25
- package/dist/cjs/FileBrowser/index.native.js.map +1 -1
- package/dist/cjs/FormSidebar.cjs +107 -194
- package/dist/cjs/FormSidebar.native.js +120 -216
- package/dist/cjs/FormSidebar.native.js.map +1 -1
- package/dist/cjs/FrappeAssignment.cjs +0 -3
- package/dist/cjs/FrappeAssignment.native.js +0 -3
- package/dist/cjs/FrappeAssignment.native.js.map +1 -1
- package/dist/cjs/FrappeConnectionIndicator.cjs +5 -24
- package/dist/cjs/FrappeConnectionIndicator.native.js +5 -24
- package/dist/cjs/FrappeConnectionIndicator.native.js.map +1 -1
- package/dist/cjs/FrappeDashboard.cjs +0 -2
- package/dist/cjs/FrappeDashboard.native.js +0 -2
- package/dist/cjs/FrappeDashboard.native.js.map +1 -1
- package/dist/cjs/FrappeForm.cjs +6 -5
- package/dist/cjs/FrappeForm.native.js +6 -5
- package/dist/cjs/FrappeForm.native.js.map +1 -1
- package/dist/cjs/FrappeFormActions.cjs +20 -30
- package/dist/cjs/FrappeFormActions.native.js +23 -31
- package/dist/cjs/FrappeFormActions.native.js.map +1 -1
- package/dist/cjs/FrappeImageView.cjs +46 -65
- package/dist/cjs/FrappeImageView.native.js +46 -68
- package/dist/cjs/FrappeImageView.native.js.map +1 -1
- package/dist/cjs/FrappeKanban.cjs +0 -1
- package/dist/cjs/FrappeKanban.native.js +0 -1
- package/dist/cjs/FrappeKanban.native.js.map +1 -1
- package/dist/cjs/FrappeLikedBy.cjs +1 -1
- package/dist/cjs/FrappeLikedBy.native.js +1 -1
- package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
- package/dist/cjs/FrappeListView.cjs +24 -68
- package/dist/cjs/FrappeListView.native.js +25 -72
- package/dist/cjs/FrappeListView.native.js.map +1 -1
- package/dist/cjs/FrappeRecordView.cjs +4 -0
- package/dist/cjs/FrappeRecordView.native.js +4 -0
- package/dist/cjs/FrappeRecordView.native.js.map +1 -1
- package/dist/cjs/FrappeReportBuilder.cjs +21 -18
- package/dist/cjs/FrappeReportBuilder.native.js +21 -18
- package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
- package/dist/cjs/FrappeReportView.cjs +2 -4
- package/dist/cjs/FrappeReportView.native.js +2 -4
- package/dist/cjs/FrappeReportView.native.js.map +1 -1
- package/dist/cjs/SyncErrorNotice.cjs +8 -36
- package/dist/cjs/SyncErrorNotice.native.js +8 -36
- package/dist/cjs/SyncErrorNotice.native.js.map +1 -1
- package/dist/cjs/desk/DeskFormSidebar.cjs +1 -6
- package/dist/cjs/desk/DeskFormSidebar.native.js +1 -6
- package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/cjs/desk/DeskShell.cjs +0 -1
- package/dist/cjs/desk/DeskShell.native.js +0 -1
- package/dist/cjs/desk/DeskShell.native.js.map +1 -1
- package/dist/cjs/fields/Date/catalog.native.js +0 -1
- package/dist/cjs/fields/Date/catalog.native.js.map +1 -1
- package/dist/cjs/fields/Date/index.native.js +4 -363
- package/dist/cjs/fields/Date/index.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload.cjs +50 -58
- package/dist/cjs/fields/FileUpload.native.js +50 -56
- package/dist/cjs/fields/FileUpload.native.js.map +1 -1
- package/dist/cjs/insights/InsightsFacetTags.cjs +16 -92
- package/dist/cjs/insights/InsightsFacetTags.native.js +15 -97
- package/dist/cjs/insights/InsightsFacetTags.native.js.map +1 -1
- package/dist/cjs/list/FacetBadge.cjs +4 -28
- package/dist/cjs/list/FacetBadge.native.js +4 -28
- package/dist/cjs/list/FacetBadge.native.js.map +1 -1
- package/dist/cjs/list/FacetRail.cjs +37 -128
- package/dist/cjs/list/FacetRail.native.js +32 -130
- package/dist/cjs/list/FacetRail.native.js.map +1 -1
- package/dist/cjs/list/ListControls.cjs +1 -3
- package/dist/cjs/list/ListControls.native.js +1 -3
- package/dist/cjs/list/ListControls.native.js.map +1 -1
- package/dist/cjs/list/ListControlsSheet.cjs +5 -15
- package/dist/cjs/list/ListControlsSheet.native.js +7 -17
- package/dist/cjs/list/ListControlsSheet.native.js.map +1 -1
- package/dist/cjs/list/ListSidebarToolbar.cjs +5 -20
- package/dist/cjs/list/ListSidebarToolbar.native.js +7 -22
- package/dist/cjs/list/ListSidebarToolbar.native.js.map +1 -1
- package/dist/cjs/list/RecordCard.cjs +95 -127
- package/dist/cjs/list/RecordCard.native.js +78 -96
- package/dist/cjs/list/RecordCard.native.js.map +1 -1
- package/dist/cjs/list/ShufflePanel.cjs +55 -36
- package/dist/cjs/list/ShufflePanel.native.js +62 -39
- package/dist/cjs/list/ShufflePanel.native.js.map +1 -1
- package/dist/cjs/list/listColumns.cjs +1 -1
- package/dist/cjs/list/listColumns.native.js +1 -1
- package/dist/cjs/list/listColumns.native.js.map +1 -1
- package/dist/cjs/record/RecordHero.cjs +7 -85
- package/dist/cjs/record/RecordHero.native.js +7 -85
- package/dist/cjs/record/RecordHero.native.js.map +1 -1
- package/dist/cjs/record/RecordPage.cjs +5 -10
- package/dist/cjs/record/RecordPage.native.js +5 -10
- package/dist/cjs/record/RecordPage.native.js.map +1 -1
- package/dist/cjs/report/ReportViewToolbar.cjs +76 -47
- package/dist/cjs/report/ReportViewToolbar.native.js +79 -48
- package/dist/cjs/report/ReportViewToolbar.native.js.map +1 -1
- package/dist/esm/FileBrowser/index.mjs +16 -26
- package/dist/esm/FileBrowser/index.mjs.map +1 -1
- package/dist/esm/FileBrowser/index.native.js +16 -26
- package/dist/esm/FileBrowser/index.native.js.map +1 -1
- package/dist/esm/FormSidebar.mjs +110 -197
- package/dist/esm/FormSidebar.mjs.map +1 -1
- package/dist/esm/FormSidebar.native.js +123 -219
- package/dist/esm/FormSidebar.native.js.map +1 -1
- package/dist/esm/FrappeAssignment.mjs +0 -3
- package/dist/esm/FrappeAssignment.mjs.map +1 -1
- package/dist/esm/FrappeAssignment.native.js +0 -3
- package/dist/esm/FrappeAssignment.native.js.map +1 -1
- package/dist/esm/FrappeConnectionIndicator.mjs +7 -26
- package/dist/esm/FrappeConnectionIndicator.mjs.map +1 -1
- package/dist/esm/FrappeConnectionIndicator.native.js +7 -26
- package/dist/esm/FrappeConnectionIndicator.native.js.map +1 -1
- package/dist/esm/FrappeDashboard.mjs +0 -2
- package/dist/esm/FrappeDashboard.mjs.map +1 -1
- package/dist/esm/FrappeDashboard.native.js +0 -2
- package/dist/esm/FrappeDashboard.native.js.map +1 -1
- package/dist/esm/FrappeForm.mjs +7 -6
- package/dist/esm/FrappeForm.mjs.map +1 -1
- package/dist/esm/FrappeForm.native.js +7 -6
- package/dist/esm/FrappeForm.native.js.map +1 -1
- package/dist/esm/FrappeFormActions.mjs +22 -32
- package/dist/esm/FrappeFormActions.mjs.map +1 -1
- package/dist/esm/FrappeFormActions.native.js +25 -33
- package/dist/esm/FrappeFormActions.native.js.map +1 -1
- package/dist/esm/FrappeImageView.mjs +48 -67
- package/dist/esm/FrappeImageView.mjs.map +1 -1
- package/dist/esm/FrappeImageView.native.js +48 -70
- package/dist/esm/FrappeImageView.native.js.map +1 -1
- package/dist/esm/FrappeKanban.mjs +0 -1
- package/dist/esm/FrappeKanban.mjs.map +1 -1
- package/dist/esm/FrappeKanban.native.js +0 -1
- package/dist/esm/FrappeKanban.native.js.map +1 -1
- package/dist/esm/FrappeLikedBy.mjs +1 -1
- package/dist/esm/FrappeLikedBy.mjs.map +1 -1
- package/dist/esm/FrappeLikedBy.native.js +1 -1
- package/dist/esm/FrappeLikedBy.native.js.map +1 -1
- package/dist/esm/FrappeListView.mjs +25 -69
- package/dist/esm/FrappeListView.mjs.map +1 -1
- package/dist/esm/FrappeListView.native.js +26 -73
- package/dist/esm/FrappeListView.native.js.map +1 -1
- package/dist/esm/FrappeRecordView.mjs +4 -0
- package/dist/esm/FrappeRecordView.mjs.map +1 -1
- package/dist/esm/FrappeRecordView.native.js +4 -0
- package/dist/esm/FrappeRecordView.native.js.map +1 -1
- package/dist/esm/FrappeReportBuilder.mjs +21 -18
- package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
- package/dist/esm/FrappeReportBuilder.native.js +21 -18
- package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
- package/dist/esm/FrappeReportView.mjs +3 -5
- package/dist/esm/FrappeReportView.mjs.map +1 -1
- package/dist/esm/FrappeReportView.native.js +3 -5
- package/dist/esm/FrappeReportView.native.js.map +1 -1
- package/dist/esm/SyncErrorNotice.mjs +10 -38
- package/dist/esm/SyncErrorNotice.mjs.map +1 -1
- package/dist/esm/SyncErrorNotice.native.js +10 -38
- package/dist/esm/SyncErrorNotice.native.js.map +1 -1
- package/dist/esm/desk/DeskFormSidebar.mjs +1 -6
- package/dist/esm/desk/DeskFormSidebar.mjs.map +1 -1
- package/dist/esm/desk/DeskFormSidebar.native.js +1 -6
- package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/esm/desk/DeskShell.mjs +0 -1
- package/dist/esm/desk/DeskShell.mjs.map +1 -1
- package/dist/esm/desk/DeskShell.native.js +0 -1
- package/dist/esm/desk/DeskShell.native.js.map +1 -1
- package/dist/esm/fields/Date/catalog.mjs.map +1 -1
- package/dist/esm/fields/Date/catalog.native.js +0 -1
- package/dist/esm/fields/Date/catalog.native.js.map +1 -1
- package/dist/esm/fields/Date/index.native.js +2 -361
- package/dist/esm/fields/Date/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload.mjs +53 -61
- package/dist/esm/fields/FileUpload.mjs.map +1 -1
- package/dist/esm/fields/FileUpload.native.js +53 -59
- package/dist/esm/fields/FileUpload.native.js.map +1 -1
- package/dist/esm/insights/InsightsFacetTags.mjs +18 -94
- package/dist/esm/insights/InsightsFacetTags.mjs.map +1 -1
- package/dist/esm/insights/InsightsFacetTags.native.js +17 -99
- package/dist/esm/insights/InsightsFacetTags.native.js.map +1 -1
- package/dist/esm/list/FacetBadge.mjs +5 -29
- package/dist/esm/list/FacetBadge.mjs.map +1 -1
- package/dist/esm/list/FacetBadge.native.js +5 -29
- package/dist/esm/list/FacetBadge.native.js.map +1 -1
- package/dist/esm/list/FacetRail.mjs +40 -131
- package/dist/esm/list/FacetRail.mjs.map +1 -1
- package/dist/esm/list/FacetRail.native.js +35 -133
- package/dist/esm/list/FacetRail.native.js.map +1 -1
- package/dist/esm/list/ListControls.mjs +1 -3
- package/dist/esm/list/ListControls.mjs.map +1 -1
- package/dist/esm/list/ListControls.native.js +1 -3
- package/dist/esm/list/ListControls.native.js.map +1 -1
- package/dist/esm/list/ListControlsSheet.mjs +6 -16
- package/dist/esm/list/ListControlsSheet.mjs.map +1 -1
- package/dist/esm/list/ListControlsSheet.native.js +8 -18
- package/dist/esm/list/ListControlsSheet.native.js.map +1 -1
- package/dist/esm/list/ListSidebarToolbar.mjs +6 -21
- package/dist/esm/list/ListSidebarToolbar.mjs.map +1 -1
- package/dist/esm/list/ListSidebarToolbar.native.js +8 -23
- package/dist/esm/list/ListSidebarToolbar.native.js.map +1 -1
- package/dist/esm/list/RecordCard.mjs +95 -127
- package/dist/esm/list/RecordCard.mjs.map +1 -1
- package/dist/esm/list/RecordCard.native.js +78 -96
- package/dist/esm/list/RecordCard.native.js.map +1 -1
- package/dist/esm/list/ShufflePanel.mjs +57 -38
- package/dist/esm/list/ShufflePanel.mjs.map +1 -1
- package/dist/esm/list/ShufflePanel.native.js +64 -41
- package/dist/esm/list/ShufflePanel.native.js.map +1 -1
- package/dist/esm/list/listColumns.mjs +1 -1
- package/dist/esm/list/listColumns.mjs.map +1 -1
- package/dist/esm/list/listColumns.native.js +1 -1
- package/dist/esm/list/listColumns.native.js.map +1 -1
- package/dist/esm/record/RecordHero.mjs +8 -86
- package/dist/esm/record/RecordHero.mjs.map +1 -1
- package/dist/esm/record/RecordHero.native.js +8 -86
- package/dist/esm/record/RecordHero.native.js.map +1 -1
- package/dist/esm/record/RecordPage.mjs +6 -11
- package/dist/esm/record/RecordPage.mjs.map +1 -1
- package/dist/esm/record/RecordPage.native.js +6 -11
- package/dist/esm/record/RecordPage.native.js.map +1 -1
- package/dist/esm/report/ReportViewToolbar.mjs +78 -49
- package/dist/esm/report/ReportViewToolbar.mjs.map +1 -1
- package/dist/esm/report/ReportViewToolbar.native.js +81 -50
- package/dist/esm/report/ReportViewToolbar.native.js.map +1 -1
- package/dist/jsx/FileBrowser/index.mjs +16 -26
- package/dist/jsx/FileBrowser/index.mjs.map +1 -1
- package/dist/jsx/FileBrowser/index.native.js +15 -25
- package/dist/jsx/FileBrowser/index.native.js.map +1 -1
- package/dist/jsx/FormSidebar.mjs +110 -197
- package/dist/jsx/FormSidebar.mjs.map +1 -1
- package/dist/jsx/FormSidebar.native.js +120 -216
- package/dist/jsx/FormSidebar.native.js.map +1 -1
- package/dist/jsx/FrappeAssignment.mjs +0 -3
- package/dist/jsx/FrappeAssignment.mjs.map +1 -1
- package/dist/jsx/FrappeAssignment.native.js +0 -3
- package/dist/jsx/FrappeAssignment.native.js.map +1 -1
- package/dist/jsx/FrappeConnectionIndicator.mjs +7 -26
- package/dist/jsx/FrappeConnectionIndicator.mjs.map +1 -1
- package/dist/jsx/FrappeConnectionIndicator.native.js +5 -24
- package/dist/jsx/FrappeConnectionIndicator.native.js.map +1 -1
- package/dist/jsx/FrappeDashboard.mjs +0 -2
- package/dist/jsx/FrappeDashboard.mjs.map +1 -1
- package/dist/jsx/FrappeDashboard.native.js +0 -2
- package/dist/jsx/FrappeDashboard.native.js.map +1 -1
- package/dist/jsx/FrappeForm.mjs +7 -6
- package/dist/jsx/FrappeForm.mjs.map +1 -1
- package/dist/jsx/FrappeForm.native.js +6 -5
- package/dist/jsx/FrappeForm.native.js.map +1 -1
- package/dist/jsx/FrappeFormActions.mjs +22 -32
- package/dist/jsx/FrappeFormActions.mjs.map +1 -1
- package/dist/jsx/FrappeFormActions.native.js +23 -31
- package/dist/jsx/FrappeFormActions.native.js.map +1 -1
- package/dist/jsx/FrappeImageView.mjs +48 -67
- package/dist/jsx/FrappeImageView.mjs.map +1 -1
- package/dist/jsx/FrappeImageView.native.js +46 -68
- package/dist/jsx/FrappeImageView.native.js.map +1 -1
- package/dist/jsx/FrappeKanban.mjs +0 -1
- package/dist/jsx/FrappeKanban.mjs.map +1 -1
- package/dist/jsx/FrappeKanban.native.js +0 -1
- package/dist/jsx/FrappeKanban.native.js.map +1 -1
- package/dist/jsx/FrappeLikedBy.mjs +1 -1
- package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
- package/dist/jsx/FrappeLikedBy.native.js +1 -1
- package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
- package/dist/jsx/FrappeListView.mjs +25 -69
- package/dist/jsx/FrappeListView.mjs.map +1 -1
- package/dist/jsx/FrappeListView.native.js +25 -72
- package/dist/jsx/FrappeListView.native.js.map +1 -1
- package/dist/jsx/FrappeRecordView.mjs +4 -0
- package/dist/jsx/FrappeRecordView.mjs.map +1 -1
- package/dist/jsx/FrappeRecordView.native.js +4 -0
- package/dist/jsx/FrappeRecordView.native.js.map +1 -1
- package/dist/jsx/FrappeReportBuilder.mjs +21 -18
- package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
- package/dist/jsx/FrappeReportBuilder.native.js +21 -18
- package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
- package/dist/jsx/FrappeReportView.mjs +3 -5
- package/dist/jsx/FrappeReportView.mjs.map +1 -1
- package/dist/jsx/FrappeReportView.native.js +2 -4
- package/dist/jsx/FrappeReportView.native.js.map +1 -1
- package/dist/jsx/SyncErrorNotice.mjs +10 -38
- package/dist/jsx/SyncErrorNotice.mjs.map +1 -1
- package/dist/jsx/SyncErrorNotice.native.js +8 -36
- package/dist/jsx/SyncErrorNotice.native.js.map +1 -1
- package/dist/jsx/desk/DeskFormSidebar.mjs +1 -6
- package/dist/jsx/desk/DeskFormSidebar.mjs.map +1 -1
- package/dist/jsx/desk/DeskFormSidebar.native.js +1 -6
- package/dist/jsx/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/jsx/desk/DeskShell.mjs +0 -1
- package/dist/jsx/desk/DeskShell.mjs.map +1 -1
- package/dist/jsx/desk/DeskShell.native.js +0 -1
- package/dist/jsx/desk/DeskShell.native.js.map +1 -1
- package/dist/jsx/fields/Date/catalog.mjs.map +1 -1
- package/dist/jsx/fields/Date/catalog.native.js +0 -1
- package/dist/jsx/fields/Date/catalog.native.js.map +1 -1
- package/dist/jsx/fields/Date/index.native.js +4 -363
- package/dist/jsx/fields/Date/index.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload.mjs +53 -61
- package/dist/jsx/fields/FileUpload.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload.native.js +50 -56
- package/dist/jsx/fields/FileUpload.native.js.map +1 -1
- package/dist/jsx/insights/InsightsFacetTags.mjs +18 -94
- package/dist/jsx/insights/InsightsFacetTags.mjs.map +1 -1
- package/dist/jsx/insights/InsightsFacetTags.native.js +15 -97
- package/dist/jsx/insights/InsightsFacetTags.native.js.map +1 -1
- package/dist/jsx/list/FacetBadge.mjs +5 -29
- package/dist/jsx/list/FacetBadge.mjs.map +1 -1
- package/dist/jsx/list/FacetBadge.native.js +4 -28
- package/dist/jsx/list/FacetBadge.native.js.map +1 -1
- package/dist/jsx/list/FacetRail.mjs +40 -131
- package/dist/jsx/list/FacetRail.mjs.map +1 -1
- package/dist/jsx/list/FacetRail.native.js +32 -130
- package/dist/jsx/list/FacetRail.native.js.map +1 -1
- package/dist/jsx/list/ListControls.mjs +1 -3
- package/dist/jsx/list/ListControls.mjs.map +1 -1
- package/dist/jsx/list/ListControls.native.js +1 -3
- package/dist/jsx/list/ListControls.native.js.map +1 -1
- package/dist/jsx/list/ListControlsSheet.mjs +6 -16
- package/dist/jsx/list/ListControlsSheet.mjs.map +1 -1
- package/dist/jsx/list/ListControlsSheet.native.js +7 -17
- package/dist/jsx/list/ListControlsSheet.native.js.map +1 -1
- package/dist/jsx/list/ListSidebarToolbar.mjs +6 -21
- package/dist/jsx/list/ListSidebarToolbar.mjs.map +1 -1
- package/dist/jsx/list/ListSidebarToolbar.native.js +7 -22
- package/dist/jsx/list/ListSidebarToolbar.native.js.map +1 -1
- package/dist/jsx/list/RecordCard.mjs +95 -127
- package/dist/jsx/list/RecordCard.mjs.map +1 -1
- package/dist/jsx/list/RecordCard.native.js +78 -96
- package/dist/jsx/list/RecordCard.native.js.map +1 -1
- package/dist/jsx/list/ShufflePanel.mjs +57 -38
- package/dist/jsx/list/ShufflePanel.mjs.map +1 -1
- package/dist/jsx/list/ShufflePanel.native.js +62 -39
- package/dist/jsx/list/ShufflePanel.native.js.map +1 -1
- package/dist/jsx/list/listColumns.mjs +1 -1
- package/dist/jsx/list/listColumns.mjs.map +1 -1
- package/dist/jsx/list/listColumns.native.js +1 -1
- package/dist/jsx/list/listColumns.native.js.map +1 -1
- package/dist/jsx/record/RecordHero.mjs +8 -86
- package/dist/jsx/record/RecordHero.mjs.map +1 -1
- package/dist/jsx/record/RecordHero.native.js +7 -85
- package/dist/jsx/record/RecordHero.native.js.map +1 -1
- package/dist/jsx/record/RecordPage.mjs +6 -11
- package/dist/jsx/record/RecordPage.mjs.map +1 -1
- package/dist/jsx/record/RecordPage.native.js +5 -10
- package/dist/jsx/record/RecordPage.native.js.map +1 -1
- package/dist/jsx/report/ReportViewToolbar.mjs +78 -49
- package/dist/jsx/report/ReportViewToolbar.mjs.map +1 -1
- package/dist/jsx/report/ReportViewToolbar.native.js +79 -48
- package/dist/jsx/report/ReportViewToolbar.native.js.map +1 -1
- package/package.json +16 -16
- package/src/FileBrowser/index.tsx +11 -15
- package/src/FormSidebar.stories.tsx +1 -1
- package/src/FormSidebar.tsx +146 -251
- package/src/FrappeAssignment.tsx +0 -3
- package/src/FrappeConnectionIndicator.tsx +6 -28
- package/src/FrappeDashboard.spec.tsx +7 -3
- package/src/FrappeDashboard.tsx +0 -2
- package/src/FrappeForm.connections.spec.tsx +2 -2
- package/src/FrappeForm.deskSemantics.spec.tsx +2 -2
- package/src/FrappeForm.lifecycle.spec.tsx +27 -27
- package/src/FrappeForm.tsx +11 -7
- package/src/FrappeFormActions.tsx +24 -38
- package/src/FrappeImageView.stories.tsx +1 -6
- package/src/FrappeImageView.tsx +52 -66
- package/src/FrappeKanban.tsx +0 -1
- package/src/FrappeLikedBy.tsx +1 -1
- package/src/FrappeListView.controls.spec.tsx +3 -2
- package/src/FrappeListView.spec.tsx +7 -3
- package/src/FrappeListView.tsx +23 -56
- package/src/FrappeRecordView.tsx +16 -3
- package/src/FrappeReportBuilder.tsx +21 -19
- package/src/FrappeReportView.tsx +3 -6
- package/src/SyncErrorNotice.spec.tsx +7 -12
- package/src/SyncErrorNotice.stories.tsx +2 -4
- package/src/SyncErrorNotice.tsx +13 -41
- package/src/desk/DeskFormSidebar.tsx +1 -2
- package/src/desk/DeskShell.tsx +1 -1
- package/src/desk/deskDocumentRoutes.spec.tsx +7 -4
- package/src/fields/Date/catalog.tsx +6 -7
- package/src/fields/Date/nativeIsCatalog.spec.tsx +26 -0
- package/src/fields/Date/typeParity.spec.tsx +26 -102
- package/src/fields/FileUpload.spec.tsx +18 -3
- package/src/fields/FileUpload.tsx +64 -68
- package/src/frappeRemainder.designLaw.spec.ts +8 -7
- package/src/insights/InsightsFacetTags.tsx +21 -102
- package/src/list/FacetBadge.tsx +7 -29
- package/src/list/FacetRail.spec.tsx +11 -10
- package/src/list/FacetRail.tsx +49 -161
- package/src/list/ListControls.tsx +1 -3
- package/src/list/ListControlsSheet.tsx +10 -12
- package/src/list/ListSidebarToolbar.tsx +7 -18
- package/src/list/RecordCard.native.tsx +65 -71
- package/src/list/RecordCard.spec.tsx +8 -5
- package/src/list/RecordCard.tsx +110 -129
- package/src/list/ShufflePanel.tsx +63 -38
- package/src/list/listColumns.tsx +1 -1
- package/src/record/RecordHero.tsx +11 -51
- package/src/record/RecordPage.tsx +8 -11
- package/src/report/ReportViewToolbar.spec.tsx +45 -3
- package/src/report/ReportViewToolbar.tsx +113 -62
- package/src/useFrappeForm.spec.tsx +1 -1
- package/types/FileBrowser/index.d.ts.map +1 -1
- package/types/FormSidebar.d.ts +13 -3
- package/types/FormSidebar.d.ts.map +1 -1
- package/types/FrappeAssignment.d.ts.map +1 -1
- package/types/FrappeConnectionIndicator.d.ts +2 -1
- package/types/FrappeConnectionIndicator.d.ts.map +1 -1
- package/types/FrappeDashboard.d.ts.map +1 -1
- package/types/FrappeFormActions.d.ts.map +1 -1
- package/types/FrappeImageView.d.ts.map +1 -1
- package/types/FrappeKanban.d.ts.map +1 -1
- package/types/FrappeListView.d.ts.map +1 -1
- package/types/FrappeRecordView.d.ts.map +1 -1
- package/types/FrappeReportBuilder.d.ts.map +1 -1
- package/types/FrappeReportView.d.ts.map +1 -1
- package/types/SyncErrorNotice.d.ts +4 -6
- package/types/SyncErrorNotice.d.ts.map +1 -1
- package/types/desk/DeskFormSidebar.d.ts.map +1 -1
- package/types/desk/DeskShell.d.ts.map +1 -1
- package/types/fields/Date/catalog.d.ts +5 -4
- package/types/fields/Date/catalog.d.ts.map +1 -1
- package/types/fields/FileUpload.d.ts.map +1 -1
- package/types/insights/InsightsFacetTags.d.ts +4 -1
- package/types/insights/InsightsFacetTags.d.ts.map +1 -1
- package/types/list/FacetBadge.d.ts +3 -3
- package/types/list/FacetBadge.d.ts.map +1 -1
- package/types/list/FacetRail.d.ts +7 -5
- package/types/list/FacetRail.d.ts.map +1 -1
- package/types/list/ListControls.d.ts.map +1 -1
- package/types/list/ListControlsSheet.d.ts.map +1 -1
- package/types/list/ListSidebarToolbar.d.ts.map +1 -1
- package/types/list/RecordCard.d.ts +6 -6
- package/types/list/RecordCard.d.ts.map +1 -1
- package/types/list/RecordCard.native.d.ts +4 -3
- package/types/list/RecordCard.native.d.ts.map +1 -1
- package/types/list/ShufflePanel.d.ts +8 -3
- package/types/list/ShufflePanel.d.ts.map +1 -1
- package/types/record/RecordHero.d.ts +5 -1
- package/types/record/RecordHero.d.ts.map +1 -1
- package/types/record/RecordPage.d.ts.map +1 -1
- package/types/report/ReportViewToolbar.d.ts.map +1 -1
- package/dist/cjs/fields/Date/dateTimePickerLoader.cjs +0 -38
- package/dist/cjs/fields/Date/dateTimePickerLoader.native.js +0 -42
- package/dist/cjs/fields/Date/dateTimePickerLoader.native.js.map +0 -1
- package/dist/cjs/fields/Date/sheetKeyboard.cjs +0 -54
- package/dist/cjs/fields/Date/sheetKeyboard.native.js +0 -57
- package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +0 -1
- package/dist/esm/fields/Date/dateTimePickerLoader.mjs +0 -13
- package/dist/esm/fields/Date/dateTimePickerLoader.mjs.map +0 -1
- package/dist/esm/fields/Date/dateTimePickerLoader.native.js +0 -14
- package/dist/esm/fields/Date/dateTimePickerLoader.native.js.map +0 -1
- package/dist/esm/fields/Date/sheetKeyboard.mjs +0 -21
- package/dist/esm/fields/Date/sheetKeyboard.mjs.map +0 -1
- package/dist/esm/fields/Date/sheetKeyboard.native.js +0 -21
- package/dist/esm/fields/Date/sheetKeyboard.native.js.map +0 -1
- package/dist/jsx/fields/Date/dateTimePickerLoader.mjs +0 -13
- package/dist/jsx/fields/Date/dateTimePickerLoader.mjs.map +0 -1
- package/dist/jsx/fields/Date/dateTimePickerLoader.native.js +0 -42
- package/dist/jsx/fields/Date/dateTimePickerLoader.native.js.map +0 -1
- package/dist/jsx/fields/Date/sheetKeyboard.mjs +0 -21
- package/dist/jsx/fields/Date/sheetKeyboard.mjs.map +0 -1
- package/dist/jsx/fields/Date/sheetKeyboard.native.js +0 -57
- package/dist/jsx/fields/Date/sheetKeyboard.native.js.map +0 -1
- package/src/fields/Date/dateTimePickerLoader.ts +0 -25
- package/src/fields/Date/index.native.tsx +0 -445
- package/src/fields/Date/nativeFallback.spec.tsx +0 -21
- package/src/fields/Date/nativePresentation.spec.tsx +0 -278
- package/src/fields/Date/sheetKeyboard.spec.ts +0 -60
- package/src/fields/Date/sheetKeyboard.ts +0 -45
- package/types/fields/Date/dateTimePickerLoader.d.ts +0 -11
- package/types/fields/Date/dateTimePickerLoader.d.ts.map +0 -1
- package/types/fields/Date/index.native.d.ts +0 -14
- package/types/fields/Date/index.native.d.ts.map +0 -1
- package/types/fields/Date/sheetKeyboard.d.ts +0 -20
- package/types/fields/Date/sheetKeyboard.d.ts.map +0 -1
package/src/FrappeLikedBy.tsx
CHANGED
|
@@ -281,10 +281,10 @@ function FrappeLikedByBody({
|
|
|
281
281
|
<XStack alignItems="center" gap="$2">
|
|
282
282
|
<Button
|
|
283
283
|
size="$2"
|
|
284
|
-
circular
|
|
285
284
|
chromeless
|
|
286
285
|
disabled={!canToggle}
|
|
287
286
|
aria-pressed={liked}
|
|
287
|
+
selected={false}
|
|
288
288
|
aria-label={liked ? t("Unlike") : t("Like")}
|
|
289
289
|
onPress={handleToggle}
|
|
290
290
|
icon={
|
|
@@ -165,7 +165,8 @@ describe("FrappeListView controls write their state back", () => {
|
|
|
165
165
|
renderList({}, {}, navigationAt({}, setParams));
|
|
166
166
|
await waitFor(() => expect(shownCards().length).toBe(6), { timeout: 5000 });
|
|
167
167
|
const chip = await screen.findByTestId("pokemon-type-fire");
|
|
168
|
-
expect(
|
|
168
|
+
expect(chip.hasAttribute("data-chip")).toBe(true);
|
|
169
|
+
expect(chip.getAttribute("role")).toBe("radio");
|
|
169
170
|
fireEvent.click(chip);
|
|
170
171
|
await expectCards(["charmander"]);
|
|
171
172
|
expect(setParams).toHaveBeenCalledWith({ type: "fire" });
|
|
@@ -228,7 +229,7 @@ describe("FrappeListView routed page with its toolbar off", () => {
|
|
|
228
229
|
fireEvent.click(screen.getByTestId("insights"));
|
|
229
230
|
expect(navigate).toHaveBeenCalledWith("/pokemon/insights");
|
|
230
231
|
expect(screen.getByText("Skip to results")).toBeTruthy();
|
|
231
|
-
fireEvent.click(await screen.
|
|
232
|
+
fireEvent.click(await screen.findByRole("button", { name: "Add Pokemon" }));
|
|
232
233
|
expect(navigate).toHaveBeenCalledWith("/pokemon/new");
|
|
233
234
|
});
|
|
234
235
|
});
|
|
@@ -130,10 +130,14 @@ describe("FrappeListView refresh press floor (LC-54 amendment)", () => {
|
|
|
130
130
|
expect(refresh.className).not.toMatch(negativeMarginAtom);
|
|
131
131
|
const token = refresh.getAttribute("data-size-token") as SizeTokens;
|
|
132
132
|
const px = Number(getVariableValue(getSize(token)));
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
// LC-176: the bare glyph sits in a square box at its control height, inside
|
|
134
|
+
// the token box, and slop restores the 44pt press floor.
|
|
135
|
+
const box = Number(/(?:^| )_mih-(\d+)px/.exec(refresh.className)?.[1]);
|
|
136
|
+
expect(refresh.className).toContain(`_miw-${box}px`);
|
|
137
|
+
expect(box).toBeGreaterThan(0);
|
|
138
|
+
expect(box).toBeLessThanOrEqual(px);
|
|
135
139
|
const slop = Number(refresh.getAttribute("data-mp-press-slop") ?? 0);
|
|
136
|
-
expect(
|
|
140
|
+
expect(box + slop * 2).toBeGreaterThanOrEqual(44);
|
|
137
141
|
});
|
|
138
142
|
|
|
139
143
|
it("hover feedback rides the button's own in-slot box (house channel)", async () => {
|
package/src/FrappeListView.tsx
CHANGED
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
EmptyState,
|
|
23
23
|
ListPageLayout,
|
|
24
24
|
ListRow,
|
|
25
|
+
PageBarButton,
|
|
25
26
|
PageHeader,
|
|
26
27
|
SkipLink,
|
|
27
28
|
Tooltip,
|
|
@@ -922,7 +923,7 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
|
|
|
922
923
|
: [];
|
|
923
924
|
const headerActions =
|
|
924
925
|
headerOwnsViews || (headerOwnsTools && onAdd) || headerAccessory || actions?.length ? (
|
|
925
|
-
<XStack
|
|
926
|
+
<XStack alignItems="center">
|
|
926
927
|
{headerOwnsViews ? (
|
|
927
928
|
<Tooltip content={t("Switch views")}>
|
|
928
929
|
<XStack {...secondaryHidden}>
|
|
@@ -938,69 +939,35 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
|
|
|
938
939
|
{actions?.map((action) => {
|
|
939
940
|
const Icon = action.icon;
|
|
940
941
|
const onPress = pressFor(action);
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
<
|
|
944
|
-
|
|
945
|
-
<
|
|
946
|
-
|
|
942
|
+
return (
|
|
943
|
+
<XStack key={action.label} {...secondaryHidden}>
|
|
944
|
+
<Tooltip content={action.hint ?? action.label}>
|
|
945
|
+
{Icon ? (
|
|
946
|
+
<PageBarButton
|
|
947
|
+
icon={Icon as never}
|
|
948
|
+
aria-label={action.label}
|
|
947
949
|
onPress={onPress}
|
|
948
|
-
icon={Icon ? <Icon size={16} /> : undefined}
|
|
949
950
|
testID={action.testID}
|
|
950
|
-
|
|
951
|
+
/>
|
|
952
|
+
) : (
|
|
953
|
+
<Button chromeless accentInk onPress={onPress} testID={action.testID}>
|
|
951
954
|
{action.label}
|
|
952
955
|
</Button>
|
|
953
|
-
|
|
954
|
-
</XStack>
|
|
955
|
-
);
|
|
956
|
-
}
|
|
957
|
-
return (
|
|
958
|
-
<React.Fragment key={action.label}>
|
|
959
|
-
<Tooltip content={action.hint ?? action.label}>
|
|
960
|
-
{/* responsive-parity: the circular icon twin below carries this action on phones */}
|
|
961
|
-
<Button
|
|
962
|
-
outlined
|
|
963
|
-
onPress={onPress}
|
|
964
|
-
icon={Icon ? <Icon size={16} /> : undefined}
|
|
965
|
-
$max-sm={{ display: "none" }}
|
|
966
|
-
testID={action.testID}
|
|
967
|
-
>
|
|
968
|
-
{action.label}
|
|
969
|
-
</Button>
|
|
956
|
+
)}
|
|
970
957
|
</Tooltip>
|
|
971
|
-
|
|
972
|
-
outlined
|
|
973
|
-
circular
|
|
974
|
-
onPress={onPress}
|
|
975
|
-
icon={Icon ? <Icon size={16} /> : undefined}
|
|
976
|
-
display="none"
|
|
977
|
-
aria-label={action.label}
|
|
978
|
-
$max-sm={{ display: "flex" }}
|
|
979
|
-
/>
|
|
980
|
-
</React.Fragment>
|
|
958
|
+
</XStack>
|
|
981
959
|
);
|
|
982
960
|
})}
|
|
983
961
|
{headerOwnsTools && onAdd ? (
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
onPress={onAdd}
|
|
989
|
-
icon={<PlusIcon size={16} />}
|
|
990
|
-
$max-sm={{ display: "none" }}
|
|
991
|
-
>
|
|
992
|
-
{t("Add {{doctype}}", { doctype })}
|
|
993
|
-
</Button>
|
|
994
|
-
<Button
|
|
995
|
-
theme="accent"
|
|
962
|
+
<Tooltip content={t("Add {{doctype}}", { doctype })}>
|
|
963
|
+
<PageBarButton
|
|
964
|
+
icon={PlusIcon}
|
|
965
|
+
aria-label={t("Add {{doctype}}", { doctype })}
|
|
996
966
|
onPress={onAdd}
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
{t("Add")}
|
|
1002
|
-
</Button>
|
|
1003
|
-
</>
|
|
967
|
+
edge="end"
|
|
968
|
+
testID={`${slug}-add`}
|
|
969
|
+
/>
|
|
970
|
+
</Tooltip>
|
|
1004
971
|
) : null}
|
|
1005
972
|
</XStack>
|
|
1006
973
|
) : undefined;
|
|
@@ -1013,6 +980,7 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
|
|
|
1013
980
|
rows={shuffleRows}
|
|
1014
981
|
itemLabel={shuffle.label}
|
|
1015
982
|
renderPick={(doc) => drawCard(doc, 0)}
|
|
983
|
+
grid={gridProps}
|
|
1016
984
|
onGo={(doc) => {
|
|
1017
985
|
setShuffleOpen(false);
|
|
1018
986
|
onItemClick?.(doc);
|
|
@@ -1234,7 +1202,6 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
|
|
|
1234
1202
|
feedback stays inside its own layout slot. */}
|
|
1235
1203
|
<Button
|
|
1236
1204
|
size="$2"
|
|
1237
|
-
circular
|
|
1238
1205
|
chromeless
|
|
1239
1206
|
icon={ArrowsClockwiseIcon}
|
|
1240
1207
|
onPress={handleRefresh}
|
package/src/FrappeRecordView.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EmptyState, Screen } from "@multiplatform.one/components";
|
|
2
2
|
import { Button } from "@multiplatform.one/forms";
|
|
3
3
|
import type { Order } from "@multiplatform.one/frappe";
|
|
4
|
+
import { DETAIL_READABLE_WIDTH } from "@multiplatform.one/theme";
|
|
4
5
|
import { useMemo } from "react";
|
|
5
6
|
import { useTranslation } from "react-i18next";
|
|
6
7
|
import type { FrappeConnection } from "./frappeConnections";
|
|
@@ -141,12 +142,18 @@ export function FrappeRecordView<TDoc extends { name: string; doctype: string }>
|
|
|
141
142
|
showSidebar={false}
|
|
142
143
|
showTimeline={false}
|
|
143
144
|
loadingFallback={
|
|
144
|
-
<Screen noPadding gap={0} topBar={backButton}>
|
|
145
|
+
<Screen noPadding gap={0} maxWidth={DETAIL_READABLE_WIDTH} topBar={backButton}>
|
|
145
146
|
<RecordSkeleton testID={`${slug}-detail-skeleton`} />
|
|
146
147
|
</Screen>
|
|
147
148
|
}
|
|
148
149
|
notFoundFallback={
|
|
149
|
-
<Screen
|
|
150
|
+
<Screen
|
|
151
|
+
scroll={false}
|
|
152
|
+
noPadding
|
|
153
|
+
gap={0}
|
|
154
|
+
maxWidth={DETAIL_READABLE_WIDTH}
|
|
155
|
+
topBar={backButton}
|
|
156
|
+
>
|
|
150
157
|
<EmptyState
|
|
151
158
|
title={t("{{doctype}} not found", { doctype })}
|
|
152
159
|
description={t("No {{doctype}} is named {{name}}.", { doctype, name })}
|
|
@@ -159,7 +166,13 @@ export function FrappeRecordView<TDoc extends { name: string; doctype: string }>
|
|
|
159
166
|
</Screen>
|
|
160
167
|
}
|
|
161
168
|
errorFallback={
|
|
162
|
-
<Screen
|
|
169
|
+
<Screen
|
|
170
|
+
scroll={false}
|
|
171
|
+
noPadding
|
|
172
|
+
gap={0}
|
|
173
|
+
maxWidth={DETAIL_READABLE_WIDTH}
|
|
174
|
+
topBar={backButton}
|
|
175
|
+
>
|
|
163
176
|
<EmptyState
|
|
164
177
|
intent="error"
|
|
165
178
|
title={t("Couldn't load this {{doctype}}", { doctype })}
|
|
@@ -870,25 +870,27 @@ function FrappeReportBuilderBody({
|
|
|
870
870
|
|
|
871
871
|
const content = (
|
|
872
872
|
<YStack flex={1} minWidth={0} minHeight={0} {...stackProps}>
|
|
873
|
-
<
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
873
|
+
<YStack paddingHorizontal="$3">
|
|
874
|
+
<ReportViewToolbar
|
|
875
|
+
columns={allColumns}
|
|
876
|
+
selected={selectedFieldnames}
|
|
877
|
+
onToggleColumn={handleToggleColumn}
|
|
878
|
+
onResetColumns={handleResetColumns}
|
|
879
|
+
groupBy={groupBy}
|
|
880
|
+
onGroupByChange={setGroupBy}
|
|
881
|
+
baseFilters={baseFilters}
|
|
882
|
+
onClearBaseFilters={baseFilters.length > 0 ? handleClearBaseFilters : undefined}
|
|
883
|
+
columnFilterCount={columnTuples.length}
|
|
884
|
+
onClearColumnFilters={handleClearColumnFilters}
|
|
885
|
+
savedReports={savedReports.reports}
|
|
886
|
+
currentReport={currentReport}
|
|
887
|
+
onSelectReport={handleSelectReport}
|
|
888
|
+
onSaveReport={readsWithoutMeta ? undefined : handleSaveReport}
|
|
889
|
+
onDeleteReport={readsWithoutMeta ? undefined : handleDeleteReport}
|
|
890
|
+
onExport={exportEnabled ? handleExport : undefined}
|
|
891
|
+
exportDisabled={total === 0}
|
|
892
|
+
/>
|
|
893
|
+
</YStack>
|
|
892
894
|
<ScrollView
|
|
893
895
|
flex={1}
|
|
894
896
|
minWidth={0}
|
package/src/FrappeReportView.tsx
CHANGED
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
* hidden where the web download pipeline does not exist.
|
|
41
41
|
*/
|
|
42
42
|
import { AsyncBoundary, EmptyState } from "@multiplatform.one/components";
|
|
43
|
-
import {
|
|
43
|
+
import { DatePicker, IconButton, Spinner, formCommonColors } from "@multiplatform.one/forms";
|
|
44
44
|
import {
|
|
45
45
|
DataTable,
|
|
46
46
|
DataTableExport,
|
|
@@ -477,14 +477,11 @@ export function FrappeReportView({
|
|
|
477
477
|
</XStack>
|
|
478
478
|
)}
|
|
479
479
|
{refreshShown && (
|
|
480
|
-
<
|
|
481
|
-
size="$2"
|
|
480
|
+
<IconButton
|
|
482
481
|
icon={ArrowClockwiseIcon}
|
|
483
482
|
onPress={refresh}
|
|
484
483
|
aria-label={t("Refresh report")}
|
|
485
|
-
|
|
486
|
-
{t("Refresh")}
|
|
487
|
-
</Button>
|
|
484
|
+
/>
|
|
488
485
|
)}
|
|
489
486
|
{exportEnabled && rows.length > 0 && (
|
|
490
487
|
<DataTableExport
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// SyncErrorNotice contract: the visible half of the rejected-write pattern —
|
|
2
|
-
// role="alert" message, Retry re-issues,
|
|
2
|
+
// role="alert" message, Retry re-issues, the close button clears, and each affordance
|
|
3
3
|
// only renders when its handler is provided.
|
|
4
4
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
5
5
|
import { cleanup, fireEvent, screen } from "@testing-library/react";
|
|
@@ -33,7 +33,9 @@ describe("SyncErrorNotice", () => {
|
|
|
33
33
|
);
|
|
34
34
|
fireEvent.click(await screen.findByText("Retry"));
|
|
35
35
|
expect(onRetry).toHaveBeenCalledTimes(1);
|
|
36
|
-
|
|
36
|
+
const close = await screen.findByRole("button", { name: "Dismiss" });
|
|
37
|
+
expect(close.textContent?.trim()).toBe("");
|
|
38
|
+
fireEvent.click(close);
|
|
37
39
|
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
38
40
|
});
|
|
39
41
|
|
|
@@ -41,20 +43,13 @@ describe("SyncErrorNotice", () => {
|
|
|
41
43
|
renderWithProviders(<SyncErrorNotice message="No actions" />);
|
|
42
44
|
await screen.findByRole("alert");
|
|
43
45
|
expect(screen.queryByText("Retry")).toBeNull();
|
|
44
|
-
expect(screen.
|
|
46
|
+
expect(screen.queryByRole("button", { name: "Dismiss" })).toBeNull();
|
|
45
47
|
});
|
|
46
48
|
|
|
47
|
-
it("honors custom
|
|
49
|
+
it("honors a custom Retry label", async () => {
|
|
48
50
|
renderWithProviders(
|
|
49
|
-
<SyncErrorNotice
|
|
50
|
-
message="Custom"
|
|
51
|
-
onRetry={() => {}}
|
|
52
|
-
onDismiss={() => {}}
|
|
53
|
-
retryLabel="Try again"
|
|
54
|
-
dismissLabel="Ignore"
|
|
55
|
-
/>,
|
|
51
|
+
<SyncErrorNotice message="Custom" onRetry={() => {}} retryLabel="Try again" />,
|
|
56
52
|
);
|
|
57
53
|
expect(await screen.findByText("Try again")).toBeTruthy();
|
|
58
|
-
expect(await screen.findByText("Ignore")).toBeTruthy();
|
|
59
54
|
});
|
|
60
55
|
});
|
|
@@ -10,14 +10,13 @@ export default {
|
|
|
10
10
|
docs: {
|
|
11
11
|
description: {
|
|
12
12
|
component:
|
|
13
|
-
"Rejected-write notice: role=alert message with Retry (same mutation id) and
|
|
13
|
+
"Rejected-write notice: role=alert message with Retry (same mutation id) and a close button. Each affordance only renders when its handler is provided.",
|
|
14
14
|
},
|
|
15
15
|
},
|
|
16
16
|
},
|
|
17
17
|
argTypes: {
|
|
18
18
|
message: { control: "text" },
|
|
19
19
|
retryLabel: { control: "text" },
|
|
20
|
-
dismissLabel: { control: "text" },
|
|
21
20
|
},
|
|
22
21
|
};
|
|
23
22
|
|
|
@@ -40,11 +39,10 @@ export const AllStates = () => (
|
|
|
40
39
|
<SyncErrorNotice message="Write rejected — retry only" onRetry={action("onRetry")} />
|
|
41
40
|
<SyncErrorNotice message="No actions" />
|
|
42
41
|
<SyncErrorNotice
|
|
43
|
-
message="Custom
|
|
42
|
+
message="Custom Retry label"
|
|
44
43
|
onRetry={action("onRetry")}
|
|
45
44
|
onDismiss={action("onDismiss")}
|
|
46
45
|
retryLabel="Try again"
|
|
47
|
-
dismissLabel="Ignore"
|
|
48
46
|
/>
|
|
49
47
|
</YStack>
|
|
50
48
|
);
|
package/src/SyncErrorNotice.tsx
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
1
|
+
import { Alert } from "@multiplatform.one/components";
|
|
3
2
|
import React from "react";
|
|
4
3
|
import { useTranslation } from "react-i18next";
|
|
5
|
-
import { XStack } from "tamagui";
|
|
6
4
|
|
|
7
5
|
export interface SyncErrorNoticeProps {
|
|
8
6
|
/** Human-readable failure message (already localized by the caller). */
|
|
@@ -12,20 +10,18 @@ export interface SyncErrorNoticeProps {
|
|
|
12
10
|
* Omit to hide the Retry affordance.
|
|
13
11
|
*/
|
|
14
12
|
onRetry?: () => void;
|
|
15
|
-
/** Drops the failed entry without retrying. Omit to hide
|
|
13
|
+
/** Drops the failed entry without retrying: the alert's close button. Omit to hide it. */
|
|
16
14
|
onDismiss?: () => void;
|
|
17
15
|
/** Override the Retry button label (defaults to a localized "Retry"). */
|
|
18
16
|
retryLabel?: string;
|
|
19
|
-
/** Override the Dismiss button label (defaults to a localized "Dismiss"). */
|
|
20
|
-
dismissLabel?: string;
|
|
21
17
|
}
|
|
22
18
|
|
|
23
19
|
/**
|
|
24
20
|
* The rejected-write notice — the visible half of the optimistic mutation
|
|
25
|
-
* contract: when the server rejects a write, the optimistic state has
|
|
21
|
+
* contract, on the MPO error `Alert` (LC-175): when the server rejects a write, the optimistic state has
|
|
26
22
|
* already been rolled back by the sync engine; this primitive surfaces the
|
|
27
23
|
* error inline at the surface that initiated the write, with Retry
|
|
28
|
-
* (re-issues the SAME mutation id) and
|
|
24
|
+
* (re-issues the SAME mutation id) and a close button (clears the ledger entry).
|
|
29
25
|
*
|
|
30
26
|
* Pair with `useFrappePendingMutations` from `@multiplatform.one/frappe`:
|
|
31
27
|
*
|
|
@@ -41,41 +37,17 @@ export interface SyncErrorNoticeProps {
|
|
|
41
37
|
* ))}
|
|
42
38
|
* ```
|
|
43
39
|
*/
|
|
44
|
-
export function SyncErrorNotice({
|
|
45
|
-
message,
|
|
46
|
-
onRetry,
|
|
47
|
-
onDismiss,
|
|
48
|
-
retryLabel,
|
|
49
|
-
dismissLabel,
|
|
50
|
-
}: SyncErrorNoticeProps) {
|
|
40
|
+
export function SyncErrorNotice({ message, onRetry, onDismiss, retryLabel }: SyncErrorNoticeProps) {
|
|
51
41
|
const { t } = useTranslation();
|
|
52
|
-
const { knobProps } = useResolvedKnobs();
|
|
53
42
|
return (
|
|
54
|
-
<
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
paddingVertical="$2"
|
|
61
|
-
{...knobProps.borderRadius}
|
|
62
|
-
backgroundColor="$red3"
|
|
63
|
-
borderColor="$red7"
|
|
64
|
-
borderWidth={1}
|
|
43
|
+
<Alert
|
|
44
|
+
intent="error"
|
|
45
|
+
actionLabel={onRetry ? (retryLabel ?? t("Retry")) : undefined}
|
|
46
|
+
onAction={onRetry}
|
|
47
|
+
dismissible={Boolean(onDismiss)}
|
|
48
|
+
onDismiss={onDismiss}
|
|
65
49
|
>
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
</Text>
|
|
69
|
-
{onRetry && (
|
|
70
|
-
<Button size="$2" theme="error" {...knobProps.borderRadius} onPress={onRetry}>
|
|
71
|
-
{retryLabel ?? t("Retry")}
|
|
72
|
-
</Button>
|
|
73
|
-
)}
|
|
74
|
-
{onDismiss && (
|
|
75
|
-
<Button size="$2" chromeless {...knobProps.borderRadius} onPress={onDismiss}>
|
|
76
|
-
{dismissLabel ?? t("Dismiss")}
|
|
77
|
-
</Button>
|
|
78
|
-
)}
|
|
79
|
-
</XStack>
|
|
50
|
+
{message}
|
|
51
|
+
</Alert>
|
|
80
52
|
);
|
|
81
53
|
}
|
|
@@ -20,7 +20,6 @@ import { useDocTypeMeta, useFrappeCollection, useLiveQuery } from "@multiplatfor
|
|
|
20
20
|
import { eq } from "@tanstack/db";
|
|
21
21
|
import React, { useMemo } from "react";
|
|
22
22
|
import { useTranslation } from "react-i18next";
|
|
23
|
-
import { isWeb } from "tamagui";
|
|
24
23
|
import {
|
|
25
24
|
buildSidebarSections,
|
|
26
25
|
mapDocToSidebarMetadata,
|
|
@@ -142,7 +141,7 @@ export function DeskFormSidebar({ doctype, name }: DeskFormSidebarProps) {
|
|
|
142
141
|
// inline rail width, and drop the end rail — the pane gap separates the
|
|
143
142
|
// sidebar from the form (stacked below on compact, the rail would float).
|
|
144
143
|
width="100%"
|
|
145
|
-
{
|
|
144
|
+
divider={false}
|
|
146
145
|
data-testid="desk-form-sidebar"
|
|
147
146
|
/>
|
|
148
147
|
);
|
package/src/desk/DeskShell.tsx
CHANGED
|
@@ -90,6 +90,7 @@ function useIsNarrowDesk(): boolean {
|
|
|
90
90
|
// Component
|
|
91
91
|
// ---------------------------------------------------------------------------
|
|
92
92
|
|
|
93
|
+
// mpo-role-escape: MPO has no app shell (top bar, nav rail, compact drawer) yet; FZ-7996 builds it and moves DeskShell onto it.
|
|
93
94
|
export function DeskShell({
|
|
94
95
|
children,
|
|
95
96
|
breadcrumbs,
|
|
@@ -156,7 +157,6 @@ export function DeskShell({
|
|
|
156
157
|
const toggleButton = showMobileToggle ? (
|
|
157
158
|
<Button
|
|
158
159
|
chromeless
|
|
159
|
-
circular
|
|
160
160
|
icon={mobileSidebarOpen ? XIcon : ListIcon}
|
|
161
161
|
aria-label={t("Toggle sidebar")}
|
|
162
162
|
aria-expanded={mobileSidebarOpen}
|
|
@@ -21,9 +21,12 @@ vi.mock("../FrappeListView", () => ({
|
|
|
21
21
|
}));
|
|
22
22
|
vi.mock("../FrappeForm", () => ({
|
|
23
23
|
FrappeForm: ({ onSave, name }: { onSave: (doc: { name: string }) => void; name?: string }) => (
|
|
24
|
-
<button
|
|
25
|
-
Save
|
|
26
|
-
|
|
24
|
+
<button
|
|
25
|
+
aria-label="Save"
|
|
26
|
+
onClick={() => onSave({ name: state.name })}
|
|
27
|
+
data-testid="form"
|
|
28
|
+
data-name={name}
|
|
29
|
+
/>
|
|
27
30
|
),
|
|
28
31
|
}));
|
|
29
32
|
vi.mock("@multiplatform.one/components", () => ({
|
|
@@ -59,7 +62,7 @@ describe.each(["A/B", "A?B", "A#B", "A B", "Pokémon", "A%2FB"])("desk document
|
|
|
59
62
|
state.name = name;
|
|
60
63
|
const navigate = vi.fn();
|
|
61
64
|
render(<DeskFormPage doctype="todo" onNavigate={navigate} />);
|
|
62
|
-
fireEvent.click(screen.
|
|
65
|
+
fireEvent.click(screen.getByLabelText("Save"));
|
|
63
66
|
expect(navigate).toHaveBeenCalledWith(path);
|
|
64
67
|
});
|
|
65
68
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* The `Date` field for the three Frappe date fieldtypes, on web and native.
|
|
3
|
+
* On iOS and Android the forms pickers open the OS sheet themselves
|
|
4
|
+
* (`OsDateTimeSheet`), so this field has no native fork (FZ-8000).
|
|
4
5
|
*
|
|
5
6
|
* The field used to render ONE date-only calendar for all three types, with
|
|
6
7
|
* only the placeholder varying — so a `Datetime` silently dropped its time
|
|
@@ -14,8 +15,8 @@
|
|
|
14
15
|
* registry routes the Frappe `Time` fieldtype to, so a
|
|
15
16
|
* `Date type="time"` and a `Time` field are one control
|
|
16
17
|
*
|
|
17
|
-
*
|
|
18
|
-
* calendar-then-wheel
|
|
18
|
+
* On native the same three pickers present the OS calendar, wheel, and
|
|
19
|
+
* calendar-then-wheel, and every branch serializes through the one shared
|
|
19
20
|
* `wire.ts` body, so a web pick and a native pick of the same moment persist
|
|
20
21
|
* byte-identical strings.
|
|
21
22
|
*/
|
|
@@ -50,8 +51,7 @@ function toPickerDate(value: string | undefined): Date | null {
|
|
|
50
51
|
/**
|
|
51
52
|
* `TimePicker` speaks `HH:mm`; Frappe stores `HH:mm:ss`. Round-tripping
|
|
52
53
|
* through the shared wire body — rather than padding the string here — is
|
|
53
|
-
* what keeps
|
|
54
|
-
* serializes its wheel pick through exactly this call.
|
|
54
|
+
* what keeps a picked time in Frappe's wire shape on every platform.
|
|
55
55
|
*/
|
|
56
56
|
function toTimeWireValue(picked: string): string {
|
|
57
57
|
if (!picked) return "";
|
|
@@ -130,7 +130,6 @@ export function Date<
|
|
|
130
130
|
// No `previousValue`: this picker owns both halves of the value and
|
|
131
131
|
// preserves an existing time across a day change itself, so carrying
|
|
132
132
|
// the old time part here would overwrite a time the user just set.
|
|
133
|
-
// The native half passes nothing for the same reason.
|
|
134
133
|
onChange={(date) => emit?.(date ? toFrappeDateValue(date, "datetime") : "")}
|
|
135
134
|
defaultValue={defaultValue as string}
|
|
136
135
|
label={fieldProps.label}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Frappe `Date` field has no native fork (FZ-8000, LC-175): iOS and
|
|
3
|
+
* Android resolve the same catalog field the web does, and forms'
|
|
4
|
+
* `DatePicker`, `DatetimePicker` and `TimePicker` open the OS sheet
|
|
5
|
+
* themselves (`OsDateTimeSheet`, with the catalog overlay when the optional
|
|
6
|
+
* `@react-native-community/datetimepicker` peer is absent, FZ-7357).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { describe, expect, it } from "vitest";
|
|
12
|
+
import * as catalog from "./catalog";
|
|
13
|
+
import * as entry from "./index";
|
|
14
|
+
|
|
15
|
+
const here = (file: string) => fileURLToPath(new URL(file, import.meta.url));
|
|
16
|
+
|
|
17
|
+
describe("native Date field", () => {
|
|
18
|
+
it("is not forked: no index.native.tsx sits beside the catalog field", () => {
|
|
19
|
+
expect(existsSync(here("./index.tsx"))).toBe(true);
|
|
20
|
+
expect(existsSync(here("./index.native.tsx"))).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("is the catalog field on every platform", () => {
|
|
24
|
+
expect(entry.Date).toBe(catalog.Date);
|
|
25
|
+
});
|
|
26
|
+
});
|