@multiplatform.one/frappe-ui 7.4.0 → 7.5.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 +661 -0
- package/dist/cjs/FileBrowser/index.native.js +735 -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 +15 -3
- package/dist/cjs/fieldRegistry.native.js +15 -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 +197 -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 +636 -0
- package/dist/esm/FileBrowser/index.mjs.map +1 -0
- package/dist/esm/FileBrowser/index.native.js +707 -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 +16 -4
- package/dist/esm/fieldRegistry.mjs.map +1 -1
- package/dist/esm/fieldRegistry.native.js +16 -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 +199 -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 +636 -0
- package/dist/jsx/FileBrowser/index.mjs.map +1 -0
- package/dist/jsx/FileBrowser/index.native.js +735 -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 +16 -4
- package/dist/jsx/fieldRegistry.mjs.map +1 -1
- package/dist/jsx/fieldRegistry.native.js +15 -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 +197 -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 +268 -0
- package/src/FileBrowser/FileBrowser.stories.tsx +93 -0
- package/src/FileBrowser/folderTree.ts +62 -0
- package/src/FileBrowser/index.tsx +724 -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 +17 -1
- package/src/fieldRegistry.ts +14 -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 +243 -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
package/src/FrappeGantt.tsx
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
import React, { useCallback, useMemo, useState, type ReactNode } from "react";
|
|
9
9
|
import { Text, YStack, type YStackProps } from "tamagui";
|
|
10
10
|
import { useTranslation } from "react-i18next";
|
|
11
|
+
import { formCommonColors } from "@multiplatform.one/forms";
|
|
11
12
|
import {
|
|
12
13
|
formatCalendarDate,
|
|
13
14
|
parseCalendarDate,
|
|
@@ -251,7 +252,7 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
|
|
|
251
252
|
return (
|
|
252
253
|
<YStack {...knobProps.gap}>
|
|
253
254
|
<FrappeConnectionIndicator config={connectionConfig} />
|
|
254
|
-
{actionError
|
|
255
|
+
{actionError ? (
|
|
255
256
|
<YStack
|
|
256
257
|
{...knobProps.panelPadding}
|
|
257
258
|
{...knobProps.borderRadius}
|
|
@@ -259,12 +260,14 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
|
|
|
259
260
|
borderColor="$red7"
|
|
260
261
|
borderWidth={1}
|
|
261
262
|
>
|
|
262
|
-
<Text color=
|
|
263
|
-
|
|
263
|
+
<Text color={formCommonColors.error} {...knobProps.label}>
|
|
264
|
+
{t("Action failed")}
|
|
265
|
+
</Text>
|
|
266
|
+
<Text color={formCommonColors.muted} {...knobProps.label}>
|
|
264
267
|
{actionError.message}
|
|
265
268
|
</Text>
|
|
266
269
|
</YStack>
|
|
267
|
-
)}
|
|
270
|
+
) : null}
|
|
268
271
|
<GanttView
|
|
269
272
|
{...knobProps.borderRadius}
|
|
270
273
|
tasks={tasks}
|
package/src/FrappeImageView.tsx
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useDocTypeMeta, useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
|
|
2
|
-
import { AsyncSkeleton, ImageGrid } from "@multiplatform.one/components";
|
|
2
|
+
import { AsyncSkeleton, Card, ImageGrid } from "@multiplatform.one/components";
|
|
3
3
|
import { ImageSquareIcon } from "@phosphor-icons/react";
|
|
4
4
|
import React, { useMemo } from "react";
|
|
5
5
|
import { useTranslation } from "react-i18next";
|
|
6
|
-
import { Spinner } from "@multiplatform.one/forms";
|
|
7
|
-
import {
|
|
6
|
+
import { Spinner, formCommonColors } from "@multiplatform.one/forms";
|
|
7
|
+
import { Image, Text, YStack, type YStackProps } from "tamagui";
|
|
8
8
|
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
9
9
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
10
10
|
import { FrappeReconnectIndicator } from "./FrappeReconnectIndicator";
|
|
@@ -134,7 +134,7 @@ export function FrappeImageView<TDoc extends { name: string; doctype: string }>(
|
|
|
134
134
|
{...(stackProps as any)}
|
|
135
135
|
>
|
|
136
136
|
<Spinner size="large" />
|
|
137
|
-
<Text color=
|
|
137
|
+
<Text color={formCommonColors.muted} {...knobProps.body} marginTop="$2">
|
|
138
138
|
{t("Loading {{doctype}}...", { doctype })}
|
|
139
139
|
</Text>
|
|
140
140
|
</YStack>
|
|
@@ -265,12 +265,15 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
|
|
|
265
265
|
);
|
|
266
266
|
}
|
|
267
267
|
|
|
268
|
-
// No image field configured
|
|
268
|
+
// No image field configured. R11: state is chrome outside the tile (no pip).
|
|
269
269
|
if (!effectiveImageField) {
|
|
270
|
+
const iconSize = Number(knobProps.controlIcon?.width) || 16;
|
|
270
271
|
return (
|
|
271
272
|
<YStack {...knobProps.panelPadding} alignItems="center" {...knobProps.gap} {...stackProps}>
|
|
272
|
-
<ImageSquareIcon size={
|
|
273
|
-
<Text color=
|
|
273
|
+
<ImageSquareIcon size={iconSize * 2} color={formCommonColors.muted} />
|
|
274
|
+
<Text color={formCommonColors.muted} {...knobProps.body}>
|
|
275
|
+
{t("No image field configured for {{doctype}}", { doctype })}
|
|
276
|
+
</Text>
|
|
274
277
|
</YStack>
|
|
275
278
|
);
|
|
276
279
|
}
|
|
@@ -329,15 +332,13 @@ function FrappeImageCard({
|
|
|
329
332
|
const imageUrl = getImageUrl(doc[imageField], baseURL);
|
|
330
333
|
const title = doc[titleField] || doc.name;
|
|
331
334
|
const subtitle = subtitleField ? doc[subtitleField] : undefined;
|
|
335
|
+
const iconSize = Number(knobProps.controlIcon?.width) || 16;
|
|
332
336
|
|
|
333
337
|
return (
|
|
334
|
-
//
|
|
335
|
-
//
|
|
336
|
-
// soft elevation, no outline border.
|
|
338
|
+
// Catalog Card owns cardSurface (no cherry-picked radius). Inner media
|
|
339
|
+
// radius stays UNCLAMPED (R11). No status pip on the tile.
|
|
337
340
|
<Card
|
|
338
341
|
testID={`${doctype.toLowerCase()}-card-${doc.name}`}
|
|
339
|
-
{...knobProps.cardSurface}
|
|
340
|
-
elevation={knobProps.elevation}
|
|
341
342
|
cursor="pointer"
|
|
342
343
|
hoverStyle={{ scale: 1.02 }}
|
|
343
344
|
pressStyle={{ scale: 0.98 }}
|
|
@@ -356,40 +357,40 @@ function FrappeImageCard({
|
|
|
356
357
|
aspectRatio={1}
|
|
357
358
|
objectFit="cover"
|
|
358
359
|
backgroundColor="$color2"
|
|
359
|
-
borderRadius
|
|
360
|
+
{...knobProps.borderRadius}
|
|
360
361
|
/>
|
|
361
362
|
) : (
|
|
362
363
|
<YStack
|
|
363
364
|
width="100%"
|
|
364
365
|
aspectRatio={1}
|
|
365
366
|
backgroundColor="$color2"
|
|
366
|
-
borderRadius
|
|
367
|
+
{...knobProps.borderRadius}
|
|
367
368
|
alignItems="center"
|
|
368
369
|
justifyContent="center"
|
|
369
370
|
>
|
|
370
|
-
<ImageSquareIcon size={
|
|
371
|
+
<ImageSquareIcon size={iconSize * 2} color={formCommonColors.muted} />
|
|
371
372
|
</YStack>
|
|
372
373
|
)}
|
|
373
|
-
<Card.Footer
|
|
374
|
-
<YStack gap
|
|
374
|
+
<Card.Footer>
|
|
375
|
+
<YStack {...knobProps.gap}>
|
|
375
376
|
<Text
|
|
376
377
|
testID={`${doctype.toLowerCase()}-name-${doc.name}`}
|
|
378
|
+
{...knobProps.heading}
|
|
377
379
|
fontWeight="400"
|
|
378
|
-
fontSize="$5"
|
|
379
380
|
numberOfLines={1}
|
|
380
381
|
>
|
|
381
382
|
{String(title)}
|
|
382
383
|
</Text>
|
|
383
|
-
{subtitle != null
|
|
384
|
+
{subtitle != null ? (
|
|
384
385
|
<Text
|
|
385
386
|
testID={`${doctype.toLowerCase()}-subtitle-${doc.name}`}
|
|
386
|
-
color=
|
|
387
|
-
|
|
387
|
+
color={formCommonColors.muted}
|
|
388
|
+
{...knobProps.label}
|
|
388
389
|
numberOfLines={1}
|
|
389
390
|
>
|
|
390
391
|
{String(subtitle)}
|
|
391
392
|
</Text>
|
|
392
|
-
)}
|
|
393
|
+
) : null}
|
|
393
394
|
</YStack>
|
|
394
395
|
</Card.Footer>
|
|
395
396
|
</Card>
|
|
@@ -7,6 +7,7 @@ import { action } from "@multiplatform.one/storybook";
|
|
|
7
7
|
import { CurrencyDollarIcon } from "@phosphor-icons/react";
|
|
8
8
|
import { XStack } from "tamagui";
|
|
9
9
|
import { FrappeKPICard } from "./FrappeKPICard";
|
|
10
|
+
import { FrappeProvider } from "./FrappeProvider";
|
|
10
11
|
import { FrappeStoryProvider } from "./frappeStoryTarget";
|
|
11
12
|
|
|
12
13
|
export default {
|
|
@@ -18,12 +19,81 @@ export default {
|
|
|
18
19
|
docs: {
|
|
19
20
|
description: {
|
|
20
21
|
component:
|
|
21
|
-
"KPICard as re-exported by @multiplatform.one/frappe-ui (the 'Frappe KPICard' bridge). It is the same component object as the components-package KPICard; these stories exercise the bridge surface and value edge cases.",
|
|
22
|
+
"KPICard as re-exported by @multiplatform.one/frappe-ui (the 'Frappe KPICard' bridge). It is the same component object as the components-package KPICard; these stories exercise the bridge surface and value edge cases. Live aggregate stories are network-hermetic (G-15/D-05): counts 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.",
|
|
22
23
|
},
|
|
23
24
|
},
|
|
24
25
|
},
|
|
25
26
|
};
|
|
26
27
|
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Hermetic story host (G-15 story honesty / D-05, closes UX-P18).
|
|
30
|
+
//
|
|
31
|
+
// LiveToDoCount previously wrapped FrappeStoryProvider, whose fallback
|
|
32
|
+
// baseURL is https://demo.frappe.cloud (and which is a no-op on native
|
|
33
|
+
// Kitchen Sink / TestFlight). Fixture rows then never reached
|
|
34
|
+
// useFrappeAggregate, and any DocType-meta fetch CORS-failed. MOCK_HOST
|
|
35
|
+
// keeps the same code path (real fetch, real meta shape) without leaving
|
|
36
|
+
// the machine; counts render from InMemoryFixtureProvider.
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
const MOCK_HOST = "https://frappekpicard.mock.test";
|
|
40
|
+
|
|
41
|
+
function todoMetaRaw(name: string) {
|
|
42
|
+
return {
|
|
43
|
+
name,
|
|
44
|
+
module: "Desk",
|
|
45
|
+
title_field: "description",
|
|
46
|
+
fields: [
|
|
47
|
+
{ fieldname: "description", fieldtype: "Text Editor", label: "Description", in_list_view: 1 },
|
|
48
|
+
{
|
|
49
|
+
fieldname: "status",
|
|
50
|
+
fieldtype: "Select",
|
|
51
|
+
label: "Status",
|
|
52
|
+
options: "Open\nClosed",
|
|
53
|
+
in_list_view: 1,
|
|
54
|
+
in_standard_filter: 1,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function jsonResponse(body: unknown, status = 200): Response {
|
|
62
|
+
return new Response(JSON.stringify(body), {
|
|
63
|
+
status,
|
|
64
|
+
headers: { "Content-Type": "application/json" },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
(() => {
|
|
69
|
+
if (typeof window === "undefined") return;
|
|
70
|
+
const w = window as unknown as Record<string, unknown>;
|
|
71
|
+
if (w.__frappeKpiCardMockFetch) return;
|
|
72
|
+
w.__frappeKpiCardMockFetch = true;
|
|
73
|
+
const realFetch = window.fetch.bind(window);
|
|
74
|
+
window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
75
|
+
const urlStr =
|
|
76
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
77
|
+
if (urlStr.startsWith(MOCK_HOST)) {
|
|
78
|
+
const url = new URL(urlStr);
|
|
79
|
+
if (url.pathname === "/api/method/frappe.desk.form.load.getdoctype") {
|
|
80
|
+
const doctype = url.searchParams.get("doctype") || "ToDo";
|
|
81
|
+
return jsonResponse({ docs: [todoMetaRaw(decodeURIComponent(doctype))] });
|
|
82
|
+
}
|
|
83
|
+
const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
|
|
84
|
+
if (metaMatch)
|
|
85
|
+
return jsonResponse({ data: todoMetaRaw(decodeURIComponent(metaMatch[1])) });
|
|
86
|
+
if (url.pathname === "/api/resource/DocType") {
|
|
87
|
+
return jsonResponse({ data: [{ name: "ToDo", module: "Desk" }] });
|
|
88
|
+
}
|
|
89
|
+
// Everything else (guest field-peek, counts): empty, never the network.
|
|
90
|
+
// Scalar counts still come from InMemoryFixtureProvider, not this body.
|
|
91
|
+
return jsonResponse({ data: [] });
|
|
92
|
+
}
|
|
93
|
+
return realFetch(input as RequestInfo, init);
|
|
94
|
+
};
|
|
95
|
+
})();
|
|
96
|
+
|
|
27
97
|
export const Main = () => (
|
|
28
98
|
<KPICard
|
|
29
99
|
config={{
|
|
@@ -146,20 +216,20 @@ export const LongTitle = () => (
|
|
|
146
216
|
);
|
|
147
217
|
|
|
148
218
|
// ---------------------------------------------------------------------------
|
|
149
|
-
//
|
|
150
|
-
//
|
|
151
|
-
// list_update / doc_update / doc_deleted events. Bench when reachable,
|
|
152
|
-
// fixtures otherwise (FrappeStoryProvider fallback).
|
|
219
|
+
// Hermetic aggregate (FrappeKPICard + dataSource): counts come from
|
|
220
|
+
// InMemoryFixtureProvider against MOCK_HOST. No bench, no demo.frappe.cloud.
|
|
153
221
|
// ---------------------------------------------------------------------------
|
|
154
222
|
|
|
155
|
-
const
|
|
223
|
+
const todoFixtures = [
|
|
156
224
|
{ name: "TD-1", doctype: "ToDo", description: "Fixture todo A", status: "Open" },
|
|
157
225
|
{ name: "TD-2", doctype: "ToDo", description: "Fixture todo B", status: "Open" },
|
|
158
226
|
{ name: "TD-3", doctype: "ToDo", description: "Fixture todo C", status: "Closed" },
|
|
159
227
|
];
|
|
160
228
|
|
|
161
|
-
|
|
162
|
-
|
|
229
|
+
const makeTodoFixtures = () => new InMemoryFixtureProvider({ ToDo: todoFixtures });
|
|
230
|
+
|
|
231
|
+
function ToDoCountCards() {
|
|
232
|
+
return (
|
|
163
233
|
<XStack gap="$3" flexWrap="wrap">
|
|
164
234
|
<FrappeKPICard
|
|
165
235
|
width={280}
|
|
@@ -174,13 +244,43 @@ export const LiveToDoCount = () => (
|
|
|
174
244
|
dataSource={{ doctype: "ToDo", filters: { status: "Open" } }}
|
|
175
245
|
/>
|
|
176
246
|
</XStack>
|
|
177
|
-
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** Default path: fixture counts on MOCK_HOST (Kitchen Sink / TestFlight). */
|
|
251
|
+
export const LiveToDoCount = () => (
|
|
252
|
+
<FrappeProvider baseURL={MOCK_HOST} fixtures={makeTodoFixtures()}>
|
|
253
|
+
<ToDoCountCards />
|
|
254
|
+
</FrappeProvider>
|
|
178
255
|
);
|
|
179
256
|
LiveToDoCount.parameters = {
|
|
180
257
|
docs: {
|
|
181
258
|
description: {
|
|
182
259
|
story:
|
|
183
|
-
"
|
|
260
|
+
"Hermetic server-side count of fixture ToDo documents (3 total, 2 Open) via useFrappeAggregate + InMemoryFixtureProvider. DocType meta is served by the in-story fetch mock at https://frappekpicard.mock.test — nothing leaves the machine.",
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
// Live bench story — real aggregates when the bench is reachable
|
|
267
|
+
// ---------------------------------------------------------------------------
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Live aggregates against the real bench: frappe.client.get_count, refetched
|
|
271
|
+
* with a 300ms coalescing window on realtime list_update / doc_update /
|
|
272
|
+
* doc_deleted. Falls back to the same fixtures when the bench is down.
|
|
273
|
+
*/
|
|
274
|
+
export const Live = () => (
|
|
275
|
+
<FrappeStoryProvider fixtures={makeTodoFixtures()}>
|
|
276
|
+
<ToDoCountCards />
|
|
277
|
+
</FrappeStoryProvider>
|
|
278
|
+
);
|
|
279
|
+
Live.parameters = {
|
|
280
|
+
docs: {
|
|
281
|
+
description: {
|
|
282
|
+
story:
|
|
283
|
+
"LIVE server-side count of ToDo documents (frappe.client.get_count), refetched with a 300ms coalescing window on realtime events. Both cards watch the same doctype and share one refcounted realtime room subscription. Create/delete a ToDo on the bench and the numbers update in place — no reload. Fixture fallback when the bench is down.",
|
|
184
284
|
},
|
|
185
285
|
},
|
|
186
286
|
};
|
package/src/FrappeKPICard.tsx
CHANGED
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import {
|
|
16
16
|
AsyncBoundary,
|
|
17
|
+
Card,
|
|
17
18
|
KPICard,
|
|
18
19
|
Skeleton,
|
|
19
20
|
type KPICardConfig,
|
|
20
21
|
} from "@multiplatform.one/components";
|
|
21
22
|
import React, { useMemo } from "react";
|
|
22
23
|
import { useTranslation } from "react-i18next";
|
|
23
|
-
import {
|
|
24
|
-
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
24
|
+
import { type YStackProps } from "tamagui";
|
|
25
25
|
import { useFrappeConfig } from "./FrappeProvider";
|
|
26
26
|
import {
|
|
27
27
|
useFrappeAggregate,
|
|
@@ -56,28 +56,12 @@ export interface FrappeKPICardProps extends Omit<YStackProps, "children"> {
|
|
|
56
56
|
|
|
57
57
|
/** Card-shaped skeleton so the live KPI's first load doesn't jump layout. */
|
|
58
58
|
function KPICardSkeleton(stackProps: YStackProps) {
|
|
59
|
-
const { knobProps } = useResolvedKnobs();
|
|
60
59
|
const { t } = useTranslation();
|
|
61
60
|
return (
|
|
62
|
-
<Card
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
borderWidth={1}
|
|
67
|
-
borderColor="$borderColor"
|
|
68
|
-
aria-busy
|
|
69
|
-
aria-label={t("Loading")}
|
|
70
|
-
{...stackProps}
|
|
71
|
-
>
|
|
72
|
-
<Card.Header {...knobProps.panelPadding}>
|
|
73
|
-
<Skeleton width="50%" height={12} />
|
|
74
|
-
</Card.Header>
|
|
75
|
-
<Card.Footer {...knobProps.panelPadding}>
|
|
76
|
-
<YStack {...knobProps.gap}>
|
|
77
|
-
<Skeleton width="70%" height={28} />
|
|
78
|
-
<Skeleton width="40%" height={12} />
|
|
79
|
-
</YStack>
|
|
80
|
-
</Card.Footer>
|
|
61
|
+
<Card aria-busy aria-label={t("Loading")} {...stackProps}>
|
|
62
|
+
<Skeleton width="50%" />
|
|
63
|
+
<Skeleton width="70%" />
|
|
64
|
+
<Skeleton width="40%" />
|
|
81
65
|
</Card>
|
|
82
66
|
);
|
|
83
67
|
}
|
|
@@ -14,12 +14,117 @@ export default {
|
|
|
14
14
|
docs: {
|
|
15
15
|
description: {
|
|
16
16
|
component:
|
|
17
|
-
"Kanban over useFrappeCollection / useLiveQuery; card moves persist status via collection.update.
|
|
17
|
+
"Kanban over useFrappeCollection / useLiveQuery; card moves persist status via collection.update. 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.",
|
|
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; ERR_HOST is the deliberate
|
|
31
|
+
// failure host for the error-state story.
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
const MOCK_HOST = "https://frappekanban.mock.test";
|
|
35
|
+
const ERR_HOST = "https://forbidden.frappekanban.mock.test";
|
|
36
|
+
|
|
37
|
+
function todoMetaRaw(name: string) {
|
|
38
|
+
return {
|
|
39
|
+
name,
|
|
40
|
+
module: "Desk",
|
|
41
|
+
title_field: "description",
|
|
42
|
+
fields: [
|
|
43
|
+
{ fieldname: "description", fieldtype: "Text", label: "Description", in_list_view: 1 },
|
|
44
|
+
{
|
|
45
|
+
fieldname: "status",
|
|
46
|
+
fieldtype: "Select",
|
|
47
|
+
label: "Status",
|
|
48
|
+
options: "Open\nWorking\nPending Review\nCompleted",
|
|
49
|
+
in_list_view: 1,
|
|
50
|
+
in_standard_filter: 1,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function bugMetaRaw(name: string) {
|
|
58
|
+
return {
|
|
59
|
+
name,
|
|
60
|
+
module: "QA",
|
|
61
|
+
title_field: "title",
|
|
62
|
+
fields: [
|
|
63
|
+
{ fieldname: "title", fieldtype: "Data", label: "Title", in_list_view: 1 },
|
|
64
|
+
{
|
|
65
|
+
fieldname: "severity",
|
|
66
|
+
fieldtype: "Select",
|
|
67
|
+
label: "Severity",
|
|
68
|
+
options: "Critical\nHigh\nMedium\nLow",
|
|
69
|
+
in_list_view: 1,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
fieldname: "status",
|
|
73
|
+
fieldtype: "Select",
|
|
74
|
+
label: "Status",
|
|
75
|
+
options: "New\nConfirmed\nIn Progress\nTesting\nClosed",
|
|
76
|
+
in_list_view: 1,
|
|
77
|
+
in_standard_filter: 1,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function metaFor(doctype: string) {
|
|
85
|
+
return doctype === "Bug" ? bugMetaRaw(doctype) : todoMetaRaw(doctype);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function jsonResponse(body: unknown, status = 200): Response {
|
|
89
|
+
return new Response(JSON.stringify(body), {
|
|
90
|
+
status,
|
|
91
|
+
headers: { "Content-Type": "application/json" },
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
(() => {
|
|
96
|
+
if (typeof window === "undefined") return;
|
|
97
|
+
const w = window as unknown as Record<string, unknown>;
|
|
98
|
+
if (w.__frappeKanbanMockFetch) return;
|
|
99
|
+
w.__frappeKanbanMockFetch = true;
|
|
100
|
+
const realFetch = window.fetch.bind(window);
|
|
101
|
+
window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
102
|
+
const urlStr =
|
|
103
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
104
|
+
if (urlStr.startsWith(ERR_HOST)) return jsonResponse({ message: "Not permitted" }, 403);
|
|
105
|
+
if (urlStr.startsWith(MOCK_HOST)) {
|
|
106
|
+
const url = new URL(urlStr);
|
|
107
|
+
if (url.pathname === "/api/method/frappe.desk.form.load.getdoctype") {
|
|
108
|
+
const doctype = url.searchParams.get("doctype") || "ToDo";
|
|
109
|
+
return jsonResponse({ docs: [metaFor(doctype)] });
|
|
110
|
+
}
|
|
111
|
+
const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
|
|
112
|
+
if (metaMatch) return jsonResponse({ data: metaFor(decodeURIComponent(metaMatch[1])) });
|
|
113
|
+
if (url.pathname === "/api/resource/DocType") {
|
|
114
|
+
return jsonResponse({
|
|
115
|
+
data: [
|
|
116
|
+
{ name: "ToDo", module: "Desk" },
|
|
117
|
+
{ name: "Bug", module: "QA" },
|
|
118
|
+
],
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
// Everything else (guest field-peek, counts): empty, never the network.
|
|
122
|
+
return jsonResponse({ data: [] });
|
|
123
|
+
}
|
|
124
|
+
return realFetch(input as RequestInfo, init);
|
|
125
|
+
};
|
|
126
|
+
})();
|
|
127
|
+
|
|
23
128
|
interface ToDo {
|
|
24
129
|
name: string;
|
|
25
130
|
doctype: string;
|
|
@@ -45,7 +150,7 @@ const todoColumns: KanbanColumn[] = [
|
|
|
45
150
|
|
|
46
151
|
export const Default = () => (
|
|
47
152
|
<FrappeProvider
|
|
48
|
-
baseURL=
|
|
153
|
+
baseURL={MOCK_HOST}
|
|
49
154
|
fixtures={new InMemoryFixtureProvider({ ToDo: todoFixtures })}
|
|
50
155
|
>
|
|
51
156
|
<FrappeKanban<ToDo>
|
|
@@ -70,7 +175,7 @@ Default.parameters = {
|
|
|
70
175
|
Default.storyName = "Main";
|
|
71
176
|
export const WithCardCreation = () => (
|
|
72
177
|
<FrappeProvider
|
|
73
|
-
baseURL=
|
|
178
|
+
baseURL={MOCK_HOST}
|
|
74
179
|
fixtures={new InMemoryFixtureProvider({ ToDo: todoFixtures })}
|
|
75
180
|
>
|
|
76
181
|
<FrappeKanban<ToDo>
|
|
@@ -206,7 +311,7 @@ const bugColumns: KanbanColumn[] = [
|
|
|
206
311
|
|
|
207
312
|
export const BugTracker = () => (
|
|
208
313
|
<FrappeProvider
|
|
209
|
-
baseURL=
|
|
314
|
+
baseURL={MOCK_HOST}
|
|
210
315
|
fixtures={new InMemoryFixtureProvider({ Bug: bugFixtures })}
|
|
211
316
|
>
|
|
212
317
|
<FrappeKanban<Bug>
|
|
@@ -242,7 +347,7 @@ class PendingFixtureProvider extends InMemoryFixtureProvider {
|
|
|
242
347
|
|
|
243
348
|
/** Collection stuck syncing with an empty board: the kanban skeleton renders (LC-20 / DG-ST-02). */
|
|
244
349
|
export const Loading = () => (
|
|
245
|
-
<FrappeProvider baseURL=
|
|
350
|
+
<FrappeProvider baseURL={MOCK_HOST} fixtures={new PendingFixtureProvider()}>
|
|
246
351
|
<FrappeKanban<ToDo>
|
|
247
352
|
doctype="ToDo"
|
|
248
353
|
columns={todoColumns}
|
|
@@ -256,7 +361,7 @@ export const Loading = () => (
|
|
|
256
361
|
/** Zero documents, no failure — configured columns render with per-column "No items" (empty ≠ error). */
|
|
257
362
|
export const Empty = () => (
|
|
258
363
|
<FrappeProvider
|
|
259
|
-
baseURL=
|
|
364
|
+
baseURL={MOCK_HOST}
|
|
260
365
|
fixtures={new InMemoryFixtureProvider({ ToDo: [] })}
|
|
261
366
|
>
|
|
262
367
|
<FrappeKanban<ToDo>
|
|
@@ -270,11 +375,12 @@ export const Empty = () => (
|
|
|
270
375
|
);
|
|
271
376
|
|
|
272
377
|
/**
|
|
273
|
-
*
|
|
274
|
-
*
|
|
378
|
+
* Collection that fails with no fixtures: the `error` render prop shows
|
|
379
|
+
* instead of empty board chrome (DG-ST-01 / SB-M-806 pattern). The failure
|
|
380
|
+
* is served hermetically — the in-story mock answers ERR_HOST with 403.
|
|
275
381
|
*/
|
|
276
382
|
export const LoadError = () => (
|
|
277
|
-
<FrappeProvider baseURL=
|
|
383
|
+
<FrappeProvider baseURL={ERR_HOST}>
|
|
278
384
|
<FrappeKanban<ToDo>
|
|
279
385
|
doctype="ToDo"
|
|
280
386
|
columns={todoColumns}
|
package/src/FrappeKanban.tsx
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
|
|
2
2
|
import {
|
|
3
3
|
Kanban,
|
|
4
|
+
componentColors,
|
|
4
5
|
type KanbanColumn as GenericKanbanColumn,
|
|
5
6
|
type KanbanProps,
|
|
6
7
|
} from "@multiplatform.one/components";
|
|
7
|
-
import { Button } from "@multiplatform.one/forms";
|
|
8
|
+
import { Button, formCommonColors } from "@multiplatform.one/forms";
|
|
8
9
|
import { PlusIcon } from "@phosphor-icons/react";
|
|
9
10
|
import React, { useMemo, useCallback, useState } from "react";
|
|
10
11
|
import { useTranslation } from "react-i18next";
|
|
@@ -176,7 +177,7 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
|
|
|
176
177
|
id: "__unassigned__",
|
|
177
178
|
title: t("Unassigned"),
|
|
178
179
|
items: unknown,
|
|
179
|
-
color:
|
|
180
|
+
color: componentColors.text.subtle,
|
|
180
181
|
});
|
|
181
182
|
}
|
|
182
183
|
return result;
|
|
@@ -193,12 +194,12 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
|
|
|
193
194
|
? (item as Record<string, unknown>)[descriptionField]
|
|
194
195
|
: undefined;
|
|
195
196
|
return (
|
|
196
|
-
<YStack {...knobProps.panelPadding}>
|
|
197
|
-
<Text
|
|
197
|
+
<YStack {...knobProps.panelPadding} {...knobProps.gap}>
|
|
198
|
+
<Text {...knobProps.label} {...knobProps.textWeight}>
|
|
198
199
|
{(title as React.ReactNode) || item.name}
|
|
199
200
|
</Text>
|
|
200
201
|
{desc != null && desc !== "" && (
|
|
201
|
-
<Text
|
|
202
|
+
<Text color={formCommonColors.muted} {...knobProps.body}>
|
|
202
203
|
{String(desc)}
|
|
203
204
|
</Text>
|
|
204
205
|
)}
|
|
@@ -257,7 +258,7 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
|
|
|
257
258
|
size="$2"
|
|
258
259
|
circular
|
|
259
260
|
chromeless
|
|
260
|
-
icon={
|
|
261
|
+
icon={PlusIcon}
|
|
261
262
|
aria-label={t("Add card to {{column}}", { column: column.title })}
|
|
262
263
|
onPress={() => {
|
|
263
264
|
setActionError(null);
|
|
@@ -300,13 +301,13 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
|
|
|
300
301
|
{actionError && (
|
|
301
302
|
<YStack
|
|
302
303
|
{...knobProps.panelPadding}
|
|
303
|
-
{...knobProps.
|
|
304
|
+
{...knobProps.containerRadius}
|
|
304
305
|
backgroundColor="$red2"
|
|
305
306
|
borderColor="$red7"
|
|
306
307
|
borderWidth={1}
|
|
307
308
|
>
|
|
308
|
-
<Text color=
|
|
309
|
-
<Text color=
|
|
309
|
+
<Text color={formCommonColors.error}>{t("Action failed")}</Text>
|
|
310
|
+
<Text color={formCommonColors.muted} {...knobProps.body}>
|
|
310
311
|
{actionError.message}
|
|
311
312
|
</Text>
|
|
312
313
|
</YStack>
|