@multiplatform.one/frappe-ui 6.7.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/FrappeAssignment.cjs +2 -0
- package/dist/cjs/FrappeAssignment.native.js +2 -0
- package/dist/cjs/FrappeAssignment.native.js.map +1 -1
- package/dist/cjs/FrappeCalendar.cjs +5 -7
- package/dist/cjs/FrappeCalendar.native.js +5 -9
- package/dist/cjs/FrappeCalendar.native.js.map +1 -1
- package/dist/cjs/FrappeChartCard.cjs +2 -0
- package/dist/cjs/FrappeChartCard.native.js +2 -0
- package/dist/cjs/FrappeChartCard.native.js.map +1 -1
- package/dist/cjs/FrappeDashboard.cjs +11 -22
- package/dist/cjs/FrappeDashboard.native.js +20 -22
- package/dist/cjs/FrappeDashboard.native.js.map +1 -1
- package/dist/cjs/FrappeForm.cjs +3 -1
- package/dist/cjs/FrappeForm.native.js +3 -1
- package/dist/cjs/FrappeForm.native.js.map +1 -1
- package/dist/cjs/FrappeGantt.cjs +5 -7
- package/dist/cjs/FrappeGantt.native.js +5 -9
- package/dist/cjs/FrappeGantt.native.js.map +1 -1
- package/dist/cjs/FrappeImageView.cjs +3 -1
- package/dist/cjs/FrappeImageView.native.js +3 -1
- package/dist/cjs/FrappeImageView.native.js.map +1 -1
- package/dist/cjs/FrappeKPICard.cjs +2 -0
- package/dist/cjs/FrappeKPICard.native.js +2 -0
- package/dist/cjs/FrappeKPICard.native.js.map +1 -1
- package/dist/cjs/FrappeKanban.cjs +3 -1
- package/dist/cjs/FrappeKanban.native.js +3 -1
- package/dist/cjs/FrappeKanban.native.js.map +1 -1
- package/dist/cjs/FrappeLikedBy.cjs +2 -0
- package/dist/cjs/FrappeLikedBy.native.js +2 -0
- package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
- package/dist/cjs/FrappeList.cjs +3 -1
- package/dist/cjs/FrappeList.native.js +3 -1
- package/dist/cjs/FrappeList.native.js.map +1 -1
- package/dist/cjs/FrappeListView.cjs +6 -12
- package/dist/cjs/FrappeListView.native.js +13 -12
- package/dist/cjs/FrappeListView.native.js.map +1 -1
- package/dist/cjs/FrappeProvider.cjs +5 -1
- package/dist/cjs/FrappeProvider.native.js +5 -1
- package/dist/cjs/FrappeProvider.native.js.map +1 -1
- package/dist/cjs/FrappeReportBuilder.cjs +2 -0
- package/dist/cjs/FrappeReportBuilder.native.js +2 -0
- package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
- package/dist/cjs/FrappeReportView.cjs +23 -45
- package/dist/cjs/FrappeReportView.native.js +35 -50
- package/dist/cjs/FrappeReportView.native.js.map +1 -1
- package/dist/cjs/FrappeTable.cjs +105 -31
- package/dist/cjs/FrappeTable.native.js +140 -42
- package/dist/cjs/FrappeTable.native.js.map +1 -1
- package/dist/cjs/FrappeTreeView.cjs +3 -1
- package/dist/cjs/FrappeTreeView.native.js +3 -1
- package/dist/cjs/FrappeTreeView.native.js.map +1 -1
- package/dist/cjs/SyncErrorNotice.cjs +76 -0
- package/dist/cjs/SyncErrorNotice.native.js +92 -0
- package/dist/cjs/SyncErrorNotice.native.js.map +1 -0
- package/dist/cjs/commentActions.cjs +120 -0
- package/dist/cjs/commentActions.native.js +129 -0
- package/dist/cjs/commentActions.native.js.map +1 -0
- package/dist/cjs/components/attachments.cjs +2 -0
- package/dist/cjs/components/attachments.native.js +2 -0
- package/dist/cjs/components/attachments.native.js.map +1 -1
- package/dist/cjs/components/tags.cjs +5 -0
- package/dist/cjs/components/tags.native.js +5 -0
- package/dist/cjs/components/tags.native.js.map +1 -1
- package/dist/cjs/components/timeline.cjs +29 -2
- package/dist/cjs/components/timeline.native.js +33 -2
- package/dist/cjs/components/timeline.native.js.map +1 -1
- package/dist/cjs/desk/DeskFormSidebar.cjs +2 -0
- package/dist/cjs/desk/DeskFormSidebar.native.js +2 -0
- package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/cjs/fieldRegistry.cjs +2 -0
- package/dist/cjs/fieldRegistry.native.js +2 -0
- package/dist/cjs/fieldRegistry.native.js.map +1 -1
- package/dist/cjs/fields/Date/index.cjs +71 -7
- package/dist/cjs/fields/Date/index.native.js +325 -37
- package/dist/cjs/fields/Date/index.native.js.map +1 -1
- package/dist/cjs/fields/Date/types.cjs +18 -0
- package/dist/cjs/fields/Date/types.native.js +21 -0
- package/dist/cjs/fields/Date/types.native.js.map +1 -0
- package/dist/cjs/fields/Date/wire.cjs +4 -8
- package/dist/cjs/fields/Date/wire.native.js +4 -11
- package/dist/cjs/fields/Date/wire.native.js.map +1 -1
- package/dist/cjs/fields/DynamicLink.cjs +2 -0
- package/dist/cjs/fields/DynamicLink.native.js +2 -0
- package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload.cjs +2 -0
- package/dist/cjs/fields/FileUpload.native.js +2 -0
- package/dist/cjs/fields/FileUpload.native.js.map +1 -1
- package/dist/cjs/fields/TableMultiSelect.cjs +6 -1
- package/dist/cjs/fields/TableMultiSelect.native.js +6 -1
- package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/cjs/frappeStoryTarget.cjs +88 -0
- package/dist/cjs/frappeStoryTarget.native.js +100 -0
- package/dist/cjs/frappeStoryTarget.native.js.map +1 -1
- package/dist/cjs/frappeUsers.cjs +2 -0
- package/dist/cjs/frappeUsers.native.js +2 -0
- package/dist/cjs/frappeUsers.native.js.map +1 -1
- package/dist/cjs/index.cjs +17 -4
- package/dist/cjs/index.native.js +17 -4
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/liveErrors.cjs +5 -1
- package/dist/cjs/liveErrors.native.js +5 -1
- package/dist/cjs/liveErrors.native.js.map +1 -1
- package/dist/cjs/useFrappeAggregate.cjs +13 -1
- package/dist/cjs/useFrappeAggregate.native.js +14 -1
- package/dist/cjs/useFrappeAggregate.native.js.map +1 -1
- package/dist/cjs/useFrappeFacets.cjs +329 -0
- package/dist/cjs/useFrappeFacets.native.js +632 -0
- package/dist/cjs/useFrappeFacets.native.js.map +1 -0
- package/dist/esm/FrappeAssignment.mjs +2 -0
- package/dist/esm/FrappeAssignment.mjs.map +1 -1
- package/dist/esm/FrappeAssignment.native.js +2 -0
- package/dist/esm/FrappeAssignment.native.js.map +1 -1
- package/dist/esm/FrappeCalendar.mjs +6 -8
- package/dist/esm/FrappeCalendar.mjs.map +1 -1
- package/dist/esm/FrappeCalendar.native.js +6 -10
- package/dist/esm/FrappeCalendar.native.js.map +1 -1
- package/dist/esm/FrappeChartCard.mjs +2 -0
- package/dist/esm/FrappeChartCard.mjs.map +1 -1
- package/dist/esm/FrappeChartCard.native.js +2 -0
- package/dist/esm/FrappeChartCard.native.js.map +1 -1
- package/dist/esm/FrappeDashboard.mjs +12 -19
- package/dist/esm/FrappeDashboard.mjs.map +1 -1
- package/dist/esm/FrappeDashboard.native.js +23 -21
- package/dist/esm/FrappeDashboard.native.js.map +1 -1
- package/dist/esm/FrappeForm.mjs +3 -1
- package/dist/esm/FrappeForm.mjs.map +1 -1
- package/dist/esm/FrappeForm.native.js +3 -1
- package/dist/esm/FrappeForm.native.js.map +1 -1
- package/dist/esm/FrappeGantt.mjs +6 -8
- package/dist/esm/FrappeGantt.mjs.map +1 -1
- package/dist/esm/FrappeGantt.native.js +6 -10
- package/dist/esm/FrappeGantt.native.js.map +1 -1
- package/dist/esm/FrappeImageView.mjs +3 -1
- package/dist/esm/FrappeImageView.mjs.map +1 -1
- package/dist/esm/FrappeImageView.native.js +3 -1
- package/dist/esm/FrappeImageView.native.js.map +1 -1
- package/dist/esm/FrappeKPICard.mjs +2 -0
- package/dist/esm/FrappeKPICard.mjs.map +1 -1
- package/dist/esm/FrappeKPICard.native.js +2 -0
- package/dist/esm/FrappeKPICard.native.js.map +1 -1
- package/dist/esm/FrappeKanban.mjs +3 -1
- package/dist/esm/FrappeKanban.mjs.map +1 -1
- package/dist/esm/FrappeKanban.native.js +3 -1
- package/dist/esm/FrappeKanban.native.js.map +1 -1
- package/dist/esm/FrappeLikedBy.mjs +2 -0
- package/dist/esm/FrappeLikedBy.mjs.map +1 -1
- package/dist/esm/FrappeLikedBy.native.js +2 -0
- package/dist/esm/FrappeLikedBy.native.js.map +1 -1
- package/dist/esm/FrappeList.mjs +3 -1
- package/dist/esm/FrappeList.mjs.map +1 -1
- package/dist/esm/FrappeList.native.js +3 -1
- package/dist/esm/FrappeList.native.js.map +1 -1
- package/dist/esm/FrappeListView.mjs +7 -13
- package/dist/esm/FrappeListView.mjs.map +1 -1
- package/dist/esm/FrappeListView.native.js +15 -14
- package/dist/esm/FrappeListView.native.js.map +1 -1
- package/dist/esm/FrappeProvider.mjs +5 -1
- package/dist/esm/FrappeProvider.mjs.map +1 -1
- package/dist/esm/FrappeProvider.native.js +5 -1
- package/dist/esm/FrappeProvider.native.js.map +1 -1
- package/dist/esm/FrappeReportBuilder.mjs +2 -0
- package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
- package/dist/esm/FrappeReportBuilder.native.js +2 -0
- package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
- package/dist/esm/FrappeReportView.mjs +26 -49
- package/dist/esm/FrappeReportView.mjs.map +1 -1
- package/dist/esm/FrappeReportView.native.js +38 -54
- package/dist/esm/FrappeReportView.native.js.map +1 -1
- package/dist/esm/FrappeTable.mjs +107 -33
- package/dist/esm/FrappeTable.mjs.map +1 -1
- package/dist/esm/FrappeTable.native.js +142 -44
- package/dist/esm/FrappeTable.native.js.map +1 -1
- package/dist/esm/FrappeTreeView.mjs +3 -1
- package/dist/esm/FrappeTreeView.mjs.map +1 -1
- package/dist/esm/FrappeTreeView.native.js +3 -1
- package/dist/esm/FrappeTreeView.native.js.map +1 -1
- package/dist/esm/SyncErrorNotice.mjs +51 -0
- package/dist/esm/SyncErrorNotice.mjs.map +1 -0
- package/dist/esm/SyncErrorNotice.native.js +53 -0
- package/dist/esm/SyncErrorNotice.native.js.map +1 -0
- package/dist/esm/commentActions.mjs +95 -0
- package/dist/esm/commentActions.mjs.map +1 -0
- package/dist/esm/commentActions.native.js +101 -0
- package/dist/esm/commentActions.native.js.map +1 -0
- package/dist/esm/components/attachments.mjs +2 -0
- package/dist/esm/components/attachments.mjs.map +1 -1
- package/dist/esm/components/attachments.native.js +2 -0
- package/dist/esm/components/attachments.native.js.map +1 -1
- package/dist/esm/components/tags.mjs +5 -0
- package/dist/esm/components/tags.mjs.map +1 -1
- package/dist/esm/components/tags.native.js +5 -0
- package/dist/esm/components/tags.native.js.map +1 -1
- package/dist/esm/components/timeline.mjs +31 -4
- package/dist/esm/components/timeline.mjs.map +1 -1
- package/dist/esm/components/timeline.native.js +35 -4
- package/dist/esm/components/timeline.native.js.map +1 -1
- package/dist/esm/desk/DeskFormSidebar.mjs +2 -0
- package/dist/esm/desk/DeskFormSidebar.mjs.map +1 -1
- package/dist/esm/desk/DeskFormSidebar.native.js +2 -0
- package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/esm/fieldRegistry.mjs +2 -0
- package/dist/esm/fieldRegistry.mjs.map +1 -1
- package/dist/esm/fieldRegistry.native.js +2 -0
- package/dist/esm/fieldRegistry.native.js.map +1 -1
- package/dist/esm/fields/Date/index.mjs +73 -9
- package/dist/esm/fields/Date/index.mjs.map +1 -1
- package/dist/esm/fields/Date/index.native.js +315 -38
- package/dist/esm/fields/Date/index.native.js.map +1 -1
- package/dist/esm/fields/Date/types.mjs +2 -0
- package/dist/esm/fields/Date/types.mjs.map +1 -0
- package/dist/esm/fields/Date/types.native.js +2 -0
- package/dist/esm/fields/Date/types.native.js.map +1 -0
- package/dist/esm/fields/Date/wire.mjs +4 -8
- package/dist/esm/fields/Date/wire.mjs.map +1 -1
- package/dist/esm/fields/Date/wire.native.js +4 -11
- package/dist/esm/fields/Date/wire.native.js.map +1 -1
- package/dist/esm/fields/DynamicLink.mjs +2 -0
- package/dist/esm/fields/DynamicLink.mjs.map +1 -1
- package/dist/esm/fields/DynamicLink.native.js +2 -0
- package/dist/esm/fields/DynamicLink.native.js.map +1 -1
- package/dist/esm/fields/FileUpload.mjs +2 -0
- package/dist/esm/fields/FileUpload.mjs.map +1 -1
- package/dist/esm/fields/FileUpload.native.js +2 -0
- package/dist/esm/fields/FileUpload.native.js.map +1 -1
- package/dist/esm/fields/TableMultiSelect.mjs +7 -2
- package/dist/esm/fields/TableMultiSelect.mjs.map +1 -1
- package/dist/esm/fields/TableMultiSelect.native.js +7 -2
- package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/esm/frappeStoryTarget.mjs +88 -2
- package/dist/esm/frappeStoryTarget.mjs.map +1 -1
- package/dist/esm/frappeStoryTarget.native.js +100 -2
- package/dist/esm/frappeStoryTarget.native.js.map +1 -1
- package/dist/esm/frappeUsers.mjs +2 -0
- package/dist/esm/frappeUsers.mjs.map +1 -1
- package/dist/esm/frappeUsers.native.js +2 -0
- package/dist/esm/frappeUsers.native.js.map +1 -1
- package/dist/esm/index.mjs +7 -3
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +7 -3
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/liveErrors.mjs +5 -1
- package/dist/esm/liveErrors.mjs.map +1 -1
- package/dist/esm/liveErrors.native.js +5 -1
- package/dist/esm/liveErrors.native.js.map +1 -1
- package/dist/esm/useFrappeAggregate.mjs +13 -1
- package/dist/esm/useFrappeAggregate.mjs.map +1 -1
- package/dist/esm/useFrappeAggregate.native.js +14 -1
- package/dist/esm/useFrappeAggregate.native.js.map +1 -1
- package/dist/esm/useFrappeFacets.mjs +299 -0
- package/dist/esm/useFrappeFacets.mjs.map +1 -0
- package/dist/esm/useFrappeFacets.native.js +599 -0
- package/dist/esm/useFrappeFacets.native.js.map +1 -0
- package/dist/jsx/FrappeAssignment.mjs +2 -0
- package/dist/jsx/FrappeAssignment.mjs.map +1 -1
- package/dist/jsx/FrappeAssignment.native.js +2 -0
- package/dist/jsx/FrappeAssignment.native.js.map +1 -1
- package/dist/jsx/FrappeCalendar.mjs +6 -8
- package/dist/jsx/FrappeCalendar.mjs.map +1 -1
- package/dist/jsx/FrappeCalendar.native.js +5 -9
- package/dist/jsx/FrappeCalendar.native.js.map +1 -1
- package/dist/jsx/FrappeChartCard.mjs +2 -0
- package/dist/jsx/FrappeChartCard.mjs.map +1 -1
- package/dist/jsx/FrappeChartCard.native.js +2 -0
- package/dist/jsx/FrappeChartCard.native.js.map +1 -1
- package/dist/jsx/FrappeDashboard.mjs +12 -19
- package/dist/jsx/FrappeDashboard.mjs.map +1 -1
- package/dist/jsx/FrappeDashboard.native.js +20 -22
- package/dist/jsx/FrappeDashboard.native.js.map +1 -1
- package/dist/jsx/FrappeForm.mjs +3 -1
- package/dist/jsx/FrappeForm.mjs.map +1 -1
- package/dist/jsx/FrappeForm.native.js +3 -1
- package/dist/jsx/FrappeForm.native.js.map +1 -1
- package/dist/jsx/FrappeGantt.mjs +6 -8
- package/dist/jsx/FrappeGantt.mjs.map +1 -1
- package/dist/jsx/FrappeGantt.native.js +5 -9
- package/dist/jsx/FrappeGantt.native.js.map +1 -1
- package/dist/jsx/FrappeImageView.mjs +3 -1
- package/dist/jsx/FrappeImageView.mjs.map +1 -1
- package/dist/jsx/FrappeImageView.native.js +3 -1
- package/dist/jsx/FrappeImageView.native.js.map +1 -1
- package/dist/jsx/FrappeKPICard.mjs +2 -0
- package/dist/jsx/FrappeKPICard.mjs.map +1 -1
- package/dist/jsx/FrappeKPICard.native.js +2 -0
- package/dist/jsx/FrappeKPICard.native.js.map +1 -1
- package/dist/jsx/FrappeKanban.mjs +3 -1
- package/dist/jsx/FrappeKanban.mjs.map +1 -1
- package/dist/jsx/FrappeKanban.native.js +3 -1
- package/dist/jsx/FrappeKanban.native.js.map +1 -1
- package/dist/jsx/FrappeLikedBy.mjs +2 -0
- package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
- package/dist/jsx/FrappeLikedBy.native.js +2 -0
- package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
- package/dist/jsx/FrappeList.mjs +3 -1
- package/dist/jsx/FrappeList.mjs.map +1 -1
- package/dist/jsx/FrappeList.native.js +3 -1
- package/dist/jsx/FrappeList.native.js.map +1 -1
- package/dist/jsx/FrappeListView.mjs +7 -13
- package/dist/jsx/FrappeListView.mjs.map +1 -1
- package/dist/jsx/FrappeListView.native.js +13 -12
- package/dist/jsx/FrappeListView.native.js.map +1 -1
- package/dist/jsx/FrappeProvider.mjs +5 -1
- package/dist/jsx/FrappeProvider.mjs.map +1 -1
- package/dist/jsx/FrappeProvider.native.js +5 -1
- package/dist/jsx/FrappeProvider.native.js.map +1 -1
- package/dist/jsx/FrappeReportBuilder.mjs +2 -0
- package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
- package/dist/jsx/FrappeReportBuilder.native.js +2 -0
- package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
- package/dist/jsx/FrappeReportView.mjs +26 -49
- package/dist/jsx/FrappeReportView.mjs.map +1 -1
- package/dist/jsx/FrappeReportView.native.js +35 -50
- package/dist/jsx/FrappeReportView.native.js.map +1 -1
- package/dist/jsx/FrappeTable.mjs +107 -33
- package/dist/jsx/FrappeTable.mjs.map +1 -1
- package/dist/jsx/FrappeTable.native.js +140 -42
- package/dist/jsx/FrappeTable.native.js.map +1 -1
- package/dist/jsx/FrappeTreeView.mjs +3 -1
- package/dist/jsx/FrappeTreeView.mjs.map +1 -1
- package/dist/jsx/FrappeTreeView.native.js +3 -1
- package/dist/jsx/FrappeTreeView.native.js.map +1 -1
- package/dist/jsx/SyncErrorNotice.mjs +51 -0
- package/dist/jsx/SyncErrorNotice.mjs.map +1 -0
- package/dist/jsx/SyncErrorNotice.native.js +92 -0
- package/dist/jsx/SyncErrorNotice.native.js.map +1 -0
- package/dist/jsx/commentActions.mjs +95 -0
- package/dist/jsx/commentActions.mjs.map +1 -0
- package/dist/jsx/commentActions.native.js +129 -0
- package/dist/jsx/commentActions.native.js.map +1 -0
- package/dist/jsx/components/attachments.mjs +2 -0
- package/dist/jsx/components/attachments.mjs.map +1 -1
- package/dist/jsx/components/attachments.native.js +2 -0
- package/dist/jsx/components/attachments.native.js.map +1 -1
- package/dist/jsx/components/tags.mjs +5 -0
- package/dist/jsx/components/tags.mjs.map +1 -1
- package/dist/jsx/components/tags.native.js +5 -0
- package/dist/jsx/components/tags.native.js.map +1 -1
- package/dist/jsx/components/timeline.mjs +31 -4
- package/dist/jsx/components/timeline.mjs.map +1 -1
- package/dist/jsx/components/timeline.native.js +33 -2
- package/dist/jsx/components/timeline.native.js.map +1 -1
- package/dist/jsx/desk/DeskFormSidebar.mjs +2 -0
- package/dist/jsx/desk/DeskFormSidebar.mjs.map +1 -1
- package/dist/jsx/desk/DeskFormSidebar.native.js +2 -0
- package/dist/jsx/desk/DeskFormSidebar.native.js.map +1 -1
- package/dist/jsx/fieldRegistry.mjs +2 -0
- package/dist/jsx/fieldRegistry.mjs.map +1 -1
- package/dist/jsx/fieldRegistry.native.js +2 -0
- package/dist/jsx/fieldRegistry.native.js.map +1 -1
- package/dist/jsx/fields/Date/index.mjs +73 -9
- package/dist/jsx/fields/Date/index.mjs.map +1 -1
- package/dist/jsx/fields/Date/index.native.js +325 -37
- package/dist/jsx/fields/Date/index.native.js.map +1 -1
- package/dist/jsx/fields/Date/types.mjs +2 -0
- package/dist/jsx/fields/Date/types.mjs.map +1 -0
- package/dist/jsx/fields/Date/types.native.js +21 -0
- package/dist/jsx/fields/Date/types.native.js.map +1 -0
- package/dist/jsx/fields/Date/wire.mjs +4 -8
- package/dist/jsx/fields/Date/wire.mjs.map +1 -1
- package/dist/jsx/fields/Date/wire.native.js +4 -11
- package/dist/jsx/fields/Date/wire.native.js.map +1 -1
- package/dist/jsx/fields/DynamicLink.mjs +2 -0
- package/dist/jsx/fields/DynamicLink.mjs.map +1 -1
- package/dist/jsx/fields/DynamicLink.native.js +2 -0
- package/dist/jsx/fields/DynamicLink.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload.mjs +2 -0
- package/dist/jsx/fields/FileUpload.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload.native.js +2 -0
- package/dist/jsx/fields/FileUpload.native.js.map +1 -1
- package/dist/jsx/fields/TableMultiSelect.mjs +7 -2
- package/dist/jsx/fields/TableMultiSelect.mjs.map +1 -1
- package/dist/jsx/fields/TableMultiSelect.native.js +6 -1
- package/dist/jsx/fields/TableMultiSelect.native.js.map +1 -1
- package/dist/jsx/frappeStoryTarget.mjs +88 -2
- package/dist/jsx/frappeStoryTarget.mjs.map +1 -1
- package/dist/jsx/frappeStoryTarget.native.js +100 -0
- package/dist/jsx/frappeStoryTarget.native.js.map +1 -1
- package/dist/jsx/frappeUsers.mjs +2 -0
- package/dist/jsx/frappeUsers.mjs.map +1 -1
- package/dist/jsx/frappeUsers.native.js +2 -0
- package/dist/jsx/frappeUsers.native.js.map +1 -1
- package/dist/jsx/index.js +7 -3
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +7 -3
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +17 -4
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/liveErrors.mjs +5 -1
- package/dist/jsx/liveErrors.mjs.map +1 -1
- package/dist/jsx/liveErrors.native.js +5 -1
- package/dist/jsx/liveErrors.native.js.map +1 -1
- package/dist/jsx/useFrappeAggregate.mjs +13 -1
- package/dist/jsx/useFrappeAggregate.mjs.map +1 -1
- package/dist/jsx/useFrappeAggregate.native.js +14 -1
- package/dist/jsx/useFrappeAggregate.native.js.map +1 -1
- package/dist/jsx/useFrappeFacets.mjs +299 -0
- package/dist/jsx/useFrappeFacets.mjs.map +1 -0
- package/dist/jsx/useFrappeFacets.native.js +632 -0
- package/dist/jsx/useFrappeFacets.native.js.map +1 -0
- package/package.json +20 -20
- package/src/FormSidebar.stories.tsx +88 -10
- package/src/FrappeAssignment.tsx +2 -0
- package/src/FrappeCalendar.tsx +12 -7
- package/src/FrappeChartCard.tsx +9 -2
- package/src/FrappeDashboard.spec.tsx +95 -0
- package/src/FrappeDashboard.tsx +20 -41
- package/src/FrappeForm.stories.tsx +53 -46
- package/src/FrappeForm.tsx +11 -1
- package/src/FrappeGantt.tsx +12 -7
- package/src/FrappeImageView.tsx +11 -1
- package/src/FrappeKPICard.stories.tsx +4 -1
- package/src/FrappeKPICard.tsx +2 -0
- package/src/FrappeKanban.tsx +4 -0
- package/src/FrappeLikedBy.stories.tsx +26 -10
- package/src/FrappeLikedBy.tsx +2 -0
- package/src/FrappeList.tsx +11 -1
- package/src/FrappeListView.spec.tsx +144 -0
- package/src/FrappeListView.tsx +11 -23
- package/src/FrappeProvider.tsx +30 -2
- package/src/FrappeReportBuilder.tsx +2 -0
- package/src/FrappeReportView.spec.tsx +140 -16
- package/src/FrappeReportView.stories.tsx +12 -6
- package/src/FrappeReportView.tsx +62 -61
- package/src/FrappeTable.keepRows.spec.tsx +200 -0
- package/src/FrappeTable.retryStorm.spec.tsx +140 -0
- package/src/FrappeTable.spec.tsx +222 -0
- package/src/FrappeTable.tsx +211 -54
- package/src/FrappeTreeView.tsx +11 -1
- package/src/SyncErrorNotice.spec.tsx +60 -0
- package/src/SyncErrorNotice.tsx +81 -0
- package/src/commentActions.ts +157 -0
- package/src/components/attachments.tsx +2 -0
- package/src/components/tags.tsx +14 -1
- package/src/components/timeline.optimistic.spec.tsx +106 -0
- package/src/components/timeline.tsx +36 -4
- package/src/desk/DeskFormSidebar.tsx +2 -0
- package/src/fieldRegistry.ts +2 -0
- package/src/fields/Date/index.native.tsx +410 -0
- package/src/fields/Date/index.tsx +138 -57
- package/src/fields/Date/nativePresentation.spec.tsx +251 -0
- package/src/fields/Date/typeParity.spec.tsx +480 -0
- package/src/fields/Date/types.ts +53 -0
- package/src/fields/Date/wire.spec.ts +63 -1
- package/src/fields/Date/wire.ts +17 -17
- package/src/fields/DynamicLink.tsx +2 -0
- package/src/fields/FileUpload.tsx +2 -0
- package/src/fields/TableMultiSelect.tsx +6 -3
- package/src/frappeStoryTarget.tsx +104 -1
- package/src/frappeUsers.ts +2 -0
- package/src/index.spec.ts +62 -0
- package/src/index.ts +36 -2
- package/src/liveErrors.spec.ts +50 -0
- package/src/liveErrors.ts +11 -1
- package/src/useFrappeAggregate.ts +20 -1
- package/src/useFrappeFacets.spec.tsx +436 -0
- package/src/useFrappeFacets.ts +568 -0
- package/types/FrappeAssignment.d.ts.map +1 -1
- package/types/FrappeCalendar.d.ts.map +1 -1
- package/types/FrappeChartCard.d.ts +1 -2
- package/types/FrappeChartCard.d.ts.map +1 -1
- package/types/FrappeDashboard.d.ts +0 -1
- package/types/FrappeDashboard.d.ts.map +1 -1
- package/types/FrappeForm.d.ts.map +1 -1
- package/types/FrappeGantt.d.ts.map +1 -1
- package/types/FrappeKPICard.d.ts.map +1 -1
- package/types/FrappeKanban.d.ts.map +1 -1
- package/types/FrappeLikedBy.d.ts.map +1 -1
- package/types/FrappeList.d.ts.map +1 -1
- package/types/FrappeListView.d.ts.map +1 -1
- package/types/FrappeProvider.d.ts +18 -1
- package/types/FrappeProvider.d.ts.map +1 -1
- package/types/FrappeReportBuilder.d.ts.map +1 -1
- package/types/FrappeReportView.d.ts +22 -15
- package/types/FrappeReportView.d.ts.map +1 -1
- package/types/FrappeTable.d.ts +21 -2
- package/types/FrappeTable.d.ts.map +1 -1
- package/types/FrappeTreeView.d.ts.map +1 -1
- package/types/SyncErrorNotice.d.ts +38 -0
- package/types/SyncErrorNotice.d.ts.map +1 -0
- package/types/commentActions.d.ts +46 -0
- package/types/commentActions.d.ts.map +1 -0
- package/types/components/attachments.d.ts.map +1 -1
- package/types/components/tags.d.ts.map +1 -1
- package/types/components/timeline.d.ts.map +1 -1
- package/types/desk/DeskFormSidebar.d.ts.map +1 -1
- package/types/fieldRegistry.d.ts.map +1 -1
- package/types/fields/Date/index.d.ts +22 -12
- package/types/fields/Date/index.d.ts.map +1 -1
- package/types/fields/Date/index.native.d.ts +14 -0
- package/types/fields/Date/index.native.d.ts.map +1 -0
- package/types/fields/Date/types.d.ts +27 -0
- package/types/fields/Date/types.d.ts.map +1 -0
- package/types/fields/Date/wire.d.ts +13 -9
- package/types/fields/Date/wire.d.ts.map +1 -1
- package/types/fields/DynamicLink.d.ts.map +1 -1
- package/types/fields/FileUpload.d.ts.map +1 -1
- package/types/fields/TableMultiSelect.d.ts.map +1 -1
- package/types/frappeStoryTarget.d.ts +19 -1
- package/types/frappeStoryTarget.d.ts.map +1 -1
- package/types/frappeUsers.d.ts.map +1 -1
- package/types/index.d.ts +6 -2
- package/types/index.d.ts.map +1 -1
- package/types/liveErrors.d.ts +4 -0
- package/types/liveErrors.d.ts.map +1 -1
- package/types/useFrappeAggregate.d.ts +4 -0
- package/types/useFrappeAggregate.d.ts.map +1 -1
- package/types/useFrappeFacets.d.ts +143 -0
- package/types/useFrappeFacets.d.ts.map +1 -0
- package/dist/cjs/fields/Date/date.native.js +0 -277
- package/dist/cjs/fields/Date/date.native.js.map +0 -1
- package/dist/esm/fields/Date/date.native.js +0 -238
- package/dist/esm/fields/Date/date.native.js.map +0 -1
- package/dist/jsx/fields/Date/date.native.js +0 -277
- package/dist/jsx/fields/Date/date.native.js.map +0 -1
- package/src/fields/Date/date.native.tsx +0 -299
- package/types/fields/Date/date.native.d.ts +0 -19
- package/types/fields/Date/date.native.d.ts.map +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimistic comment writes for timeline surfaces (frappe-ui Timeline and
|
|
3
|
+
* the backoffice FormTimeline).
|
|
4
|
+
*
|
|
5
|
+
* Server-side parity ruling: the desk RPCs are KEPT as the transport,
|
|
6
|
+
* wrapped in engine mutations via `mutation.execute`. A plain live
|
|
7
|
+
* `create_doc` on Comment is NOT equivalent to
|
|
8
|
+
* `frappe.desk.form.utils.add_comment` — upstream, add_comment inserts
|
|
9
|
+
* with ignore_permissions (any user who can read the reference doc may
|
|
10
|
+
* comment, without Comment-create permission) and extracts inline images
|
|
11
|
+
* into Files. Losing either silently would be a regression, so the RPC
|
|
12
|
+
* stays; the engine supplies optimism, journaling, temp→real remap, and
|
|
13
|
+
* rollback around it. In fixture mode there is no desk endpoint, so the
|
|
14
|
+
* engine's default REST-shape path (FixtureDbModule) is used instead.
|
|
15
|
+
*/
|
|
16
|
+
import {
|
|
17
|
+
FrappeApp,
|
|
18
|
+
Operation,
|
|
19
|
+
getFrappeSyncModule,
|
|
20
|
+
type FrappeDoc,
|
|
21
|
+
type FrappeDocData,
|
|
22
|
+
type UseFrappeCollectionConfig,
|
|
23
|
+
} from "@multiplatform.one/frappe";
|
|
24
|
+
import { useMemo } from "react";
|
|
25
|
+
|
|
26
|
+
type CommentDoc = FrappeDoc<FrappeDocData>;
|
|
27
|
+
|
|
28
|
+
export interface AddCommentInput {
|
|
29
|
+
content: string;
|
|
30
|
+
/** Session user's email (`comment_email` on the Comment). */
|
|
31
|
+
email: string;
|
|
32
|
+
/** Display name (`comment_by`); falls back to the email. */
|
|
33
|
+
fullname?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface FrappeCommentActions {
|
|
37
|
+
/**
|
|
38
|
+
* Inserts a comment optimistically: the row paints from the in-memory
|
|
39
|
+
* store immediately under a `local:` identity, the desk RPC runs in the
|
|
40
|
+
* background, and the ack remaps to the server-assigned name (the
|
|
41
|
+
* realtime echo then reconciles idempotently). On rejection the row is
|
|
42
|
+
* rolled back and the failure lands in the mutation ledger
|
|
43
|
+
* (`useFrappePendingMutations` + `SyncErrorNotice`).
|
|
44
|
+
*/
|
|
45
|
+
addComment: (input: AddCommentInput) => Promise<void>;
|
|
46
|
+
/** Optimistic content edit via `frappe.desk.form.utils.update_comment`. */
|
|
47
|
+
updateComment: (commentName: string, content: string) => Promise<void>;
|
|
48
|
+
/** Optimistic delete via `frappe.client.delete`. */
|
|
49
|
+
deleteComment: (commentName: string) => Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function nowFrappeTimestamp(): string {
|
|
53
|
+
// Frappe timestamps are "YYYY-MM-DD HH:mm:ss.SSSSSS" naive datetimes.
|
|
54
|
+
return new Date().toISOString().replace("T", " ").replace("Z", "");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Builds the optimistic comment actions for one referenced document. The
|
|
59
|
+
* mutations run through the shared sync engine, so any mounted Comment
|
|
60
|
+
* collection (frappe-ui Timeline, backoffice FormTimeline) repaints
|
|
61
|
+
* optimistically without extra wiring.
|
|
62
|
+
*/
|
|
63
|
+
export function useFrappeCommentActions(
|
|
64
|
+
config: UseFrappeCollectionConfig | undefined,
|
|
65
|
+
doctype: string,
|
|
66
|
+
docname: string,
|
|
67
|
+
): FrappeCommentActions {
|
|
68
|
+
return useMemo(() => {
|
|
69
|
+
const app =
|
|
70
|
+
config && !config.fixtures
|
|
71
|
+
? new FrappeApp(config.baseURL, (config.auth ?? {}) as Record<string, unknown>)
|
|
72
|
+
: undefined;
|
|
73
|
+
|
|
74
|
+
const requireSync = () => {
|
|
75
|
+
const sync = getFrappeSyncModule(config);
|
|
76
|
+
if (!sync) throw new Error("Frappe connection is not available");
|
|
77
|
+
return sync;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const addComment = async ({ content, email, fullname }: AddCommentInput) => {
|
|
81
|
+
const sync = requireSync();
|
|
82
|
+
const doc: CommentDoc = {
|
|
83
|
+
doctype: "Comment",
|
|
84
|
+
name: `local:${crypto.randomUUID()}`,
|
|
85
|
+
comment_type: "Comment",
|
|
86
|
+
reference_doctype: doctype,
|
|
87
|
+
reference_name: docname,
|
|
88
|
+
content,
|
|
89
|
+
comment_email: email,
|
|
90
|
+
comment_by: fullname || email,
|
|
91
|
+
owner: email,
|
|
92
|
+
creation: nowFrappeTimestamp(),
|
|
93
|
+
modified: nowFrappeTimestamp(),
|
|
94
|
+
};
|
|
95
|
+
await sync.mutate({
|
|
96
|
+
mutationId: crypto.randomUUID(),
|
|
97
|
+
operation: Operation.Create,
|
|
98
|
+
doc,
|
|
99
|
+
execute: app
|
|
100
|
+
? async () => {
|
|
101
|
+
const response = await app
|
|
102
|
+
.call()
|
|
103
|
+
.post<{ message?: CommentDoc }>("frappe.desk.form.utils.add_comment", {
|
|
104
|
+
reference_doctype: doctype,
|
|
105
|
+
reference_name: docname,
|
|
106
|
+
content,
|
|
107
|
+
comment_email: email,
|
|
108
|
+
comment_by: fullname || email,
|
|
109
|
+
});
|
|
110
|
+
const payload = response?.payload;
|
|
111
|
+
const created = (payload?.message ?? payload) as CommentDoc | undefined;
|
|
112
|
+
if (!created?.name) throw new Error("add_comment returned no document");
|
|
113
|
+
return created;
|
|
114
|
+
}
|
|
115
|
+
: undefined,
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const updateComment = async (commentName: string, content: string) => {
|
|
120
|
+
const sync = requireSync();
|
|
121
|
+
await sync.mutate({
|
|
122
|
+
mutationId: crypto.randomUUID(),
|
|
123
|
+
operation: Operation.Update,
|
|
124
|
+
doc: { doctype: "Comment", name: commentName, content } as CommentDoc,
|
|
125
|
+
execute: app
|
|
126
|
+
? async () => {
|
|
127
|
+
await app.call().post("frappe.desk.form.utils.update_comment", {
|
|
128
|
+
name: commentName,
|
|
129
|
+
content,
|
|
130
|
+
});
|
|
131
|
+
// update_comment returns no document — the optimistic value
|
|
132
|
+
// stands until the realtime echo reconciles.
|
|
133
|
+
}
|
|
134
|
+
: undefined,
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const deleteComment = async (commentName: string) => {
|
|
139
|
+
const sync = requireSync();
|
|
140
|
+
await sync.mutate({
|
|
141
|
+
mutationId: crypto.randomUUID(),
|
|
142
|
+
operation: Operation.Delete,
|
|
143
|
+
doc: { doctype: "Comment", name: commentName } as CommentDoc,
|
|
144
|
+
execute: app
|
|
145
|
+
? async () => {
|
|
146
|
+
await app.call().post("frappe.client.delete", {
|
|
147
|
+
doctype: "Comment",
|
|
148
|
+
name: commentName,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
: undefined,
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
return { addComment, updateComment, deleteComment };
|
|
156
|
+
}, [config?.baseURL, config?.fixtures, doctype, docname]);
|
|
157
|
+
}
|
package/src/components/tags.tsx
CHANGED
|
@@ -28,8 +28,21 @@ export interface FrappeTagsProps extends Omit<TagsProps, "tags" | "suggestions">
|
|
|
28
28
|
export function Tags({ doctype, docname, onAdd, onRemove, enableAdd, ...props }: FrappeTagsProps) {
|
|
29
29
|
const config = useFrappeConfig();
|
|
30
30
|
|
|
31
|
+
// Forward the full socket target + engine options: the SyncModule cache
|
|
32
|
+
// keys on baseURL + socketPort/socketBaseURL/siteName, so dropping them
|
|
33
|
+
// here would split Tags onto a second SyncModule (own socket, own cache)
|
|
34
|
+
// whenever the provider sets them.
|
|
31
35
|
const connectionConfig = config
|
|
32
|
-
? {
|
|
36
|
+
? {
|
|
37
|
+
baseURL: config.baseURL,
|
|
38
|
+
socketPort: config.socketPort,
|
|
39
|
+
siteName: config.siteName,
|
|
40
|
+
socketBaseURL: config.socketBaseURL,
|
|
41
|
+
auth: config.auth,
|
|
42
|
+
syncOptions: config.syncOptions,
|
|
43
|
+
socketOptions: config.socketOptions,
|
|
44
|
+
fixtures: config.fixtures,
|
|
45
|
+
}
|
|
33
46
|
: undefined;
|
|
34
47
|
|
|
35
48
|
const tagLinkFilters = useMemo<Array<[string, string, unknown]>>(
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// The comment repro kill, as a deferred-network spec: a comment submitted
|
|
2
|
+
// through the Timeline composer must PAINT before the server ack resolves
|
|
3
|
+
// (the whole point of the live client's in-memory store), then reconcile to
|
|
4
|
+
// the server-assigned name without duplicating when the ack lands.
|
|
5
|
+
import { InMemoryFixtureProvider, type FrappeDocData } from "@multiplatform.one/frappe";
|
|
6
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
7
|
+
import { cleanup, fireEvent, screen, waitFor } from "@testing-library/react";
|
|
8
|
+
import i18next from "i18next";
|
|
9
|
+
import { initReactI18next } from "react-i18next";
|
|
10
|
+
import { afterEach, beforeAll, describe, expect, it } from "vitest";
|
|
11
|
+
import { FrappeProvider } from "../FrappeProvider";
|
|
12
|
+
import { Timeline } from "./timeline";
|
|
13
|
+
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
await i18next.use(initReactI18next).init({
|
|
16
|
+
lng: "en",
|
|
17
|
+
interpolation: { escapeValue: false },
|
|
18
|
+
resources: { en: { translation: {} } },
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
afterEach(cleanup);
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Fixture provider whose creates hang until `release()` — the "server" is
|
|
26
|
+
* slow. Assigns a server-style name (drops the client's `local:` identity)
|
|
27
|
+
* so the temp→real remap path is exercised too.
|
|
28
|
+
*/
|
|
29
|
+
class DeferredCreateFixtureProvider extends InMemoryFixtureProvider {
|
|
30
|
+
private pendingCreates: Array<() => void> = [];
|
|
31
|
+
private serial = 0;
|
|
32
|
+
|
|
33
|
+
get pendingCount() {
|
|
34
|
+
return this.pendingCreates.length;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async createDoc<TDoc extends FrappeDocData>(doctype: string, doc: Partial<TDoc>): Promise<TDoc> {
|
|
38
|
+
await new Promise<void>((resolve) => this.pendingCreates.push(resolve));
|
|
39
|
+
const { name: _clientName, ...rest } = doc as Record<string, unknown>;
|
|
40
|
+
return super.createDoc(doctype, {
|
|
41
|
+
...rest,
|
|
42
|
+
name: `CMT-${String(++this.serial).padStart(3, "0")}`,
|
|
43
|
+
} as Partial<TDoc>);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
release() {
|
|
47
|
+
const pending = this.pendingCreates.splice(0);
|
|
48
|
+
for (const resolve of pending) resolve();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const makeFixtures = () =>
|
|
53
|
+
new DeferredCreateFixtureProvider({
|
|
54
|
+
Comment: [
|
|
55
|
+
{
|
|
56
|
+
name: "CMT-EXISTING",
|
|
57
|
+
doctype: "Comment",
|
|
58
|
+
comment_type: "Comment",
|
|
59
|
+
content: "already here",
|
|
60
|
+
comment_by: "Jane Doe",
|
|
61
|
+
comment_email: "jane@example.com",
|
|
62
|
+
reference_doctype: "Task",
|
|
63
|
+
reference_name: "TASK-001",
|
|
64
|
+
creation: "2024-01-01 10:00:00",
|
|
65
|
+
owner: "jane@example.com",
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
Version: [],
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe("Timeline optimistic comments (deferred network)", () => {
|
|
72
|
+
it("paints the comment row BEFORE the create ack resolves, then reconciles without duplicating", async () => {
|
|
73
|
+
const fixtures = makeFixtures();
|
|
74
|
+
renderWithProviders(
|
|
75
|
+
<FrappeProvider baseURL="https://bench.example.com" fixtures={fixtures}>
|
|
76
|
+
<Timeline doctype="Task" docname="TASK-001" />
|
|
77
|
+
</FrappeProvider>,
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
// Seeded comment arrives from the fixture store.
|
|
81
|
+
expect(await screen.findByText("already here")).toBeTruthy();
|
|
82
|
+
|
|
83
|
+
// Submit through the composer — no onAddComment prop: this is the
|
|
84
|
+
// default engine write path (previously a silent drop).
|
|
85
|
+
const input = screen.getByPlaceholderText("Add a comment...");
|
|
86
|
+
fireEvent.change(input, { target: { value: "optimistic!" } });
|
|
87
|
+
fireEvent.click(screen.getByRole("button", { name: /Comment/ }));
|
|
88
|
+
|
|
89
|
+
// THE REPRO KILL: the row paints while the server ack is still pending.
|
|
90
|
+
await waitFor(() => {
|
|
91
|
+
expect(screen.getByText("optimistic!")).toBeTruthy();
|
|
92
|
+
});
|
|
93
|
+
expect(fixtures.pendingCount).toBeGreaterThan(0);
|
|
94
|
+
|
|
95
|
+
// Ack lands: the local: identity remaps to the server name — the row
|
|
96
|
+
// stays painted and does not duplicate.
|
|
97
|
+
fixtures.release();
|
|
98
|
+
await waitFor(() => {
|
|
99
|
+
expect(fixtures.getData().Comment?.some((c) => c.content === "optimistic!")).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
await waitFor(() => {
|
|
102
|
+
expect(screen.getAllByText("optimistic!")).toHaveLength(1);
|
|
103
|
+
});
|
|
104
|
+
expect(screen.getByText("already here")).toBeTruthy();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
@@ -4,8 +4,9 @@ import {
|
|
|
4
4
|
type TimelineProps,
|
|
5
5
|
type VersionChange,
|
|
6
6
|
} from "@multiplatform.one/components";
|
|
7
|
-
import { useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
|
|
8
|
-
import { useCallback, useMemo } from "react";
|
|
7
|
+
import { FrappeApp, useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
|
|
8
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
9
|
+
import { useFrappeCommentActions } from "../commentActions";
|
|
9
10
|
import { useFrappeConfig } from "../FrappeProvider";
|
|
10
11
|
|
|
11
12
|
export interface FrappeComment {
|
|
@@ -124,6 +125,8 @@ export function Timeline({
|
|
|
124
125
|
? {
|
|
125
126
|
baseURL: config.baseURL,
|
|
126
127
|
socketPort: config.socketPort,
|
|
128
|
+
siteName: config.siteName,
|
|
129
|
+
socketBaseURL: config.socketBaseURL,
|
|
127
130
|
auth: config.auth,
|
|
128
131
|
syncOptions: config.syncOptions,
|
|
129
132
|
socketOptions: config.socketOptions,
|
|
@@ -195,11 +198,40 @@ export function Timeline({
|
|
|
195
198
|
);
|
|
196
199
|
}, [commentsData, versionsData, showComments, showVersions, showAttachments, showAssignments]);
|
|
197
200
|
|
|
201
|
+
// Default write path: comments insert through the sync engine (optimistic
|
|
202
|
+
// paint, desk-RPC transport, rollback on rejection). Previously the
|
|
203
|
+
// composer only forwarded to the onAddComment prop, and consumers that
|
|
204
|
+
// didn't pass one (FrappeForm) dropped the comment silently.
|
|
205
|
+
const { addComment } = useFrappeCommentActions(connectionConfig, doctype, docname);
|
|
206
|
+
const sessionUserRef = useRef<string | undefined>(undefined);
|
|
207
|
+
|
|
208
|
+
const resolveSessionUser = useCallback(async (): Promise<string> => {
|
|
209
|
+
if (sessionUserRef.current) return sessionUserRef.current;
|
|
210
|
+
if (config && !config.fixtures) {
|
|
211
|
+
const app = new FrappeApp(config.baseURL, (config.auth ?? {}) as Record<string, unknown>);
|
|
212
|
+
sessionUserRef.current = await app.auth().getLoggedInUser();
|
|
213
|
+
} else {
|
|
214
|
+
// Fixture/story mode has no session endpoint.
|
|
215
|
+
sessionUserRef.current = "Administrator";
|
|
216
|
+
}
|
|
217
|
+
return sessionUserRef.current;
|
|
218
|
+
}, [config?.baseURL, config?.fixtures]);
|
|
219
|
+
|
|
198
220
|
const handleAddComment = useCallback(
|
|
199
221
|
(content: string) => {
|
|
200
|
-
onAddComment
|
|
222
|
+
if (onAddComment) {
|
|
223
|
+
onAddComment(content);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
void (async () => {
|
|
227
|
+
const email = await resolveSessionUser();
|
|
228
|
+
await addComment({ content, email });
|
|
229
|
+
})().catch(() => {
|
|
230
|
+
// Rejection already rolled back and landed in the mutation ledger
|
|
231
|
+
// (useFrappePendingMutations / SyncErrorNotice at the surface).
|
|
232
|
+
});
|
|
201
233
|
},
|
|
202
|
-
[onAddComment],
|
|
234
|
+
[onAddComment, addComment, resolveSessionUser],
|
|
203
235
|
);
|
|
204
236
|
|
|
205
237
|
// The base Timeline follows the `timestampStyle` house knob (default
|
|
@@ -56,6 +56,8 @@ export function DeskFormSidebar({ doctype, name }: DeskFormSidebarProps) {
|
|
|
56
56
|
? {
|
|
57
57
|
baseURL: config.baseURL,
|
|
58
58
|
socketPort: config.socketPort,
|
|
59
|
+
siteName: config.siteName,
|
|
60
|
+
socketBaseURL: config.socketBaseURL,
|
|
59
61
|
auth: config.auth,
|
|
60
62
|
syncOptions: config.syncOptions,
|
|
61
63
|
fixtures: config.fixtures,
|
package/src/fieldRegistry.ts
CHANGED
|
@@ -1154,6 +1154,8 @@ function TableAdapter(props: FieldRenderProps) {
|
|
|
1154
1154
|
? {
|
|
1155
1155
|
baseURL: config.baseURL,
|
|
1156
1156
|
socketPort: config.socketPort,
|
|
1157
|
+
siteName: config.siteName,
|
|
1158
|
+
socketBaseURL: config.socketBaseURL,
|
|
1157
1159
|
auth: config.auth,
|
|
1158
1160
|
syncOptions: config.syncOptions,
|
|
1159
1161
|
fixtures: config.fixtures,
|