@multiplatform.one/frappe-ui 7.45.1 → 7.47.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 +1 -1
- package/dist/cjs/FileBrowser/index.native.js +1 -1
- package/dist/cjs/FileBrowser/index.native.js.map +1 -1
- package/dist/cjs/FrappeCalendar.cjs +2 -2
- package/dist/cjs/FrappeCalendar.native.js +2 -2
- package/dist/cjs/FrappeCalendar.native.js.map +1 -1
- package/dist/cjs/FrappeConnectionIndicator.cjs +2 -1
- package/dist/cjs/FrappeConnectionIndicator.native.js +2 -1
- package/dist/cjs/FrappeConnectionIndicator.native.js.map +1 -1
- package/dist/cjs/FrappeDashboard.cjs +1 -1
- package/dist/cjs/FrappeDashboard.native.js +1 -1
- package/dist/cjs/FrappeDashboard.native.js.map +1 -1
- package/dist/cjs/FrappeForm.cjs +54 -29
- package/dist/cjs/FrappeForm.native.js +56 -28
- package/dist/cjs/FrappeForm.native.js.map +1 -1
- package/dist/cjs/FrappeFormActions.cjs +121 -0
- package/dist/cjs/FrappeFormActions.native.js +123 -0
- package/dist/cjs/FrappeFormActions.native.js.map +1 -1
- package/dist/cjs/FrappeInsights.cjs +4 -1
- package/dist/cjs/FrappeInsights.native.js +4 -6
- package/dist/cjs/FrappeInsights.native.js.map +1 -1
- package/dist/cjs/FrappeKanban.cjs +1 -1
- package/dist/cjs/FrappeKanban.native.js +1 -1
- package/dist/cjs/FrappeKanban.native.js.map +1 -1
- package/dist/cjs/FrappeListView.cjs +1 -1
- package/dist/cjs/FrappeListView.native.js +4 -7
- package/dist/cjs/FrappeListView.native.js.map +1 -1
- package/dist/cjs/FrappeReconnectIndicator.cjs +2 -1
- package/dist/cjs/FrappeReconnectIndicator.native.js +2 -1
- package/dist/cjs/FrappeReconnectIndicator.native.js.map +1 -1
- package/dist/cjs/SyncErrorNotice.cjs +1 -1
- package/dist/cjs/SyncErrorNotice.native.js +1 -1
- package/dist/cjs/SyncErrorNotice.native.js.map +1 -1
- package/dist/cjs/desk/DeskFormPage.cjs +28 -42
- package/dist/cjs/desk/DeskFormPage.native.js +42 -58
- package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
- package/dist/cjs/desk/DeskShell.cjs +1 -1
- package/dist/cjs/desk/DeskShell.native.js +1 -1
- package/dist/cjs/desk/DeskShell.native.js.map +1 -1
- package/dist/cjs/desk/awesomebar.cjs +1 -1
- package/dist/cjs/desk/awesomebar.native.js +1 -1
- package/dist/cjs/desk/awesomebar.native.js.map +1 -1
- package/dist/cjs/fields/CodeEditor/index.cjs +1 -1
- package/dist/cjs/fields/CodeEditor/index.native.js +1 -1
- package/dist/cjs/fields/CodeEditor/index.native.js.map +1 -1
- package/dist/cjs/fields/Date/index.native.js +5 -4
- package/dist/cjs/fields/Date/index.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload.cjs +10 -8
- package/dist/cjs/fields/FileUpload.native.js +10 -8
- package/dist/cjs/fields/FileUpload.native.js.map +1 -1
- package/dist/cjs/fields/FileUploadField/index.cjs +50 -4
- package/dist/cjs/fields/FileUploadField/index.native.js +54 -5
- package/dist/cjs/fields/FileUploadField/index.native.js.map +1 -1
- package/dist/cjs/fields/Heading/index.cjs +1 -1
- package/dist/cjs/fields/Heading/index.native.js +1 -1
- package/dist/cjs/fields/Heading/index.native.js.map +1 -1
- package/dist/cjs/fields/MarkdownEditor/index.native.js +3 -2
- package/dist/cjs/fields/MarkdownEditor/index.native.js.map +1 -1
- package/dist/cjs/fields/Numeric/index.cjs +3 -2
- package/dist/cjs/fields/Numeric/index.native.js +3 -2
- package/dist/cjs/fields/Numeric/index.native.js.map +1 -1
- package/dist/cjs/fields/Password/index.cjs +18 -62
- package/dist/cjs/fields/Password/index.native.js +18 -65
- package/dist/cjs/fields/Password/index.native.js.map +1 -1
- package/dist/cjs/fields/ReadOnly/index.cjs +2 -1
- package/dist/cjs/fields/ReadOnly/index.native.js +2 -1
- package/dist/cjs/fields/ReadOnly/index.native.js.map +1 -1
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.native.js +2 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/insights/InsightsLeaders.cjs +2 -2
- package/dist/cjs/insights/InsightsLeaders.native.js +2 -2
- package/dist/cjs/insights/InsightsLeaders.native.js.map +1 -1
- package/dist/cjs/insights/InsightsRecords.cjs +2 -2
- package/dist/cjs/insights/InsightsRecords.native.js +2 -2
- package/dist/cjs/insights/InsightsRecords.native.js.map +1 -1
- package/dist/cjs/list/FacetBadge.cjs +4 -3
- package/dist/cjs/list/FacetBadge.native.js +4 -3
- package/dist/cjs/list/FacetBadge.native.js.map +1 -1
- package/dist/cjs/list/ImageWell.cjs +6 -18
- package/dist/cjs/list/ImageWell.native.js +7 -19
- package/dist/cjs/list/ImageWell.native.js.map +1 -1
- package/dist/cjs/list/RecordCard.cjs +2 -2
- package/dist/cjs/list/RecordCard.native.js +2 -2
- package/dist/cjs/list/RecordCard.native.js.map +1 -1
- package/dist/cjs/list/facetBadgeSteps.cjs +32 -0
- package/dist/cjs/list/facetBadgeSteps.native.js +35 -0
- package/dist/cjs/list/facetBadgeSteps.native.js.map +1 -0
- package/dist/cjs/record/RecordHero.cjs +4 -15
- package/dist/cjs/record/RecordHero.native.js +4 -15
- package/dist/cjs/record/RecordHero.native.js.map +1 -1
- package/dist/cjs/record/RecordPage.cjs +4 -4
- package/dist/cjs/record/RecordPage.native.js +7 -10
- package/dist/cjs/record/RecordPage.native.js.map +1 -1
- package/dist/cjs/report/ReportGrid.cjs +6 -6
- package/dist/cjs/report/ReportGrid.native.js +11 -7
- package/dist/cjs/report/ReportGrid.native.js.map +1 -1
- package/dist/cjs/schemaForm/index.cjs +3 -3
- package/dist/cjs/schemaForm/index.native.js +3 -3
- package/dist/cjs/schemaForm/index.native.js.map +1 -1
- package/dist/esm/FileBrowser/index.mjs +8 -8
- package/dist/esm/FileBrowser/index.mjs.map +1 -1
- package/dist/esm/FileBrowser/index.native.js +8 -8
- package/dist/esm/FileBrowser/index.native.js.map +1 -1
- package/dist/esm/FrappeCalendar.mjs +6 -6
- package/dist/esm/FrappeCalendar.mjs.map +1 -1
- package/dist/esm/FrappeCalendar.native.js +6 -6
- package/dist/esm/FrappeCalendar.native.js.map +1 -1
- package/dist/esm/FrappeConnectionIndicator.mjs +2 -1
- package/dist/esm/FrappeConnectionIndicator.mjs.map +1 -1
- package/dist/esm/FrappeConnectionIndicator.native.js +2 -1
- package/dist/esm/FrappeConnectionIndicator.native.js.map +1 -1
- package/dist/esm/FrappeDashboard.mjs +6 -6
- package/dist/esm/FrappeDashboard.mjs.map +1 -1
- package/dist/esm/FrappeDashboard.native.js +6 -6
- package/dist/esm/FrappeDashboard.native.js.map +1 -1
- package/dist/esm/FrappeForm.mjs +52 -27
- package/dist/esm/FrappeForm.mjs.map +1 -1
- package/dist/esm/FrappeForm.native.js +56 -28
- package/dist/esm/FrappeForm.native.js.map +1 -1
- package/dist/esm/FrappeFormActions.mjs +122 -2
- package/dist/esm/FrappeFormActions.mjs.map +1 -1
- package/dist/esm/FrappeFormActions.native.js +124 -2
- package/dist/esm/FrappeFormActions.native.js.map +1 -1
- package/dist/esm/FrappeInsights.mjs +4 -1
- package/dist/esm/FrappeInsights.mjs.map +1 -1
- package/dist/esm/FrappeInsights.native.js +4 -6
- package/dist/esm/FrappeInsights.native.js.map +1 -1
- package/dist/esm/FrappeKanban.mjs +5 -5
- package/dist/esm/FrappeKanban.mjs.map +1 -1
- package/dist/esm/FrappeKanban.native.js +5 -5
- package/dist/esm/FrappeKanban.native.js.map +1 -1
- package/dist/esm/FrappeListView.mjs +1 -1
- package/dist/esm/FrappeListView.mjs.map +1 -1
- package/dist/esm/FrappeListView.native.js +4 -7
- package/dist/esm/FrappeListView.native.js.map +1 -1
- package/dist/esm/FrappeReconnectIndicator.mjs +2 -1
- package/dist/esm/FrappeReconnectIndicator.mjs.map +1 -1
- package/dist/esm/FrappeReconnectIndicator.native.js +2 -1
- package/dist/esm/FrappeReconnectIndicator.native.js.map +1 -1
- package/dist/esm/SyncErrorNotice.mjs +2 -2
- package/dist/esm/SyncErrorNotice.mjs.map +1 -1
- package/dist/esm/SyncErrorNotice.native.js +2 -2
- package/dist/esm/SyncErrorNotice.native.js.map +1 -1
- package/dist/esm/desk/DeskFormPage.mjs +29 -43
- package/dist/esm/desk/DeskFormPage.mjs.map +1 -1
- package/dist/esm/desk/DeskFormPage.native.js +43 -59
- package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
- package/dist/esm/desk/DeskShell.mjs +1 -1
- package/dist/esm/desk/DeskShell.mjs.map +1 -1
- package/dist/esm/desk/DeskShell.native.js +1 -1
- package/dist/esm/desk/DeskShell.native.js.map +1 -1
- package/dist/esm/desk/awesomebar.mjs +1 -1
- package/dist/esm/desk/awesomebar.mjs.map +1 -1
- package/dist/esm/desk/awesomebar.native.js +1 -1
- package/dist/esm/desk/awesomebar.native.js.map +1 -1
- package/dist/esm/fields/CodeEditor/index.mjs +3 -3
- package/dist/esm/fields/CodeEditor/index.mjs.map +1 -1
- package/dist/esm/fields/CodeEditor/index.native.js +3 -3
- package/dist/esm/fields/CodeEditor/index.native.js.map +1 -1
- package/dist/esm/fields/Date/index.native.js +2 -1
- package/dist/esm/fields/Date/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload.mjs +5 -3
- package/dist/esm/fields/FileUpload.mjs.map +1 -1
- package/dist/esm/fields/FileUpload.native.js +5 -3
- package/dist/esm/fields/FileUpload.native.js.map +1 -1
- package/dist/esm/fields/FileUploadField/index.mjs +52 -6
- package/dist/esm/fields/FileUploadField/index.mjs.map +1 -1
- package/dist/esm/fields/FileUploadField/index.native.js +56 -7
- package/dist/esm/fields/FileUploadField/index.native.js.map +1 -1
- package/dist/esm/fields/Heading/index.mjs +3 -3
- package/dist/esm/fields/Heading/index.mjs.map +1 -1
- package/dist/esm/fields/Heading/index.native.js +3 -3
- package/dist/esm/fields/Heading/index.native.js.map +1 -1
- package/dist/esm/fields/MarkdownEditor/index.native.js +2 -1
- package/dist/esm/fields/MarkdownEditor/index.native.js.map +1 -1
- package/dist/esm/fields/Numeric/index.mjs +2 -1
- package/dist/esm/fields/Numeric/index.mjs.map +1 -1
- package/dist/esm/fields/Numeric/index.native.js +2 -1
- package/dist/esm/fields/Numeric/index.native.js.map +1 -1
- package/dist/esm/fields/Password/index.mjs +16 -60
- package/dist/esm/fields/Password/index.mjs.map +1 -1
- package/dist/esm/fields/Password/index.native.js +16 -63
- package/dist/esm/fields/Password/index.native.js.map +1 -1
- package/dist/esm/fields/ReadOnly/index.mjs +7 -6
- package/dist/esm/fields/ReadOnly/index.mjs.map +1 -1
- package/dist/esm/fields/ReadOnly/index.native.js +7 -6
- package/dist/esm/fields/ReadOnly/index.native.js.map +1 -1
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/insights/InsightsLeaders.mjs +2 -2
- package/dist/esm/insights/InsightsLeaders.mjs.map +1 -1
- package/dist/esm/insights/InsightsLeaders.native.js +2 -2
- package/dist/esm/insights/InsightsLeaders.native.js.map +1 -1
- package/dist/esm/insights/InsightsRecords.mjs +2 -2
- package/dist/esm/insights/InsightsRecords.mjs.map +1 -1
- package/dist/esm/insights/InsightsRecords.native.js +2 -2
- package/dist/esm/insights/InsightsRecords.native.js.map +1 -1
- package/dist/esm/list/FacetBadge.mjs +4 -3
- package/dist/esm/list/FacetBadge.mjs.map +1 -1
- package/dist/esm/list/FacetBadge.native.js +4 -3
- package/dist/esm/list/FacetBadge.native.js.map +1 -1
- package/dist/esm/list/ImageWell.mjs +8 -20
- package/dist/esm/list/ImageWell.mjs.map +1 -1
- package/dist/esm/list/ImageWell.native.js +9 -21
- package/dist/esm/list/ImageWell.native.js.map +1 -1
- package/dist/esm/list/RecordCard.mjs +2 -2
- package/dist/esm/list/RecordCard.mjs.map +1 -1
- package/dist/esm/list/RecordCard.native.js +2 -2
- package/dist/esm/list/RecordCard.native.js.map +1 -1
- package/dist/esm/list/facetBadgeSteps.mjs +7 -0
- package/dist/esm/list/facetBadgeSteps.mjs.map +1 -0
- package/dist/esm/list/facetBadgeSteps.native.js +7 -0
- package/dist/esm/list/facetBadgeSteps.native.js.map +1 -0
- package/dist/esm/record/RecordHero.mjs +4 -15
- package/dist/esm/record/RecordHero.mjs.map +1 -1
- package/dist/esm/record/RecordHero.native.js +4 -15
- package/dist/esm/record/RecordHero.native.js.map +1 -1
- package/dist/esm/record/RecordPage.mjs +4 -4
- package/dist/esm/record/RecordPage.mjs.map +1 -1
- package/dist/esm/record/RecordPage.native.js +7 -10
- package/dist/esm/record/RecordPage.native.js.map +1 -1
- package/dist/esm/report/ReportGrid.mjs +7 -7
- package/dist/esm/report/ReportGrid.mjs.map +1 -1
- package/dist/esm/report/ReportGrid.native.js +12 -8
- package/dist/esm/report/ReportGrid.native.js.map +1 -1
- package/dist/esm/schemaForm/index.mjs +4 -4
- package/dist/esm/schemaForm/index.mjs.map +1 -1
- package/dist/esm/schemaForm/index.native.js +4 -4
- package/dist/esm/schemaForm/index.native.js.map +1 -1
- package/dist/jsx/FileBrowser/index.mjs +8 -8
- package/dist/jsx/FileBrowser/index.mjs.map +1 -1
- package/dist/jsx/FileBrowser/index.native.js +1 -1
- package/dist/jsx/FileBrowser/index.native.js.map +1 -1
- package/dist/jsx/FrappeCalendar.mjs +6 -6
- package/dist/jsx/FrappeCalendar.mjs.map +1 -1
- package/dist/jsx/FrappeCalendar.native.js +2 -2
- package/dist/jsx/FrappeCalendar.native.js.map +1 -1
- package/dist/jsx/FrappeConnectionIndicator.mjs +2 -1
- package/dist/jsx/FrappeConnectionIndicator.mjs.map +1 -1
- package/dist/jsx/FrappeConnectionIndicator.native.js +2 -1
- package/dist/jsx/FrappeConnectionIndicator.native.js.map +1 -1
- package/dist/jsx/FrappeDashboard.mjs +6 -6
- package/dist/jsx/FrappeDashboard.mjs.map +1 -1
- package/dist/jsx/FrappeDashboard.native.js +1 -1
- package/dist/jsx/FrappeDashboard.native.js.map +1 -1
- package/dist/jsx/FrappeForm.mjs +52 -27
- package/dist/jsx/FrappeForm.mjs.map +1 -1
- package/dist/jsx/FrappeForm.native.js +56 -28
- package/dist/jsx/FrappeForm.native.js.map +1 -1
- package/dist/jsx/FrappeFormActions.mjs +122 -2
- package/dist/jsx/FrappeFormActions.mjs.map +1 -1
- package/dist/jsx/FrappeFormActions.native.js +123 -0
- package/dist/jsx/FrappeFormActions.native.js.map +1 -1
- package/dist/jsx/FrappeInsights.mjs +4 -1
- package/dist/jsx/FrappeInsights.mjs.map +1 -1
- package/dist/jsx/FrappeInsights.native.js +4 -6
- package/dist/jsx/FrappeInsights.native.js.map +1 -1
- package/dist/jsx/FrappeKanban.mjs +5 -5
- package/dist/jsx/FrappeKanban.mjs.map +1 -1
- package/dist/jsx/FrappeKanban.native.js +1 -1
- package/dist/jsx/FrappeKanban.native.js.map +1 -1
- package/dist/jsx/FrappeListView.mjs +1 -1
- package/dist/jsx/FrappeListView.mjs.map +1 -1
- package/dist/jsx/FrappeListView.native.js +4 -7
- package/dist/jsx/FrappeListView.native.js.map +1 -1
- package/dist/jsx/FrappeReconnectIndicator.mjs +2 -1
- package/dist/jsx/FrappeReconnectIndicator.mjs.map +1 -1
- package/dist/jsx/FrappeReconnectIndicator.native.js +2 -1
- package/dist/jsx/FrappeReconnectIndicator.native.js.map +1 -1
- package/dist/jsx/SyncErrorNotice.mjs +2 -2
- package/dist/jsx/SyncErrorNotice.mjs.map +1 -1
- package/dist/jsx/SyncErrorNotice.native.js +1 -1
- package/dist/jsx/SyncErrorNotice.native.js.map +1 -1
- package/dist/jsx/desk/DeskFormPage.mjs +29 -43
- package/dist/jsx/desk/DeskFormPage.mjs.map +1 -1
- package/dist/jsx/desk/DeskFormPage.native.js +42 -58
- package/dist/jsx/desk/DeskFormPage.native.js.map +1 -1
- package/dist/jsx/desk/DeskShell.mjs +1 -1
- package/dist/jsx/desk/DeskShell.mjs.map +1 -1
- package/dist/jsx/desk/DeskShell.native.js +1 -1
- package/dist/jsx/desk/DeskShell.native.js.map +1 -1
- package/dist/jsx/desk/awesomebar.mjs +1 -1
- package/dist/jsx/desk/awesomebar.mjs.map +1 -1
- package/dist/jsx/desk/awesomebar.native.js +1 -1
- package/dist/jsx/desk/awesomebar.native.js.map +1 -1
- package/dist/jsx/fields/CodeEditor/index.mjs +3 -3
- package/dist/jsx/fields/CodeEditor/index.mjs.map +1 -1
- package/dist/jsx/fields/CodeEditor/index.native.js +1 -1
- package/dist/jsx/fields/CodeEditor/index.native.js.map +1 -1
- package/dist/jsx/fields/Date/index.native.js +5 -4
- package/dist/jsx/fields/Date/index.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload.mjs +5 -3
- package/dist/jsx/fields/FileUpload.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload.native.js +10 -8
- package/dist/jsx/fields/FileUpload.native.js.map +1 -1
- package/dist/jsx/fields/FileUploadField/index.mjs +52 -6
- package/dist/jsx/fields/FileUploadField/index.mjs.map +1 -1
- package/dist/jsx/fields/FileUploadField/index.native.js +54 -5
- package/dist/jsx/fields/FileUploadField/index.native.js.map +1 -1
- package/dist/jsx/fields/Heading/index.mjs +3 -3
- package/dist/jsx/fields/Heading/index.mjs.map +1 -1
- package/dist/jsx/fields/Heading/index.native.js +1 -1
- package/dist/jsx/fields/Heading/index.native.js.map +1 -1
- package/dist/jsx/fields/MarkdownEditor/index.native.js +3 -2
- package/dist/jsx/fields/MarkdownEditor/index.native.js.map +1 -1
- package/dist/jsx/fields/Numeric/index.mjs +2 -1
- package/dist/jsx/fields/Numeric/index.mjs.map +1 -1
- package/dist/jsx/fields/Numeric/index.native.js +3 -2
- package/dist/jsx/fields/Numeric/index.native.js.map +1 -1
- package/dist/jsx/fields/Password/index.mjs +16 -60
- package/dist/jsx/fields/Password/index.mjs.map +1 -1
- package/dist/jsx/fields/Password/index.native.js +18 -65
- package/dist/jsx/fields/Password/index.native.js.map +1 -1
- package/dist/jsx/fields/ReadOnly/index.mjs +7 -6
- package/dist/jsx/fields/ReadOnly/index.mjs.map +1 -1
- package/dist/jsx/fields/ReadOnly/index.native.js +2 -1
- package/dist/jsx/fields/ReadOnly/index.native.js.map +1 -1
- package/dist/jsx/index.js +2 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +2 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +2 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/insights/InsightsLeaders.mjs +2 -2
- package/dist/jsx/insights/InsightsLeaders.mjs.map +1 -1
- package/dist/jsx/insights/InsightsLeaders.native.js +2 -2
- package/dist/jsx/insights/InsightsLeaders.native.js.map +1 -1
- package/dist/jsx/insights/InsightsRecords.mjs +2 -2
- package/dist/jsx/insights/InsightsRecords.mjs.map +1 -1
- package/dist/jsx/insights/InsightsRecords.native.js +2 -2
- package/dist/jsx/insights/InsightsRecords.native.js.map +1 -1
- package/dist/jsx/list/FacetBadge.mjs +4 -3
- package/dist/jsx/list/FacetBadge.mjs.map +1 -1
- package/dist/jsx/list/FacetBadge.native.js +4 -3
- package/dist/jsx/list/FacetBadge.native.js.map +1 -1
- package/dist/jsx/list/ImageWell.mjs +8 -20
- package/dist/jsx/list/ImageWell.mjs.map +1 -1
- package/dist/jsx/list/ImageWell.native.js +7 -19
- package/dist/jsx/list/ImageWell.native.js.map +1 -1
- package/dist/jsx/list/RecordCard.mjs +2 -2
- package/dist/jsx/list/RecordCard.mjs.map +1 -1
- package/dist/jsx/list/RecordCard.native.js +2 -2
- package/dist/jsx/list/RecordCard.native.js.map +1 -1
- package/dist/jsx/list/facetBadgeSteps.mjs +7 -0
- package/dist/jsx/list/facetBadgeSteps.mjs.map +1 -0
- package/dist/jsx/list/facetBadgeSteps.native.js +35 -0
- package/dist/jsx/list/facetBadgeSteps.native.js.map +1 -0
- package/dist/jsx/record/RecordHero.mjs +4 -15
- package/dist/jsx/record/RecordHero.mjs.map +1 -1
- package/dist/jsx/record/RecordHero.native.js +4 -15
- package/dist/jsx/record/RecordHero.native.js.map +1 -1
- package/dist/jsx/record/RecordPage.mjs +4 -4
- package/dist/jsx/record/RecordPage.mjs.map +1 -1
- package/dist/jsx/record/RecordPage.native.js +7 -10
- package/dist/jsx/record/RecordPage.native.js.map +1 -1
- package/dist/jsx/report/ReportGrid.mjs +7 -7
- package/dist/jsx/report/ReportGrid.mjs.map +1 -1
- package/dist/jsx/report/ReportGrid.native.js +11 -7
- package/dist/jsx/report/ReportGrid.native.js.map +1 -1
- package/dist/jsx/schemaForm/index.mjs +4 -4
- package/dist/jsx/schemaForm/index.mjs.map +1 -1
- package/dist/jsx/schemaForm/index.native.js +3 -3
- package/dist/jsx/schemaForm/index.native.js.map +1 -1
- package/package.json +16 -16
- package/src/FileBrowser/index.tsx +14 -13
- package/src/FormSidebar.stories.tsx +2 -1
- package/src/FrappeCalendar.stories.tsx +1 -1
- package/src/FrappeCalendar.tsx +10 -9
- package/src/FrappeConnectionIndicator.stories.tsx +2 -1
- package/src/FrappeConnectionIndicator.tsx +2 -1
- package/src/FrappeDashboard.stories.tsx +2 -2
- package/src/FrappeDashboard.tsx +10 -10
- package/src/FrappeForm.lifecycle.spec.tsx +3 -1
- package/src/FrappeForm.tsx +106 -38
- package/src/FrappeFormActions.tsx +160 -1
- package/src/FrappeInsights.spec.tsx +1 -1
- package/src/FrappeInsights.tsx +4 -1
- package/src/FrappeKanban.stories.tsx +2 -1
- package/src/FrappeKanban.tsx +8 -7
- package/src/FrappeList.stories.tsx +11 -10
- package/src/FrappeListView.card.spec.tsx +1 -1
- package/src/FrappeListView.sidebar.spec.tsx +1 -1
- package/src/FrappeListView.tsx +1 -1
- package/src/FrappeProvider.stories.tsx +2 -1
- package/src/FrappeReconnectIndicator.stories.tsx +2 -1
- package/src/FrappeReconnectIndicator.tsx +2 -1
- package/src/SyncErrorNotice.tsx +2 -2
- package/src/desk/DeskFormPage.tsx +42 -62
- package/src/desk/DeskFormSidebar.stories.tsx +4 -2
- package/src/desk/DeskShell.tsx +1 -1
- package/src/desk/awesomebar.tsx +1 -1
- package/src/fields/CodeEditor/index.tsx +4 -4
- package/src/fields/Date/index.native.tsx +2 -1
- package/src/fields/FileUpload.tsx +8 -4
- package/src/fields/FileUploadField/FileUploadField.spec.tsx +86 -1
- package/src/fields/FileUploadField/FileUploadField.stories.tsx +9 -0
- package/src/fields/FileUploadField/index.tsx +67 -6
- package/src/fields/Heading/index.tsx +4 -4
- package/src/fields/MarkdownEditor/index.native.tsx +2 -1
- package/src/fields/Numeric/index.tsx +2 -1
- package/src/fields/Password/index.tsx +14 -70
- package/src/fields/ReadOnly/index.tsx +12 -11
- package/src/fields/TextEditor/TextEditor.stories.tsx +2 -1
- package/src/frappeRemainder.designLaw.spec.ts +3 -2
- package/src/frappeRoutes.spec.tsx +20 -6
- package/src/index.ts +7 -1
- package/src/insights/InsightsLeaders.tsx +2 -2
- package/src/insights/InsightsRecords.tsx +2 -2
- package/src/insights/insightsRecord.ts +2 -2
- package/src/list/FacetBadge.tsx +5 -4
- package/src/list/ImageWell.spec.tsx +47 -0
- package/src/list/ImageWell.tsx +8 -21
- package/src/list/RecordCard.native.tsx +2 -2
- package/src/list/RecordCard.spec.tsx +1 -1
- package/src/list/RecordCard.tsx +4 -4
- package/src/list/facetBadgeSteps.ts +2 -0
- package/src/record/RecordHero.tsx +4 -11
- package/src/record/RecordPage.tsx +4 -4
- package/src/report/ReportGrid.native.spec.tsx +152 -0
- package/src/report/ReportGrid.tsx +20 -9
- package/src/schemaForm/SchemaForm.stories.tsx +2 -1
- package/src/schemaForm/index.tsx +6 -6
- package/types/FileBrowser/index.d.ts.map +1 -1
- package/types/FrappeCalendar.d.ts.map +1 -1
- package/types/FrappeConnectionIndicator.d.ts.map +1 -1
- package/types/FrappeDashboard.d.ts.map +1 -1
- package/types/FrappeForm.d.ts +19 -0
- package/types/FrappeForm.d.ts.map +1 -1
- package/types/FrappeFormActions.d.ts +7 -0
- package/types/FrappeFormActions.d.ts.map +1 -1
- package/types/FrappeInsights.d.ts.map +1 -1
- package/types/FrappeKanban.d.ts.map +1 -1
- package/types/FrappeReconnectIndicator.d.ts.map +1 -1
- package/types/desk/DeskFormPage.d.ts +6 -6
- package/types/desk/DeskFormPage.d.ts.map +1 -1
- package/types/fields/Date/index.native.d.ts.map +1 -1
- package/types/fields/FileUpload.d.ts.map +1 -1
- package/types/fields/FileUploadField/index.d.ts.map +1 -1
- package/types/fields/MarkdownEditor/index.native.d.ts.map +1 -1
- package/types/fields/Numeric/index.d.ts.map +1 -1
- package/types/fields/Password/index.d.ts +13 -0
- package/types/fields/Password/index.d.ts.map +1 -1
- package/types/fields/ReadOnly/index.d.ts.map +1 -1
- package/types/index.d.ts +2 -1
- package/types/index.d.ts.map +1 -1
- package/types/insights/insightsRecord.d.ts +2 -2
- package/types/insights/insightsRecord.d.ts.map +1 -1
- package/types/list/FacetBadge.d.ts +1 -1
- package/types/list/FacetBadge.d.ts.map +1 -1
- package/types/list/ImageWell.d.ts +5 -4
- package/types/list/ImageWell.d.ts.map +1 -1
- package/types/list/RecordCard.d.ts +3 -3
- package/types/list/RecordCard.d.ts.map +1 -1
- package/types/list/RecordCard.native.d.ts +1 -1
- package/types/list/RecordCard.native.d.ts.map +1 -1
- package/types/list/facetBadgeSteps.d.ts +7 -0
- package/types/list/facetBadgeSteps.d.ts.map +1 -0
- package/types/record/RecordHero.d.ts +3 -3
- package/types/record/RecordHero.d.ts.map +1 -1
- package/types/report/ReportGrid.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplatform.one/frappe-ui",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.47.0",
|
|
4
4
|
"description": "Pre-wired Tamagui components for Frappe doctypes with live data",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cross-platform",
|
|
@@ -72,18 +72,18 @@
|
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@multiplatform.one/components": "^7.
|
|
76
|
-
"@multiplatform.one/desktop": "^7.
|
|
77
|
-
"@multiplatform.one/forms": "^7.
|
|
78
|
-
"@multiplatform.one/frappe": "^7.
|
|
79
|
-
"@multiplatform.one/i18n": "^7.
|
|
80
|
-
"@multiplatform.one/markdown": "^7.
|
|
81
|
-
"@multiplatform.one/platform": "^7.
|
|
82
|
-
"@multiplatform.one/rich-text": "^7.
|
|
83
|
-
"@multiplatform.one/router": "^7.
|
|
84
|
-
"@multiplatform.one/store": "^7.
|
|
85
|
-
"@multiplatform.one/table": "^7.
|
|
86
|
-
"@multiplatform.one/theme": "^7.
|
|
75
|
+
"@multiplatform.one/components": "^7.47.0",
|
|
76
|
+
"@multiplatform.one/desktop": "^7.47.0",
|
|
77
|
+
"@multiplatform.one/forms": "^7.47.0",
|
|
78
|
+
"@multiplatform.one/frappe": "^7.47.0",
|
|
79
|
+
"@multiplatform.one/i18n": "^7.47.0",
|
|
80
|
+
"@multiplatform.one/markdown": "^7.47.0",
|
|
81
|
+
"@multiplatform.one/platform": "^7.47.0",
|
|
82
|
+
"@multiplatform.one/rich-text": "^7.47.0",
|
|
83
|
+
"@multiplatform.one/router": "^7.47.0",
|
|
84
|
+
"@multiplatform.one/store": "^7.47.0",
|
|
85
|
+
"@multiplatform.one/table": "^7.47.0",
|
|
86
|
+
"@multiplatform.one/theme": "^7.47.0",
|
|
87
87
|
"@phosphor-icons/react": "^2.1.10",
|
|
88
88
|
"@tamagui/colors": "2.7.6",
|
|
89
89
|
"@tanstack/db": "0.8.0",
|
|
@@ -100,9 +100,9 @@
|
|
|
100
100
|
"tamagui": "2.7.6"
|
|
101
101
|
},
|
|
102
102
|
"devDependencies": {
|
|
103
|
-
"@multiplatform.one/config": "7.
|
|
104
|
-
"@multiplatform.one/storybook": "7.
|
|
105
|
-
"@multiplatform.one/test-utils": "7.
|
|
103
|
+
"@multiplatform.one/config": "7.47.0",
|
|
104
|
+
"@multiplatform.one/storybook": "7.47.0",
|
|
105
|
+
"@multiplatform.one/test-utils": "7.47.0",
|
|
106
106
|
"@tamagui/build": "2.7.6",
|
|
107
107
|
"@testing-library/jest-dom": "^7.0.1",
|
|
108
108
|
"@testing-library/react": "^16.3.3",
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
TreeView,
|
|
8
8
|
ViewSwitcher,
|
|
9
9
|
type TreeNode,
|
|
10
|
+
Text,
|
|
10
11
|
} from "@multiplatform.one/components";
|
|
11
12
|
import { Button, Checkbox, FileUpload, Input } from "@multiplatform.one/forms";
|
|
12
13
|
import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
|
|
@@ -34,7 +35,7 @@ import {
|
|
|
34
35
|
} from "@phosphor-icons/react";
|
|
35
36
|
import { useCallback, useMemo, useState, type ReactNode } from "react";
|
|
36
37
|
import { useTranslation } from "react-i18next";
|
|
37
|
-
import { Text, XStack, YStack, useWindowDimensions } from "tamagui";
|
|
38
|
+
import { Text as TamaguiText, XStack, YStack, useWindowDimensions } from "tamagui";
|
|
38
39
|
import {
|
|
39
40
|
ancestorFolderIds,
|
|
40
41
|
breadcrumbItems,
|
|
@@ -366,14 +367,14 @@ export function FileBrowser({
|
|
|
366
367
|
return (
|
|
367
368
|
<XStack alignItems="center" gap="$2" minWidth={0} flex={1}>
|
|
368
369
|
<KindIcon kind={fileKind(file)} />
|
|
369
|
-
<
|
|
370
|
+
<TamaguiText
|
|
370
371
|
fontSize="$3"
|
|
371
372
|
flex={1}
|
|
372
373
|
minWidth={0}
|
|
373
374
|
{...({ numberOfLines: 1, title: file.file_name } as Record<string, unknown>)}
|
|
374
375
|
>
|
|
375
376
|
{file.file_name}
|
|
376
|
-
</
|
|
377
|
+
</TamaguiText>
|
|
377
378
|
{single && current ? (
|
|
378
379
|
<CheckIcon size={14} data-filebrowser-current-check aria-hidden />
|
|
379
380
|
) : null}
|
|
@@ -389,9 +390,9 @@ export function FileBrowser({
|
|
|
389
390
|
accessorKey: "file_size",
|
|
390
391
|
header: t("Size"),
|
|
391
392
|
cell: ({ row }) => (
|
|
392
|
-
<
|
|
393
|
+
<TamaguiText fontSize="$3" fontFamily="$mono">
|
|
393
394
|
{isFolder(row.original) ? "—" : formatSize(row.original.file_size)}
|
|
394
|
-
</
|
|
395
|
+
</TamaguiText>
|
|
395
396
|
),
|
|
396
397
|
},
|
|
397
398
|
...(single
|
|
@@ -540,20 +541,20 @@ export function FileBrowser({
|
|
|
540
541
|
</YStack>
|
|
541
542
|
</YStack>
|
|
542
543
|
<XStack alignItems="center" gap="$2">
|
|
543
|
-
<
|
|
544
|
+
<TamaguiText
|
|
544
545
|
fontSize="$3"
|
|
545
546
|
flex={1}
|
|
546
547
|
{...({ numberOfLines: 1, title: file.file_name } as Record<string, unknown>)}
|
|
547
548
|
>
|
|
548
549
|
{file.file_name}
|
|
549
|
-
</
|
|
550
|
+
</TamaguiText>
|
|
550
551
|
{single && current ? (
|
|
551
552
|
<CheckIcon size={14} data-filebrowser-current-check aria-hidden />
|
|
552
553
|
) : null}
|
|
553
554
|
</XStack>
|
|
554
|
-
<
|
|
555
|
+
<TamaguiText fontSize="$2" fontFamily="$mono" color="$color10">
|
|
555
556
|
{isFolder(file) ? "—" : formatSize(file.file_size)}
|
|
556
|
-
</
|
|
557
|
+
</TamaguiText>
|
|
557
558
|
</YStack>
|
|
558
559
|
);
|
|
559
560
|
};
|
|
@@ -587,18 +588,18 @@ export function FileBrowser({
|
|
|
587
588
|
renderItem={(file) => (
|
|
588
589
|
<XStack alignItems="center" gap="$3" flex={1} minWidth={0} width="100%">
|
|
589
590
|
<KindIcon kind={fileKind(file)} />
|
|
590
|
-
<
|
|
591
|
+
<TamaguiText
|
|
591
592
|
fontSize="$3"
|
|
592
593
|
flex={1}
|
|
593
594
|
minWidth={0}
|
|
594
595
|
{...({ numberOfLines: 1, title: file.file_name } as Record<string, unknown>)}
|
|
595
596
|
>
|
|
596
597
|
{file.file_name}
|
|
597
|
-
</
|
|
598
|
+
</TamaguiText>
|
|
598
599
|
{isFolder(file) ? null : (
|
|
599
|
-
<
|
|
600
|
+
<TamaguiText fontSize="$2" fontFamily="$mono" color="$color10">
|
|
600
601
|
{formatSize(file.file_size)}
|
|
601
|
-
</
|
|
602
|
+
</TamaguiText>
|
|
602
603
|
)}
|
|
603
604
|
</XStack>
|
|
604
605
|
)}
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
Tags,
|
|
4
4
|
type AttachmentItem,
|
|
5
5
|
type TagItem,
|
|
6
|
+
Text,
|
|
6
7
|
} from "@multiplatform.one/components";
|
|
7
8
|
import { action } from "@multiplatform.one/storybook";
|
|
8
9
|
import {
|
|
@@ -18,7 +19,7 @@ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
|
18
19
|
import React from "react";
|
|
19
20
|
// Catalog Button (LC-56 story honesty): stories compose catalog controls, never raw tamagui ones.
|
|
20
21
|
import { Button, Switch } from "@multiplatform.one/forms";
|
|
21
|
-
import {
|
|
22
|
+
import { XStack, YStack } from "tamagui";
|
|
22
23
|
import {
|
|
23
24
|
FormSidebar,
|
|
24
25
|
type SidebarMetadataEntry,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
2
2
|
import { action } from "@multiplatform.one/storybook";
|
|
3
3
|
import { resolveChartPalette } from "@multiplatform.one/theme";
|
|
4
|
-
import { Text } from "tamagui";
|
|
5
4
|
import { FrappeCalendar } from "./FrappeCalendar";
|
|
6
5
|
import { FrappeProvider } from "./FrappeProvider";
|
|
7
6
|
import { FrappeStoryProvider } from "./frappeStoryTarget";
|
|
7
|
+
import { Text } from "@multiplatform.one/components";
|
|
8
8
|
|
|
9
9
|
// hex-escape: Frappe sends column, event and series colours as hex: fixture data, not paint
|
|
10
10
|
|
package/src/FrappeCalendar.tsx
CHANGED
|
@@ -3,10 +3,11 @@ import {
|
|
|
3
3
|
eventChipTextColor,
|
|
4
4
|
type CalendarEvent,
|
|
5
5
|
type CalendarEventMoveRange,
|
|
6
|
+
Text,
|
|
6
7
|
} from "@multiplatform.one/components";
|
|
7
8
|
import { Spinner, formCommonColors } from "@multiplatform.one/forms";
|
|
8
9
|
import React, { useMemo, useCallback, useState, type ReactNode } from "react";
|
|
9
|
-
import { Text, YStack, type YStackProps } from "tamagui";
|
|
10
|
+
import { Text as TamaguiText, YStack, type YStackProps } from "tamagui";
|
|
10
11
|
import { useTranslation } from "react-i18next";
|
|
11
12
|
import {
|
|
12
13
|
formatCalendarDate,
|
|
@@ -221,13 +222,13 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
|
|
|
221
222
|
// was invisible on light fills and failed AA on mid-tone doc colors.
|
|
222
223
|
const defaultEventContent = useCallback(
|
|
223
224
|
(calEvent: CalendarEvent): ReactNode => (
|
|
224
|
-
<
|
|
225
|
+
<TamaguiText
|
|
225
226
|
numberOfLines={2}
|
|
226
227
|
color={eventChipTextColor(calEvent.color, onIdentity)}
|
|
227
228
|
{...knobProps.label}
|
|
228
229
|
>
|
|
229
230
|
{calEvent.title}
|
|
230
|
-
</
|
|
231
|
+
</TamaguiText>
|
|
231
232
|
),
|
|
232
233
|
[knobProps.label, onIdentity],
|
|
233
234
|
);
|
|
@@ -282,9 +283,9 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
|
|
|
282
283
|
return (
|
|
283
284
|
<YStack {...knobProps.panelPadding} alignItems="center" gap="$2" {...stackProps}>
|
|
284
285
|
<Spinner size="large" />
|
|
285
|
-
<
|
|
286
|
+
<TamaguiText color={formCommonColors.muted} {...knobProps.body}>
|
|
286
287
|
{t("Loading {{doctype}}...", { doctype })}
|
|
287
|
-
</
|
|
288
|
+
</TamaguiText>
|
|
288
289
|
</YStack>
|
|
289
290
|
);
|
|
290
291
|
}
|
|
@@ -294,9 +295,9 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
|
|
|
294
295
|
return (
|
|
295
296
|
<YStack {...knobProps.panelPadding} alignItems="center" {...stackProps} {...knobProps.gap}>
|
|
296
297
|
<Text color={formCommonColors.error}>{t("Error loading {{doctype}}", { doctype })}</Text>
|
|
297
|
-
<
|
|
298
|
+
<TamaguiText color={formCommonColors.muted} {...knobProps.body}>
|
|
298
299
|
{queryError.message}
|
|
299
|
-
</
|
|
300
|
+
</TamaguiText>
|
|
300
301
|
</YStack>
|
|
301
302
|
);
|
|
302
303
|
}
|
|
@@ -313,9 +314,9 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
|
|
|
313
314
|
borderWidth={1}
|
|
314
315
|
>
|
|
315
316
|
<Text color={formCommonColors.error}>{t("Action failed")}</Text>
|
|
316
|
-
<
|
|
317
|
+
<TamaguiText color={formCommonColors.muted} {...knobProps.body}>
|
|
317
318
|
{actionError.message}
|
|
318
|
-
</
|
|
319
|
+
</TamaguiText>
|
|
319
320
|
</YStack>
|
|
320
321
|
)}
|
|
321
322
|
<Calendar
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { YStack } from "tamagui";
|
|
2
2
|
import {
|
|
3
3
|
FrappeConnectionIndicator,
|
|
4
4
|
type FrappeConnectionIndicatorProps,
|
|
5
5
|
} from "./FrappeConnectionIndicator";
|
|
6
|
+
import { Text } from "@multiplatform.one/components";
|
|
6
7
|
|
|
7
8
|
export default {
|
|
8
9
|
title: "FrappeUI/FrappeConnectionIndicator",
|
|
@@ -6,7 +6,8 @@ import {
|
|
|
6
6
|
import { radiusClassProps, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
7
7
|
import React from "react";
|
|
8
8
|
import { useTranslation } from "react-i18next";
|
|
9
|
-
import {
|
|
9
|
+
import { XStack, YStack } from "tamagui";
|
|
10
|
+
import { Text } from "@multiplatform.one/components";
|
|
10
11
|
|
|
11
12
|
export interface FrappeConnectionIndicatorProps {
|
|
12
13
|
/** The same connection config the sibling collection hooks use. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
2
|
-
import { KPICard, ChartCard, type DashboardWidget } from "@multiplatform.one/components";
|
|
3
|
-
import {
|
|
2
|
+
import { KPICard, ChartCard, type DashboardWidget, Text } from "@multiplatform.one/components";
|
|
3
|
+
import { YStack } from "tamagui";
|
|
4
4
|
import { FrappeDashboard } from "./FrappeDashboard";
|
|
5
5
|
import { FrappeProvider } from "./FrappeProvider";
|
|
6
6
|
import { FrappeStoryProvider } from "./frappeStoryTarget";
|
package/src/FrappeDashboard.tsx
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useFrappeDoctypeEvents } from "@multiplatform.one/frappe";
|
|
2
|
-
import { Dashboard, type DashboardWidget } from "@multiplatform.one/components";
|
|
2
|
+
import { Dashboard, type DashboardWidget, Text } from "@multiplatform.one/components";
|
|
3
3
|
import { Button, Spinner, formCommonColors } from "@multiplatform.one/forms";
|
|
4
4
|
import { ArrowsClockwiseIcon } from "@phosphor-icons/react";
|
|
5
5
|
import React, { useMemo, useCallback, useState, useEffect, useRef } from "react";
|
|
6
6
|
import { useTranslation } from "react-i18next";
|
|
7
|
-
import { Text, XStack, YStack, type YStackProps, H3 } from "tamagui";
|
|
7
|
+
import { Text as TamaguiText, XStack, YStack, type YStackProps, H3 } from "tamagui";
|
|
8
8
|
import { formatTimeOfDay, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
9
9
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
10
10
|
import { useFrappeRows } from "./useFrappeRows";
|
|
@@ -160,9 +160,9 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
|
|
|
160
160
|
return (
|
|
161
161
|
<YStack {...knobProps.panelPadding} alignItems="center" gap="$2" {...stackProps}>
|
|
162
162
|
<Spinner size="large" />
|
|
163
|
-
<
|
|
163
|
+
<TamaguiText color={knobProps.textAccentColor} {...knobProps.body}>
|
|
164
164
|
{t("Loading dashboard...")}
|
|
165
|
-
</
|
|
165
|
+
</TamaguiText>
|
|
166
166
|
</YStack>
|
|
167
167
|
);
|
|
168
168
|
}
|
|
@@ -173,9 +173,9 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
|
|
|
173
173
|
return (
|
|
174
174
|
<YStack {...knobProps.panelPadding} alignItems="center" {...stackProps} {...knobProps.gap}>
|
|
175
175
|
<Text color={formCommonColors.error}>{t("Failed to load dashboard")}</Text>
|
|
176
|
-
<
|
|
176
|
+
<TamaguiText color={knobProps.textAccentColor} {...knobProps.body}>
|
|
177
177
|
{err.message}
|
|
178
|
-
</
|
|
178
|
+
</TamaguiText>
|
|
179
179
|
</YStack>
|
|
180
180
|
);
|
|
181
181
|
}
|
|
@@ -193,11 +193,11 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
|
|
|
193
193
|
{showRefresh && (
|
|
194
194
|
<XStack {...knobProps.gap} alignItems="center">
|
|
195
195
|
{isLiveStale && <Spinner size="small" aria-label={t("Updating")} />}
|
|
196
|
-
<
|
|
196
|
+
<TamaguiText color={knobProps.textAccentColor} {...knobProps.label}>
|
|
197
197
|
{t("Last updated: {{time}}", {
|
|
198
198
|
time: formatTimeOfDay(dataUpdatedAt ?? lastRefresh),
|
|
199
199
|
})}
|
|
200
|
-
</
|
|
200
|
+
</TamaguiText>
|
|
201
201
|
{/* LC-54 (amendment 2026-08-13): house Button, own-box floor —
|
|
202
202
|
the raw tamagui Button + grown transparent target painted
|
|
203
203
|
its hover fill across the escaped 44px floor. `circular`
|
|
@@ -321,9 +321,9 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
|
|
|
321
321
|
{title ? <H3 {...knobProps.heading}>{title}</H3> : <YStack flex={1} />}
|
|
322
322
|
<XStack {...knobProps.gap} alignItems="center">
|
|
323
323
|
{autoRefresh && (
|
|
324
|
-
<
|
|
324
|
+
<TamaguiText color={knobProps.textAccentColor} {...knobProps.label}>
|
|
325
325
|
{t("Last updated: {{time}}", { time: formatTimeOfDay(lastRefresh) })}
|
|
326
|
-
</
|
|
326
|
+
</TamaguiText>
|
|
327
327
|
)}
|
|
328
328
|
{/* LC-54: house Button, own-box floor (see the live-path refresh). */}
|
|
329
329
|
<Button
|
|
@@ -376,7 +376,9 @@ describe("a submittable doctype's routed pages", () => {
|
|
|
376
376
|
expect(screen.getByText("Submit")).toBeTruthy();
|
|
377
377
|
expect(screen.queryByText("Save")).toBeNull();
|
|
378
378
|
|
|
379
|
-
|
|
379
|
+
// LC-145: Submit is the bar's one action, so Edit rides the "…" menu.
|
|
380
|
+
fireEvent.click(screen.getByTestId("frappe-form-menu"));
|
|
381
|
+
fireEvent.click(await screen.findByRole("menuitem", { name: "Edit" }));
|
|
380
382
|
expect(pushed).toEqual(["/loans/LOAN-DRAFT/edit"]);
|
|
381
383
|
});
|
|
382
384
|
|
package/src/FrappeForm.tsx
CHANGED
|
@@ -9,21 +9,22 @@ import {
|
|
|
9
9
|
AsyncSkeleton,
|
|
10
10
|
DetailPageLayout,
|
|
11
11
|
EmptyState,
|
|
12
|
+
PageBackButton,
|
|
12
13
|
PageHeader,
|
|
13
14
|
ScrollView,
|
|
14
15
|
Tabs,
|
|
15
16
|
type TabsItem,
|
|
17
|
+
Text,
|
|
16
18
|
} from "@multiplatform.one/components";
|
|
17
19
|
import { SchemaForm, type FieldOverride, type SchemaFormProps } from "./schemaForm";
|
|
18
20
|
import type { HeadingLevel } from "./fields/Heading";
|
|
19
21
|
import { FormSidebar, type SidebarSection, type SidebarMetadataEntry } from "./FormSidebar";
|
|
20
|
-
import { ArrowLeftIcon } from "@phosphor-icons/react";
|
|
21
22
|
import type React from "react";
|
|
22
23
|
import { useEffect, useMemo, useState } from "react";
|
|
23
24
|
import type { TFunction } from "i18next";
|
|
24
25
|
import { useTranslation } from "react-i18next";
|
|
25
26
|
import { Button, Input, formCommonColors } from "@multiplatform.one/forms";
|
|
26
|
-
import { Text, XStack, YStack } from "tamagui";
|
|
27
|
+
import { Text as TamaguiText, XStack, YStack } from "tamagui";
|
|
27
28
|
import { hairlineWidth, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
28
29
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
29
30
|
import { FrappeReconnectIndicator } from "./FrappeReconnectIndicator";
|
|
@@ -37,7 +38,12 @@ import {
|
|
|
37
38
|
resolveDocAction,
|
|
38
39
|
resolveDocIndicator,
|
|
39
40
|
} from "./formEngine/docLifecycle";
|
|
40
|
-
import {
|
|
41
|
+
import {
|
|
42
|
+
FrappeFormActions,
|
|
43
|
+
FrappeFormActionsBar,
|
|
44
|
+
FrappeFormHeaderActions,
|
|
45
|
+
FrappeFormIndicator,
|
|
46
|
+
} from "./FrappeFormActions";
|
|
41
47
|
import { connectionFields, connectionsFromMeta, type FrappeConnection } from "./frappeConnections";
|
|
42
48
|
import { FrappeFormConnections } from "./FrappeFormConnections";
|
|
43
49
|
import { FrappeNotConfigured } from "./FrappeNotConfigured";
|
|
@@ -185,6 +191,26 @@ export interface FrappeFormProps<TDoc extends { name: string; doctype: string }>
|
|
|
185
191
|
* scrolls. Defaults to on for a routed page.
|
|
186
192
|
*/
|
|
187
193
|
stickyActions?: boolean;
|
|
194
|
+
/**
|
|
195
|
+
* Renders the form as its own detail page (LC-29): back in the top bar's
|
|
196
|
+
* leading slot and the record's actions beside it on the same row
|
|
197
|
+
* (LC-145), the title directly under the bar with the state chip under
|
|
198
|
+
* it, and `aside` as the supporting pane.
|
|
199
|
+
*/
|
|
200
|
+
page?: FrappeFormPage;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export interface FrappeFormPage {
|
|
204
|
+
back: {
|
|
205
|
+
/** Where back goes (the list's name), beside the caret. */
|
|
206
|
+
label: string;
|
|
207
|
+
onPress: () => void;
|
|
208
|
+
"aria-label"?: string;
|
|
209
|
+
testID?: string;
|
|
210
|
+
};
|
|
211
|
+
/** The page title. Defaults to the record's title field, else its name. */
|
|
212
|
+
title?: string;
|
|
213
|
+
aside?: React.ReactNode;
|
|
188
214
|
}
|
|
189
215
|
|
|
190
216
|
/**
|
|
@@ -466,6 +492,7 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
466
492
|
notFoundFallback,
|
|
467
493
|
errorFallback,
|
|
468
494
|
routePage,
|
|
495
|
+
page,
|
|
469
496
|
}: FrappeFormBodyProps<TDoc> & { form: FrappeFormController<TDoc> }) {
|
|
470
497
|
const { knobProps } = useResolvedKnobs();
|
|
471
498
|
const { t } = useTranslation();
|
|
@@ -625,10 +652,26 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
625
652
|
const titleValue = titleField ? (localDoc as Record<string, unknown>)[titleField] : undefined;
|
|
626
653
|
const pageTitle = isCreate ? t("New {{doctype}}", { doctype }) : String(titleValue || name);
|
|
627
654
|
const editing = Boolean(routePage) && !onEdit;
|
|
655
|
+
const pageChrome: FrappeFormPage | undefined =
|
|
656
|
+
page ??
|
|
657
|
+
(routePage && !editing
|
|
658
|
+
? {
|
|
659
|
+
back: {
|
|
660
|
+
label: doctype,
|
|
661
|
+
onPress: routePage.onBack,
|
|
662
|
+
"aria-label": t("Back to {{doctype}} list", { doctype }),
|
|
663
|
+
},
|
|
664
|
+
}
|
|
665
|
+
: undefined);
|
|
628
666
|
const frame = (
|
|
629
667
|
content: React.ReactNode,
|
|
630
668
|
aside?: React.ReactNode,
|
|
631
|
-
chrome?: {
|
|
669
|
+
chrome?: {
|
|
670
|
+
badge?: React.ReactNode;
|
|
671
|
+
footer?: React.ReactNode;
|
|
672
|
+
actions?: React.ReactNode;
|
|
673
|
+
status?: React.ReactNode;
|
|
674
|
+
},
|
|
632
675
|
) =>
|
|
633
676
|
routePage && editing ? (
|
|
634
677
|
<YStack flex={1} backgroundColor="$background" testID="frappe-form-route-editor">
|
|
@@ -681,24 +724,28 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
681
724
|
</FrappeFormActionsBar>
|
|
682
725
|
) : null}
|
|
683
726
|
</YStack>
|
|
684
|
-
) :
|
|
685
|
-
// flexBasis auto:
|
|
686
|
-
//
|
|
727
|
+
) : pageChrome ? (
|
|
728
|
+
// flexBasis auto: react-native-web's min-height:0 reset would cap the
|
|
729
|
+
// scroll page at viewport height and crush the form.
|
|
687
730
|
<DetailPageLayout
|
|
688
731
|
flexBasis="auto"
|
|
689
732
|
toolbarLeading={
|
|
690
|
-
<
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
>
|
|
697
|
-
{doctype}
|
|
698
|
-
</Button>
|
|
733
|
+
<PageBackButton
|
|
734
|
+
label={pageChrome.back.label}
|
|
735
|
+
onPress={pageChrome.back.onPress}
|
|
736
|
+
aria-label={pageChrome.back["aria-label"]}
|
|
737
|
+
testID={pageChrome.back.testID}
|
|
738
|
+
/>
|
|
699
739
|
}
|
|
700
|
-
|
|
701
|
-
|
|
740
|
+
toolbarTrailing={chrome?.actions}
|
|
741
|
+
header={
|
|
742
|
+
<PageHeader
|
|
743
|
+
title={pageChrome.title ?? pageTitle}
|
|
744
|
+
status={chrome?.status}
|
|
745
|
+
divider={false}
|
|
746
|
+
/>
|
|
747
|
+
}
|
|
748
|
+
aside={pageChrome.aside ?? aside}
|
|
702
749
|
>
|
|
703
750
|
{content}
|
|
704
751
|
</DetailPageLayout>
|
|
@@ -786,12 +833,12 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
786
833
|
if (notFoundFallback !== undefined) return frame(notFoundFallback);
|
|
787
834
|
return frame(
|
|
788
835
|
<YStack {...knobProps.panelPadding} alignItems="center" {...knobProps.gap}>
|
|
789
|
-
<
|
|
836
|
+
<TamaguiText color={formCommonColors.error} {...knobProps.body}>
|
|
790
837
|
{t("{{doctype}} not found", { doctype })}
|
|
791
|
-
</
|
|
792
|
-
<
|
|
838
|
+
</TamaguiText>
|
|
839
|
+
<TamaguiText color={formCommonColors.muted} {...knobProps.body}>
|
|
793
840
|
{t("Document {{name}} does not exist or could not be loaded.", { name })}
|
|
794
|
-
</
|
|
841
|
+
</TamaguiText>
|
|
795
842
|
</YStack>,
|
|
796
843
|
);
|
|
797
844
|
}
|
|
@@ -926,7 +973,7 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
926
973
|
backgroundColor="$red3"
|
|
927
974
|
testID="frappe-form-deleted-banner"
|
|
928
975
|
>
|
|
929
|
-
<
|
|
976
|
+
<TamaguiText color={formCommonColors.error} {...knobProps.body}>
|
|
930
977
|
{hasUnsavedChanges
|
|
931
978
|
? t(
|
|
932
979
|
"This {{doctype}} was deleted on the server. Fields are read-only and your unsaved edits can no longer be saved.",
|
|
@@ -935,7 +982,7 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
935
982
|
: t("This {{doctype}} was deleted on the server. Fields are read-only.", {
|
|
936
983
|
doctype,
|
|
937
984
|
})}
|
|
938
|
-
</
|
|
985
|
+
</TamaguiText>
|
|
939
986
|
</XStack>
|
|
940
987
|
)}
|
|
941
988
|
|
|
@@ -948,12 +995,12 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
948
995
|
backgroundColor="$orange3"
|
|
949
996
|
testID="frappe-form-conflict-banner"
|
|
950
997
|
>
|
|
951
|
-
<
|
|
998
|
+
<TamaguiText color="$orange11" {...knobProps.body}>
|
|
952
999
|
{t(
|
|
953
1000
|
"Changed elsewhere while you were editing: {{fields}}. Your edits are kept — saving will overwrite the newer server values.",
|
|
954
1001
|
{ fields: conflictLabels },
|
|
955
1002
|
)}
|
|
956
|
-
</
|
|
1003
|
+
</TamaguiText>
|
|
957
1004
|
</XStack>
|
|
958
1005
|
)}
|
|
959
1006
|
|
|
@@ -999,20 +1046,21 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
999
1046
|
) : (
|
|
1000
1047
|
// Metadata unavailable (should be covered by metaError branch above)
|
|
1001
1048
|
<YStack {...knobProps.panelPadding} alignItems="center">
|
|
1002
|
-
<
|
|
1049
|
+
<TamaguiText color={formCommonColors.muted} {...knobProps.body}>
|
|
1003
1050
|
{t("Form schema unavailable")}
|
|
1004
|
-
</
|
|
1051
|
+
</TamaguiText>
|
|
1005
1052
|
</YStack>
|
|
1006
1053
|
)}
|
|
1007
1054
|
|
|
1008
1055
|
{errors.general && (
|
|
1009
|
-
<
|
|
1056
|
+
<TamaguiText color={formCommonColors.error} {...knobProps.body} role="alert">
|
|
1010
1057
|
{errors.general}
|
|
1011
|
-
</
|
|
1058
|
+
</TamaguiText>
|
|
1012
1059
|
)}
|
|
1013
1060
|
|
|
1014
|
-
{/* A routed editor carries its actions in the page footer
|
|
1015
|
-
|
|
1061
|
+
{/* A routed editor carries its actions in the page footer, a
|
|
1062
|
+
detail page in its top bar. */}
|
|
1063
|
+
{toolbarShown && !editing && !pageChrome && (
|
|
1016
1064
|
<FrappeFormActionsBar sticky={stickyActions}>
|
|
1017
1065
|
<FrappeFormActions
|
|
1018
1066
|
indicator={indicator}
|
|
@@ -1040,12 +1088,11 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
1040
1088
|
)}
|
|
1041
1089
|
</YStack>,
|
|
1042
1090
|
routePage && !editing ? sidebar : undefined,
|
|
1043
|
-
editing
|
|
1091
|
+
pageChrome && !editing
|
|
1044
1092
|
? {
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
<
|
|
1048
|
-
placement="footer"
|
|
1093
|
+
status: indicator ? <FrappeFormIndicator indicator={indicator} /> : undefined,
|
|
1094
|
+
actions: toolbarShown ? (
|
|
1095
|
+
<FrappeFormHeaderActions
|
|
1049
1096
|
action={docAction}
|
|
1050
1097
|
busy={isSubmitting}
|
|
1051
1098
|
disabled={effectiveDisabled}
|
|
@@ -1055,11 +1102,32 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
|
|
|
1055
1102
|
onAmend={showAmend ? handleAmend : undefined}
|
|
1056
1103
|
amendedAs={amendedAs}
|
|
1057
1104
|
onDelete={showDelete ? handleDelete : undefined}
|
|
1105
|
+
onEdit={showEdit ? onEdit : undefined}
|
|
1058
1106
|
onClose={showClose ? handleCancel : undefined}
|
|
1059
1107
|
closeDisabled={disabled}
|
|
1060
1108
|
/>
|
|
1061
1109
|
) : null,
|
|
1062
1110
|
}
|
|
1063
|
-
:
|
|
1111
|
+
: editing
|
|
1112
|
+
? {
|
|
1113
|
+
badge: indicator ? <FrappeFormIndicator indicator={indicator} /> : null,
|
|
1114
|
+
footer: toolbarShown ? (
|
|
1115
|
+
<FrappeFormActions
|
|
1116
|
+
placement="footer"
|
|
1117
|
+
action={docAction}
|
|
1118
|
+
busy={isSubmitting}
|
|
1119
|
+
disabled={effectiveDisabled}
|
|
1120
|
+
onSave={handleSave}
|
|
1121
|
+
onSubmit={handleSubmitDocument}
|
|
1122
|
+
onCancelDocument={handleCancelDocument}
|
|
1123
|
+
onAmend={showAmend ? handleAmend : undefined}
|
|
1124
|
+
amendedAs={amendedAs}
|
|
1125
|
+
onDelete={showDelete ? handleDelete : undefined}
|
|
1126
|
+
onClose={showClose ? handleCancel : undefined}
|
|
1127
|
+
closeDisabled={disabled}
|
|
1128
|
+
/>
|
|
1129
|
+
) : null,
|
|
1130
|
+
}
|
|
1131
|
+
: undefined,
|
|
1064
1132
|
);
|
|
1065
1133
|
}
|