@multiplatform.one/frappe-ui 7.4.1 → 7.6.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/AttachLibrary.cjs +111 -0
- package/dist/cjs/FileBrowser/AttachLibrary.native.js +115 -0
- package/dist/cjs/FileBrowser/AttachLibrary.native.js.map +1 -0
- package/dist/cjs/FileBrowser/folderTree.cjs +84 -0
- package/dist/cjs/FileBrowser/folderTree.native.js +94 -0
- package/dist/cjs/FileBrowser/folderTree.native.js.map +1 -0
- package/dist/cjs/FileBrowser/index.cjs +690 -0
- package/dist/cjs/FileBrowser/index.native.js +781 -0
- package/dist/cjs/FileBrowser/index.native.js.map +1 -0
- package/dist/cjs/FileBrowser/types.cjs +18 -0
- package/dist/cjs/FileBrowser/types.native.js +21 -0
- package/dist/cjs/FileBrowser/types.native.js.map +1 -0
- package/dist/cjs/FileBrowser/viewPersistence.cjs +55 -0
- package/dist/cjs/FileBrowser/viewPersistence.native.js +60 -0
- package/dist/cjs/FileBrowser/viewPersistence.native.js.map +1 -0
- package/dist/cjs/FormSidebar.cjs +47 -47
- package/dist/cjs/FormSidebar.native.js +48 -50
- package/dist/cjs/FormSidebar.native.js.map +1 -1
- package/dist/cjs/FrappeAssignment.cjs +18 -13
- package/dist/cjs/FrappeAssignment.native.js +19 -13
- package/dist/cjs/FrappeAssignment.native.js.map +1 -1
- package/dist/cjs/FrappeCalendar.cjs +11 -10
- package/dist/cjs/FrappeCalendar.native.js +11 -10
- package/dist/cjs/FrappeCalendar.native.js.map +1 -1
- package/dist/cjs/FrappeChartCard.cjs +6 -15
- package/dist/cjs/FrappeChartCard.native.js +6 -15
- package/dist/cjs/FrappeChartCard.native.js.map +1 -1
- package/dist/cjs/FrappeDashboard.cjs +12 -9
- package/dist/cjs/FrappeDashboard.native.js +12 -9
- package/dist/cjs/FrappeDashboard.native.js.map +1 -1
- package/dist/cjs/FrappeForm.cjs +36 -25
- package/dist/cjs/FrappeForm.native.js +36 -25
- package/dist/cjs/FrappeForm.native.js.map +1 -1
- package/dist/cjs/FrappeGantt.cjs +7 -5
- package/dist/cjs/FrappeGantt.native.js +7 -5
- package/dist/cjs/FrappeGantt.native.js.map +1 -1
- package/dist/cjs/FrappeImageView.cjs +22 -22
- package/dist/cjs/FrappeImageView.native.js +24 -22
- package/dist/cjs/FrappeImageView.native.js.map +1 -1
- package/dist/cjs/FrappeKPICard.cjs +7 -29
- package/dist/cjs/FrappeKPICard.native.js +7 -29
- package/dist/cjs/FrappeKPICard.native.js.map +1 -1
- package/dist/cjs/FrappeKanban.cjs +11 -13
- package/dist/cjs/FrappeKanban.native.js +11 -13
- package/dist/cjs/FrappeKanban.native.js.map +1 -1
- package/dist/cjs/FrappeLikedBy.cjs +5 -5
- package/dist/cjs/FrappeLikedBy.native.js +6 -6
- package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
- package/dist/cjs/FrappeListView.cjs +32 -33
- package/dist/cjs/FrappeListView.native.js +37 -39
- package/dist/cjs/FrappeListView.native.js.map +1 -1
- package/dist/cjs/FrappeReportBuilder.cjs +30 -46
- package/dist/cjs/FrappeReportBuilder.native.js +30 -42
- package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
- package/dist/cjs/FrappeReportView.cjs +5 -5
- package/dist/cjs/FrappeReportView.native.js +5 -5
- package/dist/cjs/FrappeReportView.native.js.map +1 -1
- package/dist/cjs/FrappeTreeView.cjs +9 -6
- package/dist/cjs/FrappeTreeView.native.js +10 -6
- package/dist/cjs/FrappeTreeView.native.js.map +1 -1
- package/dist/cjs/desk/DeskFormPage.cjs +3 -3
- package/dist/cjs/desk/DeskFormPage.native.js +3 -3
- package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
- package/dist/cjs/desk/DeskListPage.cjs +2 -2
- package/dist/cjs/desk/DeskListPage.native.js +2 -2
- package/dist/cjs/desk/DeskListPage.native.js.map +1 -1
- package/dist/cjs/desk/DeskShell.cjs +58 -38
- package/dist/cjs/desk/DeskShell.native.js +63 -44
- package/dist/cjs/desk/DeskShell.native.js.map +1 -1
- package/dist/cjs/desk/awesomebar.cjs +28 -16
- package/dist/cjs/desk/awesomebar.native.js +28 -16
- package/dist/cjs/desk/awesomebar.native.js.map +1 -1
- package/dist/cjs/fieldRegistry.cjs +64 -3
- package/dist/cjs/fieldRegistry.native.js +69 -3
- package/dist/cjs/fieldRegistry.native.js.map +1 -1
- package/dist/cjs/fields/Check/index.cjs +1 -1
- package/dist/cjs/fields/Check/index.native.js +1 -1
- package/dist/cjs/fields/Check/index.native.js.map +1 -1
- package/dist/cjs/fields/Color/index.cjs +1 -1
- package/dist/cjs/fields/Color/index.native.js +1 -1
- package/dist/cjs/fields/Color/index.native.js.map +1 -1
- package/dist/cjs/fields/Data/index.native.js.map +1 -1
- package/dist/cjs/fields/Date/index.native.js +47 -34
- package/dist/cjs/fields/Date/index.native.js.map +1 -1
- package/dist/cjs/fields/Date/sheetKeyboard.cjs +54 -0
- package/dist/cjs/fields/Date/sheetKeyboard.native.js +57 -0
- package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +1 -0
- package/dist/cjs/fields/DynamicLink.cjs +37 -128
- package/dist/cjs/fields/DynamicLink.native.js +40 -138
- package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload.cjs +233 -50
- package/dist/cjs/fields/FileUpload.native.js +242 -51
- package/dist/cjs/fields/FileUpload.native.js.map +1 -1
- package/dist/cjs/fields/FileUploadField/index.cjs +53 -20
- package/dist/cjs/fields/FileUploadField/index.native.js +56 -20
- package/dist/cjs/fields/FileUploadField/index.native.js.map +1 -1
- package/dist/cjs/fields/HTML/index.cjs +30 -51
- package/dist/cjs/fields/HTML/index.native.js +30 -51
- package/dist/cjs/fields/HTML/index.native.js.map +1 -1
- package/dist/cjs/fields/Icon/index.cjs +73 -0
- package/dist/cjs/fields/Icon/index.native.js +76 -0
- package/dist/cjs/fields/Icon/index.native.js.map +1 -0
- package/dist/cjs/fields/Link.cjs +34 -8
- package/dist/cjs/fields/Link.native.js +35 -9
- package/dist/cjs/fields/Link.native.js.map +1 -1
- package/dist/cjs/fields/LinkTree.cjs +114 -0
- package/dist/cjs/fields/LinkTree.native.js +125 -0
- package/dist/cjs/fields/LinkTree.native.js.map +1 -0
- package/dist/cjs/fields/LongText/index.cjs +6 -4
- package/dist/cjs/fields/LongText/index.native.js +6 -4
- package/dist/cjs/fields/LongText/index.native.js.map +1 -1
- package/dist/cjs/fields/Numeric/index.native.js.map +1 -1
- package/dist/cjs/fields/Password/index.cjs +178 -16
- package/dist/cjs/fields/Password/index.native.js +186 -16
- package/dist/cjs/fields/Password/index.native.js.map +1 -1
- package/dist/cjs/fields/Phone/index.native.js.map +1 -1
- package/dist/cjs/fields/ReadOnly/index.cjs +34 -48
- package/dist/cjs/fields/ReadOnly/index.native.js +34 -46
- package/dist/cjs/fields/ReadOnly/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.cjs +1 -1
- package/dist/cjs/fields/Select/index.native.js +1 -1
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/SmallText/index.cjs +4 -3
- package/dist/cjs/fields/SmallText/index.native.js +4 -3
- package/dist/cjs/fields/SmallText/index.native.js.map +1 -1
- package/dist/cjs/fields/TableMultiSelect.cjs +39 -150
- package/dist/cjs/fields/TableMultiSelect.native.js +44 -171
- package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/cjs/fields/TextEditor/index.cjs +26 -293
- package/dist/cjs/index.cjs +9 -0
- package/dist/cjs/index.native.js +9 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/schemaForm/SchemaWizard.cjs +182 -0
- package/dist/cjs/schemaForm/SchemaWizard.native.js +232 -0
- package/dist/cjs/schemaForm/SchemaWizard.native.js.map +1 -0
- package/dist/cjs/schemaForm/index.cjs +1 -1
- package/dist/cjs/schemaForm/index.native.js +1 -1
- package/dist/cjs/schemaForm/index.native.js.map +1 -1
- package/dist/cjs/shared/useKeyboardInset.cjs +48 -0
- package/dist/cjs/shared/useKeyboardInset.native.js +53 -0
- package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -0
- package/dist/esm/FileBrowser/AttachLibrary.mjs +86 -0
- package/dist/esm/FileBrowser/AttachLibrary.mjs.map +1 -0
- package/dist/esm/FileBrowser/AttachLibrary.native.js +87 -0
- package/dist/esm/FileBrowser/AttachLibrary.native.js.map +1 -0
- package/dist/esm/FileBrowser/folderTree.mjs +52 -0
- package/dist/esm/FileBrowser/folderTree.mjs.map +1 -0
- package/dist/esm/FileBrowser/folderTree.native.js +59 -0
- package/dist/esm/FileBrowser/folderTree.native.js.map +1 -0
- package/dist/esm/FileBrowser/index.mjs +665 -0
- package/dist/esm/FileBrowser/index.mjs.map +1 -0
- package/dist/esm/FileBrowser/index.native.js +753 -0
- package/dist/esm/FileBrowser/index.native.js.map +1 -0
- package/dist/esm/FileBrowser/types.mjs +2 -0
- package/dist/esm/FileBrowser/types.mjs.map +1 -0
- package/dist/esm/FileBrowser/types.native.js +2 -0
- package/dist/esm/FileBrowser/types.native.js.map +1 -0
- package/dist/esm/FileBrowser/viewPersistence.mjs +29 -0
- package/dist/esm/FileBrowser/viewPersistence.mjs.map +1 -0
- package/dist/esm/FileBrowser/viewPersistence.native.js +31 -0
- package/dist/esm/FileBrowser/viewPersistence.native.js.map +1 -0
- package/dist/esm/FormSidebar.mjs +46 -46
- package/dist/esm/FormSidebar.mjs.map +1 -1
- package/dist/esm/FormSidebar.native.js +47 -49
- package/dist/esm/FormSidebar.native.js.map +1 -1
- package/dist/esm/FrappeAssignment.mjs +19 -14
- package/dist/esm/FrappeAssignment.mjs.map +1 -1
- package/dist/esm/FrappeAssignment.native.js +20 -14
- package/dist/esm/FrappeAssignment.native.js.map +1 -1
- package/dist/esm/FrappeCalendar.mjs +12 -11
- package/dist/esm/FrappeCalendar.mjs.map +1 -1
- package/dist/esm/FrappeCalendar.native.js +12 -11
- package/dist/esm/FrappeCalendar.native.js.map +1 -1
- package/dist/esm/FrappeChartCard.mjs +7 -16
- package/dist/esm/FrappeChartCard.mjs.map +1 -1
- package/dist/esm/FrappeChartCard.native.js +7 -16
- package/dist/esm/FrappeChartCard.native.js.map +1 -1
- package/dist/esm/FrappeDashboard.mjs +12 -9
- package/dist/esm/FrappeDashboard.mjs.map +1 -1
- package/dist/esm/FrappeDashboard.native.js +12 -9
- package/dist/esm/FrappeDashboard.native.js.map +1 -1
- package/dist/esm/FrappeForm.mjs +35 -24
- package/dist/esm/FrappeForm.mjs.map +1 -1
- package/dist/esm/FrappeForm.native.js +35 -24
- package/dist/esm/FrappeForm.native.js.map +1 -1
- package/dist/esm/FrappeGantt.mjs +7 -5
- package/dist/esm/FrappeGantt.mjs.map +1 -1
- package/dist/esm/FrappeGantt.native.js +7 -5
- package/dist/esm/FrappeGantt.native.js.map +1 -1
- package/dist/esm/FrappeImageView.mjs +23 -23
- package/dist/esm/FrappeImageView.mjs.map +1 -1
- package/dist/esm/FrappeImageView.native.js +25 -23
- package/dist/esm/FrappeImageView.native.js.map +1 -1
- package/dist/esm/FrappeKPICard.mjs +7 -29
- package/dist/esm/FrappeKPICard.mjs.map +1 -1
- package/dist/esm/FrappeKPICard.native.js +7 -29
- package/dist/esm/FrappeKPICard.native.js.map +1 -1
- package/dist/esm/FrappeKanban.mjs +13 -15
- package/dist/esm/FrappeKanban.mjs.map +1 -1
- package/dist/esm/FrappeKanban.native.js +13 -15
- package/dist/esm/FrappeKanban.native.js.map +1 -1
- package/dist/esm/FrappeLikedBy.mjs +6 -6
- package/dist/esm/FrappeLikedBy.mjs.map +1 -1
- package/dist/esm/FrappeLikedBy.native.js +7 -7
- package/dist/esm/FrappeLikedBy.native.js.map +1 -1
- package/dist/esm/FrappeListView.mjs +33 -34
- package/dist/esm/FrappeListView.mjs.map +1 -1
- package/dist/esm/FrappeListView.native.js +38 -40
- package/dist/esm/FrappeListView.native.js.map +1 -1
- package/dist/esm/FrappeReportBuilder.mjs +27 -43
- package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
- package/dist/esm/FrappeReportBuilder.native.js +27 -39
- package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
- package/dist/esm/FrappeReportView.mjs +6 -6
- package/dist/esm/FrappeReportView.mjs.map +1 -1
- package/dist/esm/FrappeReportView.native.js +6 -6
- package/dist/esm/FrappeReportView.native.js.map +1 -1
- package/dist/esm/FrappeTreeView.mjs +9 -6
- package/dist/esm/FrappeTreeView.mjs.map +1 -1
- package/dist/esm/FrappeTreeView.native.js +10 -6
- package/dist/esm/FrappeTreeView.native.js.map +1 -1
- package/dist/esm/desk/DeskFormPage.mjs +3 -3
- package/dist/esm/desk/DeskFormPage.mjs.map +1 -1
- package/dist/esm/desk/DeskFormPage.native.js +3 -3
- package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
- package/dist/esm/desk/DeskListPage.mjs +2 -2
- package/dist/esm/desk/DeskListPage.mjs.map +1 -1
- package/dist/esm/desk/DeskListPage.native.js +2 -2
- package/dist/esm/desk/DeskListPage.native.js.map +1 -1
- package/dist/esm/desk/DeskShell.mjs +48 -28
- package/dist/esm/desk/DeskShell.mjs.map +1 -1
- package/dist/esm/desk/DeskShell.native.js +52 -33
- package/dist/esm/desk/DeskShell.native.js.map +1 -1
- package/dist/esm/desk/awesomebar.mjs +29 -17
- package/dist/esm/desk/awesomebar.mjs.map +1 -1
- package/dist/esm/desk/awesomebar.native.js +29 -17
- package/dist/esm/desk/awesomebar.native.js.map +1 -1
- package/dist/esm/fieldRegistry.mjs +65 -4
- package/dist/esm/fieldRegistry.mjs.map +1 -1
- package/dist/esm/fieldRegistry.native.js +70 -4
- package/dist/esm/fieldRegistry.native.js.map +1 -1
- package/dist/esm/fields/Check/index.mjs +1 -1
- package/dist/esm/fields/Check/index.mjs.map +1 -1
- package/dist/esm/fields/Check/index.native.js +1 -1
- package/dist/esm/fields/Check/index.native.js.map +1 -1
- package/dist/esm/fields/Color/index.mjs +1 -1
- package/dist/esm/fields/Color/index.mjs.map +1 -1
- package/dist/esm/fields/Color/index.native.js +1 -1
- package/dist/esm/fields/Color/index.native.js.map +1 -1
- package/dist/esm/fields/Data/index.mjs.map +1 -1
- package/dist/esm/fields/Data/index.native.js.map +1 -1
- package/dist/esm/fields/Date/index.native.js +46 -33
- package/dist/esm/fields/Date/index.native.js.map +1 -1
- package/dist/esm/fields/Date/sheetKeyboard.mjs +21 -0
- package/dist/esm/fields/Date/sheetKeyboard.mjs.map +1 -0
- package/dist/esm/fields/Date/sheetKeyboard.native.js +21 -0
- package/dist/esm/fields/Date/sheetKeyboard.native.js.map +1 -0
- package/dist/esm/fields/DynamicLink.mjs +37 -128
- package/dist/esm/fields/DynamicLink.mjs.map +1 -1
- package/dist/esm/fields/DynamicLink.native.js +40 -138
- package/dist/esm/fields/DynamicLink.native.js.map +1 -1
- package/dist/esm/fields/FileUpload.mjs +234 -51
- package/dist/esm/fields/FileUpload.mjs.map +1 -1
- package/dist/esm/fields/FileUpload.native.js +243 -52
- package/dist/esm/fields/FileUpload.native.js.map +1 -1
- package/dist/esm/fields/FileUploadField/index.mjs +55 -22
- package/dist/esm/fields/FileUploadField/index.mjs.map +1 -1
- package/dist/esm/fields/FileUploadField/index.native.js +58 -22
- package/dist/esm/fields/FileUploadField/index.native.js.map +1 -1
- package/dist/esm/fields/HTML/index.mjs +33 -54
- package/dist/esm/fields/HTML/index.mjs.map +1 -1
- package/dist/esm/fields/HTML/index.native.js +33 -54
- package/dist/esm/fields/HTML/index.native.js.map +1 -1
- package/dist/esm/fields/Icon/index.mjs +48 -0
- package/dist/esm/fields/Icon/index.mjs.map +1 -0
- package/dist/esm/fields/Icon/index.native.js +48 -0
- package/dist/esm/fields/Icon/index.native.js.map +1 -0
- package/dist/esm/fields/Link.mjs +35 -9
- package/dist/esm/fields/Link.mjs.map +1 -1
- package/dist/esm/fields/Link.native.js +36 -10
- package/dist/esm/fields/Link.native.js.map +1 -1
- package/dist/esm/fields/LinkTree.mjs +89 -0
- package/dist/esm/fields/LinkTree.mjs.map +1 -0
- package/dist/esm/fields/LinkTree.native.js +97 -0
- package/dist/esm/fields/LinkTree.native.js.map +1 -0
- package/dist/esm/fields/LongText/index.mjs +7 -5
- package/dist/esm/fields/LongText/index.mjs.map +1 -1
- package/dist/esm/fields/LongText/index.native.js +7 -5
- package/dist/esm/fields/LongText/index.native.js.map +1 -1
- package/dist/esm/fields/Numeric/index.mjs.map +1 -1
- package/dist/esm/fields/Numeric/index.native.js.map +1 -1
- package/dist/esm/fields/Password/index.mjs +180 -18
- package/dist/esm/fields/Password/index.mjs.map +1 -1
- package/dist/esm/fields/Password/index.native.js +188 -18
- package/dist/esm/fields/Password/index.native.js.map +1 -1
- package/dist/esm/fields/Phone/index.mjs.map +1 -1
- package/dist/esm/fields/Phone/index.native.js.map +1 -1
- package/dist/esm/fields/ReadOnly/index.mjs +36 -50
- package/dist/esm/fields/ReadOnly/index.mjs.map +1 -1
- package/dist/esm/fields/ReadOnly/index.native.js +36 -48
- package/dist/esm/fields/ReadOnly/index.native.js.map +1 -1
- package/dist/esm/fields/Select/index.mjs +1 -1
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +1 -1
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/SmallText/index.mjs +5 -4
- package/dist/esm/fields/SmallText/index.mjs.map +1 -1
- package/dist/esm/fields/SmallText/index.native.js +5 -4
- package/dist/esm/fields/SmallText/index.native.js.map +1 -1
- package/dist/esm/fields/TableMultiSelect.mjs +41 -152
- package/dist/esm/fields/TableMultiSelect.mjs.map +1 -1
- package/dist/esm/fields/TableMultiSelect.native.js +46 -173
- package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/esm/fields/TextEditor/index.mjs +28 -284
- package/dist/esm/fields/TextEditor/index.mjs.map +1 -1
- package/dist/esm/index.mjs +5 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +5 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/schemaForm/SchemaWizard.mjs +156 -0
- package/dist/esm/schemaForm/SchemaWizard.mjs.map +1 -0
- package/dist/esm/schemaForm/SchemaWizard.native.js +203 -0
- package/dist/esm/schemaForm/SchemaWizard.native.js.map +1 -0
- package/dist/esm/schemaForm/index.mjs +1 -1
- package/dist/esm/schemaForm/index.mjs.map +1 -1
- package/dist/esm/schemaForm/index.native.js +1 -1
- package/dist/esm/schemaForm/index.native.js.map +1 -1
- package/dist/esm/shared/useKeyboardInset.mjs +23 -0
- package/dist/esm/shared/useKeyboardInset.mjs.map +1 -0
- package/dist/esm/shared/useKeyboardInset.native.js +25 -0
- package/dist/esm/shared/useKeyboardInset.native.js.map +1 -0
- package/dist/jsx/FileBrowser/AttachLibrary.mjs +86 -0
- package/dist/jsx/FileBrowser/AttachLibrary.mjs.map +1 -0
- package/dist/jsx/FileBrowser/AttachLibrary.native.js +115 -0
- package/dist/jsx/FileBrowser/AttachLibrary.native.js.map +1 -0
- package/dist/jsx/FileBrowser/folderTree.mjs +52 -0
- package/dist/jsx/FileBrowser/folderTree.mjs.map +1 -0
- package/dist/jsx/FileBrowser/folderTree.native.js +94 -0
- package/dist/jsx/FileBrowser/folderTree.native.js.map +1 -0
- package/dist/jsx/FileBrowser/index.mjs +665 -0
- package/dist/jsx/FileBrowser/index.mjs.map +1 -0
- package/dist/jsx/FileBrowser/index.native.js +781 -0
- package/dist/jsx/FileBrowser/index.native.js.map +1 -0
- package/dist/jsx/FileBrowser/types.mjs +2 -0
- package/dist/jsx/FileBrowser/types.mjs.map +1 -0
- package/dist/jsx/FileBrowser/types.native.js +21 -0
- package/dist/jsx/FileBrowser/types.native.js.map +1 -0
- package/dist/jsx/FileBrowser/viewPersistence.mjs +29 -0
- package/dist/jsx/FileBrowser/viewPersistence.mjs.map +1 -0
- package/dist/jsx/FileBrowser/viewPersistence.native.js +60 -0
- package/dist/jsx/FileBrowser/viewPersistence.native.js.map +1 -0
- package/dist/jsx/FormSidebar.mjs +46 -46
- package/dist/jsx/FormSidebar.mjs.map +1 -1
- package/dist/jsx/FormSidebar.native.js +48 -50
- package/dist/jsx/FormSidebar.native.js.map +1 -1
- package/dist/jsx/FrappeAssignment.mjs +19 -14
- package/dist/jsx/FrappeAssignment.mjs.map +1 -1
- package/dist/jsx/FrappeAssignment.native.js +19 -13
- package/dist/jsx/FrappeAssignment.native.js.map +1 -1
- package/dist/jsx/FrappeCalendar.mjs +12 -11
- package/dist/jsx/FrappeCalendar.mjs.map +1 -1
- package/dist/jsx/FrappeCalendar.native.js +11 -10
- package/dist/jsx/FrappeCalendar.native.js.map +1 -1
- package/dist/jsx/FrappeChartCard.mjs +7 -16
- package/dist/jsx/FrappeChartCard.mjs.map +1 -1
- package/dist/jsx/FrappeChartCard.native.js +6 -15
- package/dist/jsx/FrappeChartCard.native.js.map +1 -1
- package/dist/jsx/FrappeDashboard.mjs +12 -9
- package/dist/jsx/FrappeDashboard.mjs.map +1 -1
- package/dist/jsx/FrappeDashboard.native.js +12 -9
- package/dist/jsx/FrappeDashboard.native.js.map +1 -1
- package/dist/jsx/FrappeForm.mjs +35 -24
- package/dist/jsx/FrappeForm.mjs.map +1 -1
- package/dist/jsx/FrappeForm.native.js +36 -25
- package/dist/jsx/FrappeForm.native.js.map +1 -1
- package/dist/jsx/FrappeGantt.mjs +7 -5
- package/dist/jsx/FrappeGantt.mjs.map +1 -1
- package/dist/jsx/FrappeGantt.native.js +7 -5
- package/dist/jsx/FrappeGantt.native.js.map +1 -1
- package/dist/jsx/FrappeImageView.mjs +23 -23
- package/dist/jsx/FrappeImageView.mjs.map +1 -1
- package/dist/jsx/FrappeImageView.native.js +24 -22
- package/dist/jsx/FrappeImageView.native.js.map +1 -1
- package/dist/jsx/FrappeKPICard.mjs +7 -29
- package/dist/jsx/FrappeKPICard.mjs.map +1 -1
- package/dist/jsx/FrappeKPICard.native.js +7 -29
- package/dist/jsx/FrappeKPICard.native.js.map +1 -1
- package/dist/jsx/FrappeKanban.mjs +13 -15
- package/dist/jsx/FrappeKanban.mjs.map +1 -1
- package/dist/jsx/FrappeKanban.native.js +11 -13
- package/dist/jsx/FrappeKanban.native.js.map +1 -1
- package/dist/jsx/FrappeLikedBy.mjs +6 -6
- package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
- package/dist/jsx/FrappeLikedBy.native.js +6 -6
- package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
- package/dist/jsx/FrappeListView.mjs +33 -34
- package/dist/jsx/FrappeListView.mjs.map +1 -1
- package/dist/jsx/FrappeListView.native.js +37 -39
- package/dist/jsx/FrappeListView.native.js.map +1 -1
- package/dist/jsx/FrappeReportBuilder.mjs +27 -43
- package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
- package/dist/jsx/FrappeReportBuilder.native.js +30 -42
- package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
- package/dist/jsx/FrappeReportView.mjs +6 -6
- package/dist/jsx/FrappeReportView.mjs.map +1 -1
- package/dist/jsx/FrappeReportView.native.js +5 -5
- package/dist/jsx/FrappeReportView.native.js.map +1 -1
- package/dist/jsx/FrappeTreeView.mjs +9 -6
- package/dist/jsx/FrappeTreeView.mjs.map +1 -1
- package/dist/jsx/FrappeTreeView.native.js +10 -6
- package/dist/jsx/FrappeTreeView.native.js.map +1 -1
- package/dist/jsx/desk/DeskFormPage.mjs +3 -3
- package/dist/jsx/desk/DeskFormPage.mjs.map +1 -1
- package/dist/jsx/desk/DeskFormPage.native.js +3 -3
- package/dist/jsx/desk/DeskFormPage.native.js.map +1 -1
- package/dist/jsx/desk/DeskListPage.mjs +2 -2
- package/dist/jsx/desk/DeskListPage.mjs.map +1 -1
- package/dist/jsx/desk/DeskListPage.native.js +2 -2
- package/dist/jsx/desk/DeskListPage.native.js.map +1 -1
- package/dist/jsx/desk/DeskShell.mjs +48 -28
- package/dist/jsx/desk/DeskShell.mjs.map +1 -1
- package/dist/jsx/desk/DeskShell.native.js +63 -44
- package/dist/jsx/desk/DeskShell.native.js.map +1 -1
- package/dist/jsx/desk/awesomebar.mjs +29 -17
- package/dist/jsx/desk/awesomebar.mjs.map +1 -1
- package/dist/jsx/desk/awesomebar.native.js +28 -16
- package/dist/jsx/desk/awesomebar.native.js.map +1 -1
- package/dist/jsx/fieldRegistry.mjs +65 -4
- package/dist/jsx/fieldRegistry.mjs.map +1 -1
- package/dist/jsx/fieldRegistry.native.js +69 -3
- package/dist/jsx/fieldRegistry.native.js.map +1 -1
- package/dist/jsx/fields/Check/index.mjs +1 -1
- package/dist/jsx/fields/Check/index.mjs.map +1 -1
- package/dist/jsx/fields/Check/index.native.js +1 -1
- package/dist/jsx/fields/Check/index.native.js.map +1 -1
- package/dist/jsx/fields/Color/index.mjs +1 -1
- package/dist/jsx/fields/Color/index.mjs.map +1 -1
- package/dist/jsx/fields/Color/index.native.js +1 -1
- package/dist/jsx/fields/Color/index.native.js.map +1 -1
- package/dist/jsx/fields/Data/index.mjs.map +1 -1
- package/dist/jsx/fields/Data/index.native.js.map +1 -1
- package/dist/jsx/fields/Date/index.native.js +47 -34
- package/dist/jsx/fields/Date/index.native.js.map +1 -1
- package/dist/jsx/fields/Date/sheetKeyboard.mjs +21 -0
- package/dist/jsx/fields/Date/sheetKeyboard.mjs.map +1 -0
- package/dist/jsx/fields/Date/sheetKeyboard.native.js +57 -0
- package/dist/jsx/fields/Date/sheetKeyboard.native.js.map +1 -0
- package/dist/jsx/fields/DynamicLink.mjs +37 -128
- package/dist/jsx/fields/DynamicLink.mjs.map +1 -1
- package/dist/jsx/fields/DynamicLink.native.js +40 -138
- package/dist/jsx/fields/DynamicLink.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload.mjs +234 -51
- package/dist/jsx/fields/FileUpload.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload.native.js +242 -51
- package/dist/jsx/fields/FileUpload.native.js.map +1 -1
- package/dist/jsx/fields/FileUploadField/index.mjs +55 -22
- package/dist/jsx/fields/FileUploadField/index.mjs.map +1 -1
- package/dist/jsx/fields/FileUploadField/index.native.js +56 -20
- package/dist/jsx/fields/FileUploadField/index.native.js.map +1 -1
- package/dist/jsx/fields/HTML/index.mjs +33 -54
- package/dist/jsx/fields/HTML/index.mjs.map +1 -1
- package/dist/jsx/fields/HTML/index.native.js +30 -51
- package/dist/jsx/fields/HTML/index.native.js.map +1 -1
- package/dist/jsx/fields/Icon/index.mjs +48 -0
- package/dist/jsx/fields/Icon/index.mjs.map +1 -0
- package/dist/jsx/fields/Icon/index.native.js +76 -0
- package/dist/jsx/fields/Icon/index.native.js.map +1 -0
- package/dist/jsx/fields/Link.mjs +35 -9
- package/dist/jsx/fields/Link.mjs.map +1 -1
- package/dist/jsx/fields/Link.native.js +35 -9
- package/dist/jsx/fields/Link.native.js.map +1 -1
- package/dist/jsx/fields/LinkTree.mjs +89 -0
- package/dist/jsx/fields/LinkTree.mjs.map +1 -0
- package/dist/jsx/fields/LinkTree.native.js +125 -0
- package/dist/jsx/fields/LinkTree.native.js.map +1 -0
- package/dist/jsx/fields/LongText/index.mjs +7 -5
- package/dist/jsx/fields/LongText/index.mjs.map +1 -1
- package/dist/jsx/fields/LongText/index.native.js +6 -4
- package/dist/jsx/fields/LongText/index.native.js.map +1 -1
- package/dist/jsx/fields/Numeric/index.mjs.map +1 -1
- package/dist/jsx/fields/Numeric/index.native.js.map +1 -1
- package/dist/jsx/fields/Password/index.mjs +180 -18
- package/dist/jsx/fields/Password/index.mjs.map +1 -1
- package/dist/jsx/fields/Password/index.native.js +186 -16
- package/dist/jsx/fields/Password/index.native.js.map +1 -1
- package/dist/jsx/fields/Phone/index.mjs.map +1 -1
- package/dist/jsx/fields/Phone/index.native.js.map +1 -1
- package/dist/jsx/fields/ReadOnly/index.mjs +36 -50
- package/dist/jsx/fields/ReadOnly/index.mjs.map +1 -1
- package/dist/jsx/fields/ReadOnly/index.native.js +34 -46
- package/dist/jsx/fields/ReadOnly/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.mjs +1 -1
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +1 -1
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/SmallText/index.mjs +5 -4
- package/dist/jsx/fields/SmallText/index.mjs.map +1 -1
- package/dist/jsx/fields/SmallText/index.native.js +4 -3
- package/dist/jsx/fields/SmallText/index.native.js.map +1 -1
- package/dist/jsx/fields/TableMultiSelect.mjs +41 -152
- package/dist/jsx/fields/TableMultiSelect.mjs.map +1 -1
- package/dist/jsx/fields/TableMultiSelect.native.js +44 -171
- package/dist/jsx/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/jsx/fields/TextEditor/index.mjs +28 -284
- package/dist/jsx/fields/TextEditor/index.mjs.map +1 -1
- package/dist/jsx/index.js +5 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +5 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +9 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/schemaForm/SchemaWizard.mjs +156 -0
- package/dist/jsx/schemaForm/SchemaWizard.mjs.map +1 -0
- package/dist/jsx/schemaForm/SchemaWizard.native.js +232 -0
- package/dist/jsx/schemaForm/SchemaWizard.native.js.map +1 -0
- package/dist/jsx/schemaForm/index.mjs +1 -1
- package/dist/jsx/schemaForm/index.mjs.map +1 -1
- package/dist/jsx/schemaForm/index.native.js +1 -1
- package/dist/jsx/schemaForm/index.native.js.map +1 -1
- package/dist/jsx/shared/useKeyboardInset.mjs +23 -0
- package/dist/jsx/shared/useKeyboardInset.mjs.map +1 -0
- package/dist/jsx/shared/useKeyboardInset.native.js +53 -0
- package/dist/jsx/shared/useKeyboardInset.native.js.map +1 -0
- package/package.json +16 -16
- package/src/FileBrowser/AttachLibrary.tsx +90 -0
- package/src/FileBrowser/FileBrowser.spec.tsx +273 -0
- package/src/FileBrowser/FileBrowser.stories.tsx +97 -0
- package/src/FileBrowser/folderTree.ts +62 -0
- package/src/FileBrowser/index.tsx +765 -0
- package/src/FileBrowser/types.ts +61 -0
- package/src/FileBrowser/viewPersistence.ts +37 -0
- package/src/FormSidebar.stories.tsx +82 -25
- package/src/FormSidebar.tsx +51 -37
- package/src/FrappeAssignment.stories.tsx +158 -12
- package/src/FrappeAssignment.tsx +11 -9
- package/src/FrappeCalendar.stories.tsx +85 -9
- package/src/FrappeCalendar.tsx +9 -9
- package/src/FrappeChartCard.stories.tsx +107 -14
- package/src/FrappeChartCard.tsx +5 -12
- package/src/FrappeDashboard.stories.tsx +79 -9
- package/src/FrappeDashboard.tsx +8 -8
- package/src/FrappeForm.tsx +36 -24
- package/src/FrappeGantt.stories.tsx +73 -4
- package/src/FrappeGantt.tsx +7 -4
- package/src/FrappeImageView.tsx +23 -22
- package/src/FrappeKPICard.stories.tsx +110 -10
- package/src/FrappeKPICard.tsx +6 -22
- package/src/FrappeKanban.stories.tsx +115 -9
- package/src/FrappeKanban.tsx +10 -9
- package/src/FrappeLikedBy.stories.tsx +82 -10
- package/src/FrappeLikedBy.tsx +6 -6
- package/src/FrappeList.stories.tsx +85 -8
- package/src/FrappeListView.spec.tsx +59 -0
- package/src/FrappeListView.tsx +27 -30
- package/src/FrappeProvider.stories.tsx +53 -2
- package/src/FrappeReportBuilder.tsx +21 -34
- package/src/FrappeReportView.tsx +4 -4
- package/src/FrappeTreeView.tsx +8 -4
- package/src/components/attachments.stories.tsx +79 -7
- package/src/components/tags.stories.tsx +131 -6
- package/src/components/timeline.stories.tsx +128 -7
- package/src/desk/Awesomebar.stories.tsx +3 -2
- package/src/desk/DeskFormPage.tsx +3 -2
- package/src/desk/DeskListPage.tsx +2 -1
- package/src/desk/DeskShell.stories.tsx +21 -2
- package/src/desk/DeskShell.tsx +56 -39
- package/src/desk/awesomebar.tsx +33 -22
- package/src/fieldRegistry.spec.tsx +131 -1
- package/src/fieldRegistry.ts +100 -4
- package/src/fields/Barcode/Barcode.stories.tsx +32 -0
- package/src/fields/Check/Check.spec.tsx +27 -0
- package/src/fields/Check/Check.stories.tsx +58 -0
- package/src/fields/Check/index.tsx +7 -1
- package/src/fields/CodeEditor/CodeEditor.stories.tsx +32 -0
- package/src/fields/Color/Color.spec.tsx +21 -0
- package/src/fields/Color/Color.stories.tsx +33 -0
- package/src/fields/Color/index.tsx +7 -1
- package/src/fields/Data/Data.spec.tsx +26 -0
- package/src/fields/Data/Data.stories.tsx +58 -0
- package/src/fields/Data/index.tsx +6 -0
- package/src/fields/Date/Date.stories.tsx +32 -0
- package/src/fields/Date/Datetime.stories.tsx +32 -0
- package/src/fields/Date/index.native.tsx +45 -33
- package/src/fields/Date/nativePresentation.spec.tsx +20 -0
- package/src/fields/Date/sheetKeyboard.spec.ts +51 -0
- package/src/fields/Date/sheetKeyboard.ts +37 -0
- package/src/fields/DateRange/DateRange.stories.tsx +41 -0
- package/src/fields/Duration/Duration.stories.tsx +32 -0
- package/src/fields/DynamicLink.stories.tsx +115 -14
- package/src/fields/DynamicLink.tsx +43 -125
- package/src/fields/FileUpload.tsx +273 -54
- package/src/fields/FileUploadField/FileUploadField.stories.tsx +87 -0
- package/src/fields/FileUploadField/index.tsx +73 -25
- package/src/fields/FrappeFileUpload.stories.tsx +32 -0
- package/src/fields/Geolocation/Geolocation.stories.tsx +33 -0
- package/src/fields/HTML/Html.stories.tsx +59 -0
- package/src/fields/HTML/index.tsx +25 -34
- package/src/fields/Heading/Heading.stories.tsx +63 -2
- package/src/fields/Icon/index.tsx +90 -0
- package/src/fields/Link.spec.tsx +10 -0
- package/src/fields/Link.stories.tsx +161 -2
- package/src/fields/Link.tree.spec.tsx +111 -0
- package/src/fields/Link.tsx +36 -19
- package/src/fields/LinkTree.tsx +102 -0
- package/src/fields/LongText/LongText.stories.tsx +66 -0
- package/src/fields/LongText/index.tsx +13 -5
- package/src/fields/MarkdownEditor/MarkdownEditor.stories.tsx +36 -0
- package/src/fields/MentionInput/MentionInput.stories.tsx +44 -0
- package/src/fields/Numeric/Numeric.spec.tsx +7 -0
- package/src/fields/Numeric/Numeric.stories.tsx +32 -0
- package/src/fields/Numeric/index.tsx +7 -0
- package/src/fields/OTPInput/OTPInput.stories.tsx +33 -0
- package/src/fields/Password/Password.spec.tsx +119 -0
- package/src/fields/Password/Password.stories.tsx +58 -0
- package/src/fields/Password/index.tsx +234 -23
- package/src/fields/Phone/Phone.stories.tsx +33 -0
- package/src/fields/Phone/index.tsx +4 -0
- package/src/fields/Progress/Progress.stories.tsx +32 -0
- package/src/fields/RadioGroup/RadioGroup.stories.tsx +37 -0
- package/src/fields/Rating/Rating.stories.tsx +33 -0
- package/src/fields/ReadOnly/ReadOnly.stories.tsx +54 -0
- package/src/fields/ReadOnly/index.tsx +41 -55
- package/src/fields/Select/Select.stories.tsx +43 -0
- package/src/fields/Select/index.tsx +5 -1
- package/src/fields/Signature/Signature.stories.tsx +32 -0
- package/src/fields/Slider/Slider.stories.tsx +32 -0
- package/src/fields/SmallText/SmallText.stories.tsx +58 -0
- package/src/fields/SmallText/index.tsx +9 -4
- package/src/fields/Switch/Switch.stories.tsx +33 -0
- package/src/fields/TableMultiSelect.spec.tsx +26 -5
- package/src/fields/TableMultiSelect.stories.tsx +90 -14
- package/src/fields/TableMultiSelect.tsx +55 -177
- package/src/fields/TextEditor/TextEditor.spec.tsx +5 -3
- package/src/fields/TextEditor/TextEditor.stories.tsx +66 -0
- package/src/fields/TextEditor/index.tsx +32 -299
- package/src/fields/TimePicker/TimePicker.stories.tsx +32 -0
- package/src/fields/ToggleGroup/ToggleGroup.stories.tsx +35 -0
- package/src/frappeRemainder.designLaw.spec.ts +176 -0
- package/src/frappeViews.designLaw.spec.ts +94 -0
- package/src/index.ts +18 -1
- package/src/schemaForm/SchemaForm.spec.tsx +154 -0
- package/src/schemaForm/SchemaForm.stories.tsx +27 -0
- package/src/schemaForm/SchemaWizard.spec.tsx +134 -0
- package/src/schemaForm/SchemaWizard.stories.tsx +94 -0
- package/src/schemaForm/SchemaWizard.tsx +192 -0
- package/src/schemaForm/index.tsx +3 -4
- package/src/shared/useKeyboardInset.ts +45 -0
- package/types/FileBrowser/AttachLibrary.d.ts +13 -0
- package/types/FileBrowser/AttachLibrary.d.ts.map +1 -0
- package/types/FileBrowser/folderTree.d.ts +15 -0
- package/types/FileBrowser/folderTree.d.ts.map +1 -0
- package/types/FileBrowser/index.d.ts +4 -0
- package/types/FileBrowser/index.d.ts.map +1 -0
- package/types/FileBrowser/types.d.ts +59 -0
- package/types/FileBrowser/types.d.ts.map +1 -0
- package/types/FileBrowser/viewPersistence.d.ts +4 -0
- package/types/FileBrowser/viewPersistence.d.ts.map +1 -0
- package/types/FormSidebar.d.ts.map +1 -1
- package/types/FrappeAssignment.d.ts.map +1 -1
- package/types/FrappeChartCard.d.ts.map +1 -1
- package/types/FrappeDashboard.d.ts.map +1 -1
- package/types/FrappeForm.d.ts.map +1 -1
- package/types/FrappeGantt.d.ts.map +1 -1
- package/types/FrappeImageView.d.ts.map +1 -1
- package/types/FrappeKPICard.d.ts.map +1 -1
- package/types/FrappeKanban.d.ts.map +1 -1
- package/types/FrappeListView.d.ts.map +1 -1
- package/types/FrappeReportBuilder.d.ts.map +1 -1
- package/types/FrappeReportView.d.ts.map +1 -1
- package/types/FrappeTreeView.d.ts.map +1 -1
- package/types/desk/DeskFormPage.d.ts.map +1 -1
- package/types/desk/DeskListPage.d.ts.map +1 -1
- package/types/desk/DeskShell.d.ts +4 -2
- package/types/desk/DeskShell.d.ts.map +1 -1
- package/types/desk/awesomebar.d.ts.map +1 -1
- package/types/fieldRegistry.d.ts.map +1 -1
- package/types/fields/Check/index.d.ts +6 -0
- package/types/fields/Check/index.d.ts.map +1 -1
- package/types/fields/Color/index.d.ts +6 -0
- package/types/fields/Color/index.d.ts.map +1 -1
- package/types/fields/Data/index.d.ts +6 -0
- package/types/fields/Data/index.d.ts.map +1 -1
- package/types/fields/Date/index.native.d.ts +5 -0
- package/types/fields/Date/index.native.d.ts.map +1 -1
- package/types/fields/Date/sheetKeyboard.d.ts +19 -0
- package/types/fields/Date/sheetKeyboard.d.ts.map +1 -0
- package/types/fields/DynamicLink.d.ts.map +1 -1
- package/types/fields/FileUpload.d.ts +11 -1
- package/types/fields/FileUpload.d.ts.map +1 -1
- package/types/fields/FileUploadField/index.d.ts +8 -1
- package/types/fields/FileUploadField/index.d.ts.map +1 -1
- package/types/fields/HTML/index.d.ts.map +1 -1
- package/types/fields/Icon/index.d.ts +15 -0
- package/types/fields/Icon/index.d.ts.map +1 -0
- package/types/fields/Link.d.ts +6 -1
- package/types/fields/Link.d.ts.map +1 -1
- package/types/fields/LinkTree.d.ts +3 -0
- package/types/fields/LinkTree.d.ts.map +1 -0
- package/types/fields/LongText/index.d.ts +4 -0
- package/types/fields/LongText/index.d.ts.map +1 -1
- package/types/fields/Numeric/index.d.ts +7 -0
- package/types/fields/Numeric/index.d.ts.map +1 -1
- package/types/fields/Password/index.d.ts +1 -0
- package/types/fields/Password/index.d.ts.map +1 -1
- package/types/fields/Phone/index.d.ts +4 -0
- package/types/fields/Phone/index.d.ts.map +1 -1
- package/types/fields/ReadOnly/index.d.ts.map +1 -1
- package/types/fields/Select/index.d.ts +4 -0
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/fields/SmallText/index.d.ts +4 -0
- package/types/fields/SmallText/index.d.ts.map +1 -1
- package/types/fields/TableMultiSelect.d.ts +2 -1
- package/types/fields/TableMultiSelect.d.ts.map +1 -1
- package/types/fields/TextEditor/index.d.ts +2 -3
- package/types/fields/TextEditor/index.d.ts.map +1 -1
- package/types/index.d.ts +7 -1
- package/types/index.d.ts.map +1 -1
- package/types/schemaForm/SchemaWizard.d.ts +20 -0
- package/types/schemaForm/SchemaWizard.d.ts.map +1 -0
- package/types/schemaForm/index.d.ts.map +1 -1
- package/types/shared/useKeyboardInset.d.ts +18 -0
- package/types/shared/useKeyboardInset.d.ts.map +1 -0
|
@@ -2,6 +2,7 @@ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
|
2
2
|
import { XStack, YStack } from "tamagui";
|
|
3
3
|
import { ChartCard } from "./FrappeDashboard";
|
|
4
4
|
import { FrappeChartCard } from "./FrappeChartCard";
|
|
5
|
+
import { FrappeProvider } from "./FrappeProvider";
|
|
5
6
|
import { FrappeStoryProvider } from "./frappeStoryTarget";
|
|
6
7
|
|
|
7
8
|
export default {
|
|
@@ -13,12 +14,79 @@ export default {
|
|
|
13
14
|
docs: {
|
|
14
15
|
description: {
|
|
15
16
|
component:
|
|
16
|
-
"ChartCard as re-exported by @multiplatform.one/frappe-ui (the 'Frappe ChartCard' bridge). Same component object as the components-package ChartCard; stories exercise chart modes and series edge cases.",
|
|
17
|
+
"ChartCard as re-exported by @multiplatform.one/frappe-ui (the 'Frappe ChartCard' bridge). Same component object as the components-package ChartCard; stories exercise chart modes and series edge cases. The dataSource story is network-hermetic (G-15/D-05): documents come from InMemoryFixtureProvider and DocType meta from an in-story fetch mock, so nothing leaves the machine. The separately-named Live story is the live-bench arm — it targets STORYBOOK_FRAPPE_URL when reachable and falls back to fixtures otherwise.",
|
|
17
18
|
},
|
|
18
19
|
},
|
|
19
20
|
},
|
|
20
21
|
};
|
|
21
22
|
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Hermetic story host (G-15 story honesty / D-05, closes UX-P18).
|
|
25
|
+
//
|
|
26
|
+
// The FrappeChartCard dataSource path previously rode FrappeStoryProvider,
|
|
27
|
+
// whose offline fallback is https://demo.frappe.cloud. The fixture provider
|
|
28
|
+
// serves the *collection*, but DocType meta still resolves over HTTP — so
|
|
29
|
+
// native Storybook / Kitchen Sink fired a real cross-origin request the
|
|
30
|
+
// browser rejected with CORS. MOCK_HOST keeps the same code path (real
|
|
31
|
+
// fetch, real meta shape) without leaving the machine.
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
const MOCK_HOST = "https://frappechartcard.mock.test";
|
|
35
|
+
|
|
36
|
+
function todoMetaRaw(name: string) {
|
|
37
|
+
return {
|
|
38
|
+
name,
|
|
39
|
+
module: "Desk",
|
|
40
|
+
title_field: "description",
|
|
41
|
+
fields: [
|
|
42
|
+
{ fieldname: "description", fieldtype: "Small Text", label: "Description", in_list_view: 1 },
|
|
43
|
+
{
|
|
44
|
+
fieldname: "status",
|
|
45
|
+
fieldtype: "Select",
|
|
46
|
+
label: "Status",
|
|
47
|
+
options: "Open\nClosed\nCancelled",
|
|
48
|
+
in_list_view: 1,
|
|
49
|
+
in_standard_filter: 1,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function jsonResponse(body: unknown, status = 200): Response {
|
|
57
|
+
return new Response(JSON.stringify(body), {
|
|
58
|
+
status,
|
|
59
|
+
headers: { "Content-Type": "application/json" },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
(() => {
|
|
64
|
+
if (typeof window === "undefined") return;
|
|
65
|
+
const w = window as unknown as Record<string, unknown>;
|
|
66
|
+
if (w.__frappeChartCardMockFetch) return;
|
|
67
|
+
w.__frappeChartCardMockFetch = true;
|
|
68
|
+
const realFetch = window.fetch.bind(window);
|
|
69
|
+
window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
70
|
+
const urlStr =
|
|
71
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
72
|
+
if (urlStr.startsWith(MOCK_HOST)) {
|
|
73
|
+
const url = new URL(urlStr);
|
|
74
|
+
if (url.pathname === "/api/method/frappe.desk.form.load.getdoctype") {
|
|
75
|
+
const doctype = url.searchParams.get("doctype") || "ToDo";
|
|
76
|
+
return jsonResponse({ docs: [todoMetaRaw(decodeURIComponent(doctype))] });
|
|
77
|
+
}
|
|
78
|
+
const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
|
|
79
|
+
if (metaMatch) return jsonResponse({ data: todoMetaRaw(decodeURIComponent(metaMatch[1])) });
|
|
80
|
+
if (url.pathname === "/api/resource/DocType") {
|
|
81
|
+
return jsonResponse({ data: [{ name: "ToDo", module: "Desk" }] });
|
|
82
|
+
}
|
|
83
|
+
// Everything else (guest field-peek, counts, group_by): empty, never the network.
|
|
84
|
+
return jsonResponse({ data: [] });
|
|
85
|
+
}
|
|
86
|
+
return realFetch(input as RequestInfo, init);
|
|
87
|
+
};
|
|
88
|
+
})();
|
|
89
|
+
|
|
22
90
|
const monthly = [
|
|
23
91
|
{ label: "Jan", value: 12 },
|
|
24
92
|
{ label: "Feb", value: 19 },
|
|
@@ -97,10 +165,10 @@ export const CustomHeightAndColors = () => (
|
|
|
97
165
|
);
|
|
98
166
|
|
|
99
167
|
// ---------------------------------------------------------------------------
|
|
100
|
-
//
|
|
101
|
-
// group, computed
|
|
102
|
-
//
|
|
103
|
-
//
|
|
168
|
+
// Hermetic grouped aggregate (FrappeChartCard + dataSource): one data point
|
|
169
|
+
// per group, computed from fixtures. Native Storybook / Kitchen Sink show
|
|
170
|
+
// this path — never demo.frappe.cloud. Palette is left to the canonical
|
|
171
|
+
// tokenized chart palette defaults (LC-27).
|
|
104
172
|
// ---------------------------------------------------------------------------
|
|
105
173
|
|
|
106
174
|
const liveTodoFixtures = [
|
|
@@ -109,21 +177,46 @@ const liveTodoFixtures = [
|
|
|
109
177
|
{ name: "TD-3", doctype: "ToDo", description: "Fixture todo C", status: "Closed" },
|
|
110
178
|
];
|
|
111
179
|
|
|
112
|
-
|
|
180
|
+
const todoByStatusChart = (
|
|
181
|
+
<YStack width={480} testID="live-todo-by-status">
|
|
182
|
+
<FrappeChartCard
|
|
183
|
+
config={{ id: "todo-by-status", title: "ToDos by Status", type: "bar", showLabels: true }}
|
|
184
|
+
dataSource={{ doctype: "ToDo", groupBy: "status" }}
|
|
185
|
+
/>
|
|
186
|
+
</YStack>
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
export const ToDoByStatus = () => (
|
|
190
|
+
<FrappeProvider
|
|
191
|
+
baseURL={MOCK_HOST}
|
|
192
|
+
fixtures={new InMemoryFixtureProvider({ ToDo: liveTodoFixtures })}
|
|
193
|
+
>
|
|
194
|
+
{todoByStatusChart}
|
|
195
|
+
</FrappeProvider>
|
|
196
|
+
);
|
|
197
|
+
ToDoByStatus.parameters = {
|
|
198
|
+
docs: {
|
|
199
|
+
description: {
|
|
200
|
+
story:
|
|
201
|
+
"Hermetic bar chart: count of fixture ToDo documents grouped by status. MOCK_HOST plus the in-story fetch intercept serve DocType meta so native Storybook never hits demo.frappe.cloud.",
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// Live grouped aggregate: bench when reachable, fixtures otherwise.
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
|
|
210
|
+
export const Live = () => (
|
|
113
211
|
<FrappeStoryProvider fixtures={new InMemoryFixtureProvider({ ToDo: liveTodoFixtures })}>
|
|
114
|
-
|
|
115
|
-
<FrappeChartCard
|
|
116
|
-
config={{ id: "todo-by-status", title: "ToDos by Status", type: "bar", showLabels: true }}
|
|
117
|
-
dataSource={{ doctype: "ToDo", groupBy: "status" }}
|
|
118
|
-
/>
|
|
119
|
-
</YStack>
|
|
212
|
+
{todoByStatusChart}
|
|
120
213
|
</FrappeStoryProvider>
|
|
121
214
|
);
|
|
122
|
-
|
|
215
|
+
Live.parameters = {
|
|
123
216
|
docs: {
|
|
124
217
|
description: {
|
|
125
218
|
story:
|
|
126
|
-
"LIVE bar chart: count of ToDo documents grouped by status, aggregated server-side and refetched with a 300ms coalescing window on realtime list_update / doc_update / doc_deleted. Create/close/delete ToDos on the bench and the bars move in place — no reload.",
|
|
219
|
+
"LIVE bar chart: count of ToDo documents grouped by status, aggregated server-side and refetched with a 300ms coalescing window on realtime list_update / doc_update / doc_deleted. Create/close/delete ToDos on the bench and the bars move in place — no reload. Fixture fallback when the bench is unreachable.",
|
|
127
220
|
},
|
|
128
221
|
},
|
|
129
222
|
};
|
package/src/FrappeChartCard.tsx
CHANGED
|
@@ -18,13 +18,14 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import {
|
|
20
20
|
AsyncBoundary,
|
|
21
|
+
Card,
|
|
21
22
|
Skeleton,
|
|
22
23
|
type ChartCardProps,
|
|
23
24
|
type ChartConfig,
|
|
24
25
|
} from "@multiplatform.one/components";
|
|
25
26
|
import React, { useMemo } from "react";
|
|
26
27
|
import { useTranslation } from "react-i18next";
|
|
27
|
-
import {
|
|
28
|
+
import { YStack, type YStackProps } from "tamagui";
|
|
28
29
|
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
29
30
|
import { ChartCard } from "./FrappeDashboard";
|
|
30
31
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
@@ -73,17 +74,9 @@ function ChartCardSkeleton({
|
|
|
73
74
|
const { t } = useTranslation();
|
|
74
75
|
return (
|
|
75
76
|
<YStack {...knobProps.gap} aria-busy aria-label={t("Loading")} {...stackProps}>
|
|
76
|
-
<Skeleton width="40%"
|
|
77
|
-
<Card
|
|
78
|
-
|
|
79
|
-
borderRadius={knobProps.borderRadius.borderRadius}
|
|
80
|
-
elevation={knobProps.elevation}
|
|
81
|
-
borderWidth={1}
|
|
82
|
-
borderColor="$borderColor"
|
|
83
|
-
>
|
|
84
|
-
<Card.Footer {...knobProps.panelPadding}>
|
|
85
|
-
<Skeleton variant="rounded" width="100%" height={height} />
|
|
86
|
-
</Card.Footer>
|
|
77
|
+
<Skeleton width="40%" />
|
|
78
|
+
<Card>
|
|
79
|
+
<Skeleton variant="rounded" width="100%" height={height} />
|
|
87
80
|
</Card>
|
|
88
81
|
</YStack>
|
|
89
82
|
);
|
|
@@ -12,12 +12,85 @@ export default {
|
|
|
12
12
|
status: { type: "stable" },
|
|
13
13
|
docs: {
|
|
14
14
|
description: {
|
|
15
|
-
component:
|
|
15
|
+
component:
|
|
16
|
+
"A dashboard component with KPI cards and charts for visualizing Frappe data. Fixture stories are network-hermetic (G-15/D-05): documents come from InMemoryFixtureProvider and DocType meta from an in-story fetch mock, so nothing leaves the machine. The separately-named Live story is the live-bench arm — it targets STORYBOOK_FRAPPE_URL when reachable and falls back to fixtures otherwise.",
|
|
16
17
|
},
|
|
17
18
|
},
|
|
18
19
|
},
|
|
19
20
|
};
|
|
20
21
|
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Hermetic story host (G-15 story honesty / D-05, closes UX-P18).
|
|
24
|
+
//
|
|
25
|
+
// Fixture-backed stories previously pointed at https://demo.frappe.cloud. The
|
|
26
|
+
// fixture provider serves the *collection*, but Frappe still resolves DocType
|
|
27
|
+
// meta over HTTP — so those stories fired a real cross-origin request that the
|
|
28
|
+
// browser rejected with a CORS error, poisoning the console for every
|
|
29
|
+
// automated probe. MOCK_HOST keeps the same code path (real fetch, real meta
|
|
30
|
+
// shape) without leaving the machine; ERR_HOST is the deliberate failure host
|
|
31
|
+
// for the error-state story.
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
const MOCK_HOST = "https://frappedashboard.mock.test";
|
|
35
|
+
const ERR_HOST = "https://forbidden.frappedashboard.mock.test";
|
|
36
|
+
|
|
37
|
+
function salesOrderMetaRaw(name: string) {
|
|
38
|
+
return {
|
|
39
|
+
name,
|
|
40
|
+
module: "Selling",
|
|
41
|
+
title_field: "name",
|
|
42
|
+
fields: [
|
|
43
|
+
{ fieldname: "total", fieldtype: "Currency", label: "Total", in_list_view: 1 },
|
|
44
|
+
{
|
|
45
|
+
fieldname: "status",
|
|
46
|
+
fieldtype: "Select",
|
|
47
|
+
label: "Status",
|
|
48
|
+
options: "Completed\nPending",
|
|
49
|
+
in_list_view: 1,
|
|
50
|
+
in_standard_filter: 1,
|
|
51
|
+
},
|
|
52
|
+
{ fieldname: "region", fieldtype: "Data", label: "Region", in_list_view: 1 },
|
|
53
|
+
],
|
|
54
|
+
permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function jsonResponse(body: unknown, status = 200): Response {
|
|
59
|
+
return new Response(JSON.stringify(body), {
|
|
60
|
+
status,
|
|
61
|
+
headers: { "Content-Type": "application/json" },
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
(() => {
|
|
66
|
+
if (typeof window === "undefined") return;
|
|
67
|
+
const w = window as unknown as Record<string, unknown>;
|
|
68
|
+
if (w.__frappeDashboardMockFetch) return;
|
|
69
|
+
w.__frappeDashboardMockFetch = true;
|
|
70
|
+
const realFetch = window.fetch.bind(window);
|
|
71
|
+
window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
72
|
+
const urlStr =
|
|
73
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
74
|
+
if (urlStr.startsWith(ERR_HOST)) return jsonResponse({ message: "Not permitted" }, 403);
|
|
75
|
+
if (urlStr.startsWith(MOCK_HOST)) {
|
|
76
|
+
const url = new URL(urlStr);
|
|
77
|
+
if (url.pathname === "/api/method/frappe.desk.form.load.getdoctype") {
|
|
78
|
+
const doctype = url.searchParams.get("doctype") || "SalesOrder";
|
|
79
|
+
return jsonResponse({ docs: [salesOrderMetaRaw(doctype)] });
|
|
80
|
+
}
|
|
81
|
+
const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
|
|
82
|
+
if (metaMatch)
|
|
83
|
+
return jsonResponse({ data: salesOrderMetaRaw(decodeURIComponent(metaMatch[1])) });
|
|
84
|
+
if (url.pathname === "/api/resource/DocType") {
|
|
85
|
+
return jsonResponse({ data: [{ name: "SalesOrder", module: "Selling" }] });
|
|
86
|
+
}
|
|
87
|
+
// Everything else (guest field-peek, counts): empty, never the network.
|
|
88
|
+
return jsonResponse({ data: [] });
|
|
89
|
+
}
|
|
90
|
+
return realFetch(input as RequestInfo, init);
|
|
91
|
+
};
|
|
92
|
+
})();
|
|
93
|
+
|
|
21
94
|
// KPI Card Stories
|
|
22
95
|
export const KPICardDefault = () => (
|
|
23
96
|
<KPICard
|
|
@@ -189,7 +262,7 @@ const widgets: DashboardWidget[] = [
|
|
|
189
262
|
|
|
190
263
|
/** Static widgets only — does not exercise the live dataSource path. */
|
|
191
264
|
export const StaticWidgets = () => (
|
|
192
|
-
<FrappeProvider baseURL=
|
|
265
|
+
<FrappeProvider baseURL={MOCK_HOST}>
|
|
193
266
|
<FrappeDashboard title="Sales (static)" widgets={widgets} columns={4} />
|
|
194
267
|
</FrappeProvider>
|
|
195
268
|
);
|
|
@@ -209,7 +282,7 @@ StaticWidgets.parameters = {
|
|
|
209
282
|
*/
|
|
210
283
|
export const SalesDashboard = () => (
|
|
211
284
|
<FrappeProvider
|
|
212
|
-
baseURL=
|
|
285
|
+
baseURL={MOCK_HOST}
|
|
213
286
|
fixtures={new InMemoryFixtureProvider({ SalesOrder: salesFixtures })}
|
|
214
287
|
>
|
|
215
288
|
<FrappeDashboard<SalesOrder>
|
|
@@ -336,7 +409,7 @@ class PendingFixtureProvider extends InMemoryFixtureProvider {
|
|
|
336
409
|
* p-results/state-triplet-coverage.md.
|
|
337
410
|
*/
|
|
338
411
|
export const Loading = () => (
|
|
339
|
-
<FrappeProvider baseURL=
|
|
412
|
+
<FrappeProvider baseURL={MOCK_HOST} fixtures={new PendingFixtureProvider()}>
|
|
340
413
|
<FrappeDashboard<SalesOrder>
|
|
341
414
|
title="Sales"
|
|
342
415
|
columns={4}
|
|
@@ -348,10 +421,7 @@ export const Loading = () => (
|
|
|
348
421
|
|
|
349
422
|
/** Zero documents and no static widgets — the Dashboard's neutral empty state (empty ≠ error). */
|
|
350
423
|
export const Empty = () => (
|
|
351
|
-
<FrappeProvider
|
|
352
|
-
baseURL="https://demo.frappe.cloud"
|
|
353
|
-
fixtures={new InMemoryFixtureProvider({ SalesOrder: [] })}
|
|
354
|
-
>
|
|
424
|
+
<FrappeProvider baseURL={MOCK_HOST} fixtures={new InMemoryFixtureProvider({ SalesOrder: [] })}>
|
|
355
425
|
<FrappeDashboard<SalesOrder>
|
|
356
426
|
title="Sales"
|
|
357
427
|
columns={4}
|
|
@@ -363,7 +433,7 @@ export const Empty = () => (
|
|
|
363
433
|
|
|
364
434
|
/** Live path with a broken host — exercises the error render prop (SB-M-806). */
|
|
365
435
|
export const LoadError = () => (
|
|
366
|
-
<FrappeProvider baseURL=
|
|
436
|
+
<FrappeProvider baseURL={ERR_HOST}>
|
|
367
437
|
<FrappeDashboard<SalesOrder>
|
|
368
438
|
title="Sales"
|
|
369
439
|
columns={4}
|
package/src/FrappeDashboard.tsx
CHANGED
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
type ChartDataPoint,
|
|
11
11
|
type DashboardWidget,
|
|
12
12
|
} from "@multiplatform.one/components";
|
|
13
|
+
import { Button, Spinner, formCommonColors } from "@multiplatform.one/forms";
|
|
13
14
|
import { ArrowsClockwiseIcon } from "@phosphor-icons/react";
|
|
14
15
|
import React, { useMemo, useCallback, useState, useEffect, useRef } from "react";
|
|
15
16
|
import { useTranslation } from "react-i18next";
|
|
16
|
-
import { Button, Spinner } from "@multiplatform.one/forms";
|
|
17
17
|
import { Text, XStack, YStack, type YStackProps, H3 } from "tamagui";
|
|
18
18
|
import { formatTimeOfDay, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
19
19
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
@@ -168,7 +168,7 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
|
|
|
168
168
|
return (
|
|
169
169
|
<YStack {...knobProps.panelPadding} alignItems="center" {...stackProps}>
|
|
170
170
|
<Spinner size="large" />
|
|
171
|
-
<Text color=
|
|
171
|
+
<Text color={formCommonColors.muted} marginTop="$2" {...knobProps.body}>
|
|
172
172
|
{t("Loading dashboard...")}
|
|
173
173
|
</Text>
|
|
174
174
|
</YStack>
|
|
@@ -180,8 +180,8 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
|
|
|
180
180
|
if (error) return <>{error(err)}</>;
|
|
181
181
|
return (
|
|
182
182
|
<YStack {...knobProps.panelPadding} alignItems="center" {...stackProps} {...knobProps.gap}>
|
|
183
|
-
<Text color=
|
|
184
|
-
<Text color=
|
|
183
|
+
<Text color={formCommonColors.error}>{t("Failed to load dashboard")}</Text>
|
|
184
|
+
<Text color={formCommonColors.muted} {...knobProps.body}>
|
|
185
185
|
{err.message}
|
|
186
186
|
</Text>
|
|
187
187
|
</YStack>
|
|
@@ -197,11 +197,11 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
|
|
|
197
197
|
alignItems="center"
|
|
198
198
|
paddingBottom={0}
|
|
199
199
|
>
|
|
200
|
-
{title ? <H3>{title}</H3> : <YStack flex={1} />}
|
|
200
|
+
{title ? <H3 {...knobProps.heading}>{title}</H3> : <YStack flex={1} />}
|
|
201
201
|
{showRefresh && (
|
|
202
202
|
<XStack {...knobProps.gap} alignItems="center">
|
|
203
203
|
{isLiveStale && <Spinner size="small" aria-label={t("Updating")} />}
|
|
204
|
-
<Text
|
|
204
|
+
<Text color={formCommonColors.muted} {...knobProps.label}>
|
|
205
205
|
{t("Last updated: {{time}}", {
|
|
206
206
|
time: formatTimeOfDay(dataUpdatedAt ?? lastRefresh),
|
|
207
207
|
})}
|
|
@@ -318,10 +318,10 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
|
|
|
318
318
|
alignItems="center"
|
|
319
319
|
paddingBottom={0}
|
|
320
320
|
>
|
|
321
|
-
{title ? <H3>{title}</H3> : <YStack flex={1} />}
|
|
321
|
+
{title ? <H3 {...knobProps.heading}>{title}</H3> : <YStack flex={1} />}
|
|
322
322
|
<XStack {...knobProps.gap} alignItems="center">
|
|
323
323
|
{autoRefresh && (
|
|
324
|
-
<Text
|
|
324
|
+
<Text color={formCommonColors.muted} {...knobProps.label}>
|
|
325
325
|
{t("Last updated: {{time}}", { time: formatTimeOfDay(lastRefresh) })}
|
|
326
326
|
</Text>
|
|
327
327
|
)}
|
package/src/FrappeForm.tsx
CHANGED
|
@@ -24,8 +24,8 @@ import type React from "react";
|
|
|
24
24
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
25
25
|
import type { TFunction } from "i18next";
|
|
26
26
|
import { useTranslation } from "react-i18next";
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
27
|
+
import { Button, formCommonColors } from "@multiplatform.one/forms";
|
|
28
|
+
import { Text, XStack, YStack } from "tamagui";
|
|
29
29
|
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
30
30
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
31
31
|
import { FrappeReconnectIndicator } from "./FrappeReconnectIndicator";
|
|
@@ -117,11 +117,9 @@ function mapMetaToFormSchema(meta: DocTypeMeta, sectionOverrides?: FormSection[]
|
|
|
117
117
|
const genericSections: GenericFormSection[] = sections.map((section) => ({
|
|
118
118
|
label: section.label,
|
|
119
119
|
collapsible: section.collapsible,
|
|
120
|
-
columns: section.columns.map(
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}),
|
|
124
|
-
),
|
|
120
|
+
columns: section.columns.map((col): GenericFormColumn => ({
|
|
121
|
+
fields: col.fields.map(mapFieldToGenericSchema),
|
|
122
|
+
})),
|
|
125
123
|
}));
|
|
126
124
|
|
|
127
125
|
// Flat list of all fields for depends_on pre-compilation
|
|
@@ -633,8 +631,10 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
633
631
|
if (!children && metaError && !meta) {
|
|
634
632
|
return (
|
|
635
633
|
<YStack {...knobProps.panelPadding} alignItems="center" {...knobProps.gap}>
|
|
636
|
-
<Text color=
|
|
637
|
-
|
|
634
|
+
<Text color={formCommonColors.error} {...knobProps.body}>
|
|
635
|
+
{t("Failed to load {{doctype}} form", { doctype })}
|
|
636
|
+
</Text>
|
|
637
|
+
<Text color={formCommonColors.muted} {...knobProps.body}>
|
|
638
638
|
{metaError.message}
|
|
639
639
|
</Text>
|
|
640
640
|
</YStack>
|
|
@@ -654,8 +654,10 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
654
654
|
if (name && !liveDoc?.isLoading && !liveDoc?.data && !wasDeleted) {
|
|
655
655
|
return (
|
|
656
656
|
<YStack {...knobProps.panelPadding} alignItems="center" {...knobProps.gap}>
|
|
657
|
-
<Text color=
|
|
658
|
-
|
|
657
|
+
<Text color={formCommonColors.error} {...knobProps.body}>
|
|
658
|
+
{t("{{doctype}} not found", { doctype })}
|
|
659
|
+
</Text>
|
|
660
|
+
<Text color={formCommonColors.muted} {...knobProps.body}>
|
|
659
661
|
{t("Document {{name}} does not exist or could not be loaded.", { name })}
|
|
660
662
|
</Text>
|
|
661
663
|
</YStack>
|
|
@@ -691,7 +693,7 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
691
693
|
backgroundColor="$red3"
|
|
692
694
|
testID="frappe-form-deleted-banner"
|
|
693
695
|
>
|
|
694
|
-
<Text color=
|
|
696
|
+
<Text color={formCommonColors.error} {...knobProps.body}>
|
|
695
697
|
{hasUnsavedChanges
|
|
696
698
|
? t(
|
|
697
699
|
"This {{doctype}} was deleted on the server. Fields are read-only and your unsaved edits can no longer be saved.",
|
|
@@ -713,7 +715,7 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
713
715
|
backgroundColor="$orange3"
|
|
714
716
|
testID="frappe-form-conflict-banner"
|
|
715
717
|
>
|
|
716
|
-
<Text color="$orange11"
|
|
718
|
+
<Text color="$orange11" {...knobProps.body}>
|
|
717
719
|
{t(
|
|
718
720
|
"Changed elsewhere while you were editing: {{fields}}. Your edits are kept — saving will overwrite the newer server values.",
|
|
719
721
|
{ fields: conflictLabels },
|
|
@@ -767,12 +769,14 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
767
769
|
) : (
|
|
768
770
|
// Metadata unavailable (should be covered by metaError branch above)
|
|
769
771
|
<YStack {...knobProps.panelPadding} alignItems="center">
|
|
770
|
-
<Text color=
|
|
772
|
+
<Text color={formCommonColors.muted} {...knobProps.body}>
|
|
773
|
+
{t("Form schema unavailable")}
|
|
774
|
+
</Text>
|
|
771
775
|
</YStack>
|
|
772
776
|
)}
|
|
773
777
|
|
|
774
778
|
{errors.general && (
|
|
775
|
-
<Text color=
|
|
779
|
+
<Text color={formCommonColors.error} {...knobProps.body}>
|
|
776
780
|
{errors.general}
|
|
777
781
|
</Text>
|
|
778
782
|
)}
|
|
@@ -785,17 +789,20 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
785
789
|
paddingTop="$3"
|
|
786
790
|
>
|
|
787
791
|
{hasUnsavedChanges && (
|
|
788
|
-
<Text color="$
|
|
792
|
+
<Text color="$orange11" marginInlineEnd="auto" {...knobProps.body}>
|
|
789
793
|
{t("Not Saved")}
|
|
790
794
|
</Text>
|
|
791
795
|
)}
|
|
792
796
|
|
|
793
797
|
{name && onDelete && !wasDeleted && (
|
|
794
798
|
<Button
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
icon={
|
|
798
|
-
|
|
799
|
+
outlined
|
|
800
|
+
error
|
|
801
|
+
icon={TrashIcon}
|
|
802
|
+
loading={isSubmitting}
|
|
803
|
+
disabled={effectiveDisabled}
|
|
804
|
+
disabledReason={t("Form is read-only")}
|
|
805
|
+
disabledReasonPlacement="inline"
|
|
799
806
|
onPress={handleDelete}
|
|
800
807
|
>
|
|
801
808
|
{t("Delete")}
|
|
@@ -804,9 +811,11 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
804
811
|
|
|
805
812
|
{onCancel && (
|
|
806
813
|
<Button
|
|
807
|
-
|
|
814
|
+
outlined
|
|
808
815
|
icon={XIcon}
|
|
809
816
|
disabled={isSubmitting || disabled}
|
|
817
|
+
disabledReason={t("Form is read-only")}
|
|
818
|
+
disabledReasonPlacement="inline"
|
|
810
819
|
onPress={handleCancel}
|
|
811
820
|
>
|
|
812
821
|
{t("Cancel")}
|
|
@@ -814,9 +823,12 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
|
|
|
814
823
|
)}
|
|
815
824
|
|
|
816
825
|
<Button
|
|
817
|
-
|
|
818
|
-
icon={
|
|
819
|
-
|
|
826
|
+
accent
|
|
827
|
+
icon={FloppyDiskIcon}
|
|
828
|
+
loading={isSubmitting}
|
|
829
|
+
disabled={effectiveDisabled}
|
|
830
|
+
disabledReason={t("Form is read-only")}
|
|
831
|
+
disabledReasonPlacement="inline"
|
|
820
832
|
onPress={handleSave}
|
|
821
833
|
>
|
|
822
834
|
{isSubmitting ? t("Saving...") : t("Save")}
|
|
@@ -14,12 +14,81 @@ export default {
|
|
|
14
14
|
docs: {
|
|
15
15
|
description: {
|
|
16
16
|
component:
|
|
17
|
-
"Gantt view over useFrappeCollection / useLiveQuery.
|
|
17
|
+
"Gantt view over useFrappeCollection / useLiveQuery. Fixture stories are network-hermetic (G-15/D-05): documents come from InMemoryFixtureProvider and DocType meta from an in-story fetch mock, so nothing leaves the machine. The separately-named Live story is the live-bench arm — it targets STORYBOOK_FRAPPE_URL when reachable and falls back to fixtures otherwise. Field mapping defaults to Frappe's Gantt settings (exp_start_date / exp_end_date / subject). Bars drag horizontally to reschedule (snapping to whole days): moves persist via collection.update on the date fields and then fire onItemMove(name, start, end). Set enableItemDrag={false} to opt out.",
|
|
18
18
|
},
|
|
19
19
|
},
|
|
20
20
|
},
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Hermetic story host (G-15 story honesty / D-05, closes UX-P18).
|
|
25
|
+
//
|
|
26
|
+
// Fixture-backed stories previously pointed at https://demo.frappe.cloud. The
|
|
27
|
+
// fixture provider serves the *collection*, but DocType meta still resolves
|
|
28
|
+
// over HTTP — so those stories fired a real cross-origin request the browser
|
|
29
|
+
// rejected with CORS. MOCK_HOST keeps the same code path (real fetch, real
|
|
30
|
+
// meta shape) without leaving the machine.
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
const MOCK_HOST = "https://frappegantt.mock.test";
|
|
34
|
+
|
|
35
|
+
function taskMetaRaw(name: string) {
|
|
36
|
+
return {
|
|
37
|
+
name,
|
|
38
|
+
module: "Projects",
|
|
39
|
+
title_field: "subject",
|
|
40
|
+
fields: [
|
|
41
|
+
{ fieldname: "subject", fieldtype: "Data", label: "Subject", in_list_view: 1 },
|
|
42
|
+
{ fieldname: "exp_start_date", fieldtype: "Date", label: "Expected Start Date" },
|
|
43
|
+
{ fieldname: "exp_end_date", fieldtype: "Date", label: "Expected End Date" },
|
|
44
|
+
{
|
|
45
|
+
fieldname: "status",
|
|
46
|
+
fieldtype: "Select",
|
|
47
|
+
label: "Status",
|
|
48
|
+
options: "Open\nWorking\nCompleted",
|
|
49
|
+
in_list_view: 1,
|
|
50
|
+
},
|
|
51
|
+
{ fieldname: "color", fieldtype: "Color", label: "Color" },
|
|
52
|
+
],
|
|
53
|
+
permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function jsonResponse(body: unknown, status = 200): Response {
|
|
58
|
+
return new Response(JSON.stringify(body), {
|
|
59
|
+
status,
|
|
60
|
+
headers: { "Content-Type": "application/json" },
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
(() => {
|
|
65
|
+
if (typeof window === "undefined") return;
|
|
66
|
+
const w = window as unknown as Record<string, unknown>;
|
|
67
|
+
if (w.__frappeGanttMockFetch) return;
|
|
68
|
+
w.__frappeGanttMockFetch = true;
|
|
69
|
+
const realFetch = window.fetch.bind(window);
|
|
70
|
+
window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
71
|
+
const urlStr =
|
|
72
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
73
|
+
if (urlStr.startsWith(MOCK_HOST)) {
|
|
74
|
+
const url = new URL(urlStr);
|
|
75
|
+
if (url.pathname === "/api/method/frappe.desk.form.load.getdoctype") {
|
|
76
|
+
const doctype = url.searchParams.get("doctype") || "Task";
|
|
77
|
+
return jsonResponse({ docs: [taskMetaRaw(doctype)] });
|
|
78
|
+
}
|
|
79
|
+
const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
|
|
80
|
+
if (metaMatch)
|
|
81
|
+
return jsonResponse({ data: taskMetaRaw(decodeURIComponent(metaMatch[1])) });
|
|
82
|
+
if (url.pathname === "/api/resource/DocType") {
|
|
83
|
+
return jsonResponse({ data: [{ name: "Task", module: "Projects" }] });
|
|
84
|
+
}
|
|
85
|
+
// Everything else (guest field-peek, counts): empty, never the network.
|
|
86
|
+
return jsonResponse({ data: [] });
|
|
87
|
+
}
|
|
88
|
+
return realFetch(input as RequestInfo, init);
|
|
89
|
+
};
|
|
90
|
+
})();
|
|
91
|
+
|
|
23
92
|
interface ProjectTask {
|
|
24
93
|
name: string;
|
|
25
94
|
doctype: string;
|
|
@@ -94,7 +163,7 @@ const taskFixtures: ProjectTask[] = [
|
|
|
94
163
|
|
|
95
164
|
export const Main = () => (
|
|
96
165
|
<FrappeProvider
|
|
97
|
-
baseURL=
|
|
166
|
+
baseURL={MOCK_HOST}
|
|
98
167
|
fixtures={new InMemoryFixtureProvider({ Task: taskFixtures })}
|
|
99
168
|
>
|
|
100
169
|
<FrappeGantt<ProjectTask>
|
|
@@ -116,7 +185,7 @@ Main.parameters = {
|
|
|
116
185
|
|
|
117
186
|
export const MonthZoom = () => (
|
|
118
187
|
<FrappeProvider
|
|
119
|
-
baseURL=
|
|
188
|
+
baseURL={MOCK_HOST}
|
|
120
189
|
fixtures={new InMemoryFixtureProvider({ Task: taskFixtures })}
|
|
121
190
|
>
|
|
122
191
|
<FrappeGantt<ProjectTask>
|
|
@@ -138,7 +207,7 @@ MonthZoom.parameters = {
|
|
|
138
207
|
|
|
139
208
|
export const WithItemMove = () => (
|
|
140
209
|
<FrappeProvider
|
|
141
|
-
baseURL=
|
|
210
|
+
baseURL={MOCK_HOST}
|
|
142
211
|
fixtures={new InMemoryFixtureProvider({ Task: taskFixtures })}
|
|
143
212
|
>
|
|
144
213
|
<FrappeGantt<ProjectTask>
|