@conduction/nextcloud-vue 0.1.0-beta.2 → 0.1.0-beta.4

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.
Files changed (153) hide show
  1. package/README.md +226 -226
  2. package/css/index.css +5 -0
  3. package/dist/nextcloud-vue.cjs.js +60455 -8755
  4. package/dist/nextcloud-vue.cjs.js.map +1 -1
  5. package/dist/nextcloud-vue.css +2062 -528
  6. package/dist/nextcloud-vue.esm.js +60411 -8731
  7. package/dist/nextcloud-vue.esm.js.map +1 -1
  8. package/package.json +75 -61
  9. package/src/components/CnActionsBar/CnActionsBar.vue +235 -225
  10. package/src/components/CnActionsBar/index.js +1 -1
  11. package/src/components/CnAdvancedFormDialog/CnAdvancedFormDialog.vue +579 -0
  12. package/src/components/CnAdvancedFormDialog/CnDataTab.vue +217 -0
  13. package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +121 -0
  14. package/src/components/CnAdvancedFormDialog/CnPropertiesTab.vue +418 -0
  15. package/src/components/CnAdvancedFormDialog/CnPropertyValueCell.vue +247 -0
  16. package/src/components/CnAdvancedFormDialog/index.js +1 -0
  17. package/src/components/CnCardGrid/CnCardGrid.vue +152 -152
  18. package/src/components/CnCardGrid/index.js +1 -1
  19. package/src/components/CnCellRenderer/CnCellRenderer.vue +132 -132
  20. package/src/components/CnCellRenderer/index.js +1 -1
  21. package/src/components/CnChartWidget/CnChartWidget.vue +320 -0
  22. package/src/components/CnChartWidget/index.js +1 -0
  23. package/src/components/CnConfigurationCard/CnConfigurationCard.vue +77 -77
  24. package/src/components/CnConfigurationCard/index.js +1 -1
  25. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +225 -0
  26. package/src/components/CnDashboardGrid/index.js +1 -0
  27. package/src/components/CnDashboardPage/CnDashboardPage.vue +390 -0
  28. package/src/components/CnDashboardPage/index.js +1 -0
  29. package/src/components/CnDataTable/CnDataTable.vue +349 -349
  30. package/src/components/CnDataTable/index.js +1 -1
  31. package/src/components/CnDetailCard/CnDetailCard.vue +214 -0
  32. package/src/components/CnDetailCard/index.js +1 -0
  33. package/src/components/CnDetailPage/CnDetailPage.vue +281 -0
  34. package/src/components/CnDetailPage/index.js +1 -0
  35. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +231 -223
  36. package/src/components/CnFacetSidebar/index.js +1 -1
  37. package/src/components/CnFilterBar/CnFilterBar.vue +152 -152
  38. package/src/components/CnFilterBar/index.js +1 -1
  39. package/src/components/CnIcon/CnIcon.vue +89 -89
  40. package/src/components/CnIcon/index.js +1 -1
  41. package/src/components/CnIndexPage/CnIndexPage.vue +874 -816
  42. package/src/components/CnIndexPage/index.js +1 -1
  43. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +503 -484
  44. package/src/components/CnIndexSidebar/index.js +1 -1
  45. package/src/components/CnItemCard/CnItemCard.vue +132 -0
  46. package/src/components/CnItemCard/index.js +1 -0
  47. package/src/components/CnKpiGrid/CnKpiGrid.vue +89 -89
  48. package/src/components/CnKpiGrid/index.js +1 -1
  49. package/src/components/CnMassActionBar/CnMassActionBar.vue +160 -160
  50. package/src/components/CnMassActionBar/index.js +1 -1
  51. package/src/components/CnMassCopyDialog/CnMassCopyDialog.vue +320 -320
  52. package/src/components/CnMassCopyDialog/index.js +1 -1
  53. package/src/components/CnMassDeleteDialog/CnMassDeleteDialog.vue +238 -238
  54. package/src/components/CnMassDeleteDialog/index.js +1 -1
  55. package/src/components/CnMassExportDialog/CnMassExportDialog.vue +190 -190
  56. package/src/components/CnMassExportDialog/index.js +1 -1
  57. package/src/components/CnMassImportDialog/CnMassImportDialog.vue +491 -491
  58. package/src/components/CnMassImportDialog/index.js +1 -1
  59. package/src/components/CnNoteCard/CnNoteCard.vue +149 -0
  60. package/src/components/CnNoteCard/index.js +1 -0
  61. package/src/components/CnNotesCard/CnNotesCard.vue +413 -0
  62. package/src/components/CnNotesCard/index.js +1 -0
  63. package/src/components/CnObjectCard/CnObjectCard.vue +292 -292
  64. package/src/components/CnObjectCard/index.js +1 -1
  65. package/src/components/CnObjectSidebar/CnObjectSidebar.vue +876 -0
  66. package/src/components/CnObjectSidebar/index.js +1 -0
  67. package/src/components/CnPageHeader/CnPageHeader.vue +57 -57
  68. package/src/components/CnPageHeader/index.js +1 -1
  69. package/src/components/CnPagination/CnPagination.vue +252 -252
  70. package/src/components/CnPagination/index.js +1 -1
  71. package/src/components/CnRowActions/CnRowActions.vue +73 -73
  72. package/src/components/CnRowActions/index.js +1 -1
  73. package/src/components/CnSchemaFormDialog/CnSchemaConfigurationTab.vue +226 -0
  74. package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +787 -0
  75. package/src/components/CnSchemaFormDialog/CnSchemaPropertiesTab.vue +305 -0
  76. package/src/components/CnSchemaFormDialog/CnSchemaPropertyActions.vue +1398 -0
  77. package/src/components/CnSchemaFormDialog/CnSchemaSecurityTab.vue +236 -0
  78. package/src/components/CnSchemaFormDialog/index.js +1 -0
  79. package/src/components/CnSettingsCard/CnSettingsCard.vue +92 -92
  80. package/src/components/CnSettingsCard/index.js +1 -1
  81. package/src/components/CnSettingsSection/CnSettingsSection.vue +266 -266
  82. package/src/components/CnSettingsSection/index.js +1 -1
  83. package/src/components/CnStatsBlock/CnStatsBlock.vue +420 -366
  84. package/src/components/CnStatsBlock/index.js +1 -1
  85. package/src/components/CnStatusBadge/CnStatusBadge.vue +77 -77
  86. package/src/components/CnStatusBadge/index.js +1 -1
  87. package/src/components/CnTabbedFormDialog/CnTabbedFormDialog.vue +540 -0
  88. package/src/components/CnTabbedFormDialog/index.js +1 -0
  89. package/src/components/CnTasksCard/CnTasksCard.vue +373 -0
  90. package/src/components/CnTasksCard/index.js +1 -0
  91. package/src/components/CnTileWidget/CnTileWidget.vue +159 -0
  92. package/src/components/CnTileWidget/index.js +1 -0
  93. package/src/components/CnTimelineStages/CnTimelineStages.vue +292 -0
  94. package/src/components/CnTimelineStages/index.js +1 -0
  95. package/src/components/CnUserActionMenu/CnUserActionMenu.vue +435 -0
  96. package/src/components/CnUserActionMenu/index.js +1 -0
  97. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +312 -312
  98. package/src/components/CnVersionInfoCard/index.js +1 -1
  99. package/src/components/CnWidgetRenderer/CnWidgetRenderer.vue +180 -0
  100. package/src/components/CnWidgetRenderer/index.js +1 -0
  101. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +211 -0
  102. package/src/components/CnWidgetWrapper/index.js +1 -0
  103. package/src/components/index.js +43 -29
  104. package/src/composables/index.js +4 -3
  105. package/src/composables/useDashboardView.js +240 -0
  106. package/src/composables/useDetailView.js +289 -132
  107. package/src/composables/useListView.js +363 -153
  108. package/src/composables/useSubResource.js +142 -142
  109. package/src/constants/metadata.js +30 -30
  110. package/src/css/CnSchemaFormDialog.css +546 -0
  111. package/src/css/__sample_nextcloud_tokens.css +110 -0
  112. package/src/css/actions-bar.css +48 -48
  113. package/src/css/badge.css +51 -51
  114. package/src/css/card.css +128 -128
  115. package/src/css/dashboard.css +70 -0
  116. package/src/css/detail-page.css +168 -0
  117. package/src/css/detail.css +68 -68
  118. package/src/css/index-page.css +44 -32
  119. package/src/css/index-sidebar.css +193 -187
  120. package/src/css/index.css +16 -12
  121. package/src/css/layout.css +90 -90
  122. package/src/css/page-header.css +33 -33
  123. package/src/css/pagination.css +72 -72
  124. package/src/css/table.css +142 -142
  125. package/src/css/timeline-stages.css +218 -0
  126. package/src/css/utilities.css +46 -46
  127. package/src/index.js +72 -53
  128. package/src/store/createSubResourcePlugin.js +135 -135
  129. package/src/store/index.js +3 -3
  130. package/src/store/plugins/auditTrails.js +17 -17
  131. package/src/store/plugins/files.js +250 -186
  132. package/src/store/plugins/index.js +7 -5
  133. package/src/store/plugins/lifecycle.js +180 -180
  134. package/src/store/plugins/relations.js +68 -68
  135. package/src/store/plugins/search.js +372 -0
  136. package/src/store/plugins/selection.js +104 -0
  137. package/src/store/useObjectStore.js +829 -686
  138. package/src/types/auditTrail.d.ts +32 -32
  139. package/src/types/file.d.ts +23 -23
  140. package/src/types/index.d.ts +35 -35
  141. package/src/types/notification.d.ts +36 -36
  142. package/src/types/object.d.ts +40 -40
  143. package/src/types/organisation.d.ts +41 -41
  144. package/src/types/register.d.ts +25 -25
  145. package/src/types/schema.d.ts +39 -39
  146. package/src/types/shared.d.ts +79 -79
  147. package/src/types/source.d.ts +14 -14
  148. package/src/types/task.d.ts +31 -31
  149. package/src/utils/errors.js +96 -96
  150. package/src/utils/headers.js +68 -50
  151. package/src/utils/id.js +13 -0
  152. package/src/utils/index.js +3 -3
  153. package/src/utils/schema.js +422 -419
@@ -1,180 +1,180 @@
1
- import { buildHeaders } from '../../utils/headers.js'
2
- import { parseResponseError, networkError } from '../../utils/errors.js'
3
-
4
- /**
5
- * Lifecycle plugin for the object store.
6
- *
7
- * Adds object lifecycle actions: lock, unlock, publish, depublish, revert, merge.
8
- * These operate on the object itself (not sub-resources) but share the same
9
- * URL pattern: POST /{register}/{schema}/{objectId}/{action}
10
- *
11
- * State: lifecycleLoading, lifecycleError
12
- * Actions: lockObject, unlockObject, publishObject, depublishObject, revertObject, mergeObjects
13
- *
14
- * @return {Function} Plugin factory
15
- *
16
- * @example
17
- * const useStore = createObjectStore('object', {
18
- * plugins: [lifecyclePlugin()],
19
- * })
20
- * const store = useStore()
21
- * await store.lockObject('case', caseId, { process: 'review', duration: 3600 })
22
- * await store.publishObject('case', caseId, { date: '2025-01-01' })
23
- */
24
- export function lifecyclePlugin() {
25
- return {
26
- name: 'Lifecycle',
27
-
28
- state: () => ({
29
- lifecycleLoading: false,
30
- lifecycleError: null,
31
- }),
32
-
33
- getters: {
34
- isLifecycleLoading: (state) => state.lifecycleLoading,
35
- getLifecycleError: (state) => state.lifecycleError,
36
- },
37
-
38
- actions: {
39
- /**
40
- * Perform a lifecycle action on an object.
41
- *
42
- * @param {string} type The registered object type slug
43
- * @param {string} objectId The object ID
44
- * @param {string} action The lifecycle action endpoint (e.g. 'lock', 'publish')
45
- * @param {object} [body=null] Optional request body
46
- * @return {Promise<object|null>} Response data or null on error
47
- */
48
- async _lifecycleAction(type, objectId, action, body = null) {
49
- this.lifecycleLoading = true
50
- this.lifecycleError = null
51
-
52
- try {
53
- const url = this._buildUrl(type, objectId) + '/' + action
54
- const options = {
55
- method: 'POST',
56
- headers: buildHeaders(),
57
- }
58
- if (body) {
59
- options.body = JSON.stringify(body)
60
- }
61
-
62
- const response = await fetch(url, options)
63
-
64
- if (!response.ok) {
65
- this.lifecycleError = await parseResponseError(response, action)
66
- console.error(`Error performing ${action} on ${type}/${objectId}:`, this.lifecycleError)
67
- return null
68
- }
69
-
70
- const data = await response.json()
71
-
72
- if (this.objects[type] && data.id) {
73
- this.objects[type][data.id] = data
74
- }
75
-
76
- return data
77
- } catch (error) {
78
- this.lifecycleError = error.name === 'TypeError'
79
- ? networkError(error)
80
- : { status: null, message: error.message, details: null, isValidation: false, fields: null, toString() { return this.message } }
81
- console.error(`Error performing ${action} on ${type}/${objectId}:`, error)
82
- return null
83
- } finally {
84
- this.lifecycleLoading = false
85
- }
86
- },
87
-
88
- /**
89
- * Lock an object to prevent concurrent edits.
90
- *
91
- * @param {string} type The registered object type slug
92
- * @param {string} objectId The object ID
93
- * @param {object} options Lock options
94
- * @param {string} [options.process] Lock reason/process name
95
- * @param {number} [options.duration] Lock duration in seconds
96
- * @return {Promise<object|null>} Updated object or null on error
97
- */
98
- async lockObject(type, objectId, options = {}) {
99
- return this._lifecycleAction(type, objectId, 'lock', options)
100
- },
101
-
102
- /**
103
- * Unlock an object.
104
- *
105
- * @param {string} type The registered object type slug
106
- * @param {string} objectId The object ID
107
- * @return {Promise<object|null>} Updated object or null on error
108
- */
109
- async unlockObject(type, objectId) {
110
- return this._lifecycleAction(type, objectId, 'unlock')
111
- },
112
-
113
- /**
114
- * Publish an object (make it publicly accessible).
115
- *
116
- * @param {string} type The registered object type slug
117
- * @param {string} objectId The object ID
118
- * @param {object} [options={}] Publish options
119
- * @param {string} [options.date] Publish date (ISO 8601)
120
- * @return {Promise<object|null>} Updated object or null on error
121
- */
122
- async publishObject(type, objectId, options = {}) {
123
- return this._lifecycleAction(type, objectId, 'publish', options)
124
- },
125
-
126
- /**
127
- * Depublish an object (revoke public access).
128
- *
129
- * @param {string} type The registered object type slug
130
- * @param {string} objectId The object ID
131
- * @param {object} [options={}] Depublish options
132
- * @param {string} [options.date] Depublish date (ISO 8601)
133
- * @return {Promise<object|null>} Updated object or null on error
134
- */
135
- async depublishObject(type, objectId, options = {}) {
136
- return this._lifecycleAction(type, objectId, 'depublish', options)
137
- },
138
-
139
- /**
140
- * Revert an object to a previous version.
141
- *
142
- * @param {string} type The registered object type slug
143
- * @param {string} objectId The object ID
144
- * @param {object} options Revert options
145
- * @param {string} [options.datetime] Target datetime
146
- * @param {string} [options.auditTrailId] Audit trail entry ID to revert to
147
- * @param {number} [options.version] Target version number
148
- * @param {boolean} [options.overwriteVersion] Overwrite current version
149
- * @return {Promise<object|null>} Updated object or null on error
150
- */
151
- async revertObject(type, objectId, options = {}) {
152
- return this._lifecycleAction(type, objectId, 'revert', options)
153
- },
154
-
155
- /**
156
- * Merge two objects together.
157
- *
158
- * @param {string} type The registered object type slug
159
- * @param {string} sourceId The source object ID (will be merged into target)
160
- * @param {object} options Merge options
161
- * @param {string} options.target Target object ID
162
- * @param {string} [options.fileAction] How to handle files ('move'|'copy'|'skip')
163
- * @param {string} [options.relationAction] How to handle relations
164
- * @param {string} [options.referenceAction] How to handle references
165
- * @return {Promise<object|null>} Merge result or null on error
166
- */
167
- async mergeObjects(type, sourceId, options = {}) {
168
- return this._lifecycleAction(type, sourceId, 'merge', options)
169
- },
170
-
171
- /**
172
- * Clear lifecycle state.
173
- */
174
- clearLifecycle() {
175
- this.lifecycleLoading = false
176
- this.lifecycleError = null
177
- },
178
- },
179
- }
180
- }
1
+ import { buildHeaders } from '../../utils/headers.js'
2
+ import { parseResponseError, networkError } from '../../utils/errors.js'
3
+
4
+ /**
5
+ * Lifecycle plugin for the object store.
6
+ *
7
+ * Adds object lifecycle actions: lock, unlock, publish, depublish, revert, merge.
8
+ * These operate on the object itself (not sub-resources) but share the same
9
+ * URL pattern: POST /{register}/{schema}/{objectId}/{action}
10
+ *
11
+ * State: lifecycleLoading, lifecycleError
12
+ * Actions: lockObject, unlockObject, publishObject, depublishObject, revertObject, mergeObjects
13
+ *
14
+ * @return {Function} Plugin factory
15
+ *
16
+ * @example
17
+ * const useStore = createObjectStore('object', {
18
+ * plugins: [lifecyclePlugin()],
19
+ * })
20
+ * const store = useStore()
21
+ * await store.lockObject('case', caseId, { process: 'review', duration: 3600 })
22
+ * await store.publishObject('case', caseId, { date: '2025-01-01' })
23
+ */
24
+ export function lifecyclePlugin() {
25
+ return {
26
+ name: 'Lifecycle',
27
+
28
+ state: () => ({
29
+ lifecycleLoading: false,
30
+ lifecycleError: null,
31
+ }),
32
+
33
+ getters: {
34
+ isLifecycleLoading: (state) => state.lifecycleLoading,
35
+ getLifecycleError: (state) => state.lifecycleError,
36
+ },
37
+
38
+ actions: {
39
+ /**
40
+ * Perform a lifecycle action on an object.
41
+ *
42
+ * @param {string} type The registered object type slug
43
+ * @param {string} objectId The object ID
44
+ * @param {string} action The lifecycle action endpoint (e.g. 'lock', 'publish')
45
+ * @param {object} [body=null] Optional request body
46
+ * @return {Promise<object|null>} Response data or null on error
47
+ */
48
+ async _lifecycleAction(type, objectId, action, body = null) {
49
+ this.lifecycleLoading = true
50
+ this.lifecycleError = null
51
+
52
+ try {
53
+ const url = this._buildUrl(type, objectId) + '/' + action
54
+ const options = {
55
+ method: 'POST',
56
+ headers: buildHeaders(),
57
+ }
58
+ if (body) {
59
+ options.body = JSON.stringify(body)
60
+ }
61
+
62
+ const response = await fetch(url, options)
63
+
64
+ if (!response.ok) {
65
+ this.lifecycleError = await parseResponseError(response, action)
66
+ console.error(`Error performing ${action} on ${type}/${objectId}:`, this.lifecycleError)
67
+ return null
68
+ }
69
+
70
+ const data = await response.json()
71
+
72
+ if (this.objects[type] && data.id) {
73
+ this.objects[type][data.id] = data
74
+ }
75
+
76
+ return data
77
+ } catch (error) {
78
+ this.lifecycleError = error.name === 'TypeError'
79
+ ? networkError(error)
80
+ : { status: null, message: error.message, details: null, isValidation: false, fields: null, toString() { return this.message } }
81
+ console.error(`Error performing ${action} on ${type}/${objectId}:`, error)
82
+ return null
83
+ } finally {
84
+ this.lifecycleLoading = false
85
+ }
86
+ },
87
+
88
+ /**
89
+ * Lock an object to prevent concurrent edits.
90
+ *
91
+ * @param {string} type The registered object type slug
92
+ * @param {string} objectId The object ID
93
+ * @param {object} options Lock options
94
+ * @param {string} [options.process] Lock reason/process name
95
+ * @param {number} [options.duration] Lock duration in seconds
96
+ * @return {Promise<object|null>} Updated object or null on error
97
+ */
98
+ async lockObject(type, objectId, options = {}) {
99
+ return this._lifecycleAction(type, objectId, 'lock', options)
100
+ },
101
+
102
+ /**
103
+ * Unlock an object.
104
+ *
105
+ * @param {string} type The registered object type slug
106
+ * @param {string} objectId The object ID
107
+ * @return {Promise<object|null>} Updated object or null on error
108
+ */
109
+ async unlockObject(type, objectId) {
110
+ return this._lifecycleAction(type, objectId, 'unlock')
111
+ },
112
+
113
+ /**
114
+ * Publish an object (make it publicly accessible).
115
+ *
116
+ * @param {string} type The registered object type slug
117
+ * @param {string} objectId The object ID
118
+ * @param {object} [options={}] Publish options
119
+ * @param {string} [options.date] Publish date (ISO 8601)
120
+ * @return {Promise<object|null>} Updated object or null on error
121
+ */
122
+ async publishObject(type, objectId, options = {}) {
123
+ return this._lifecycleAction(type, objectId, 'publish', options)
124
+ },
125
+
126
+ /**
127
+ * Depublish an object (revoke public access).
128
+ *
129
+ * @param {string} type The registered object type slug
130
+ * @param {string} objectId The object ID
131
+ * @param {object} [options={}] Depublish options
132
+ * @param {string} [options.date] Depublish date (ISO 8601)
133
+ * @return {Promise<object|null>} Updated object or null on error
134
+ */
135
+ async depublishObject(type, objectId, options = {}) {
136
+ return this._lifecycleAction(type, objectId, 'depublish', options)
137
+ },
138
+
139
+ /**
140
+ * Revert an object to a previous version.
141
+ *
142
+ * @param {string} type The registered object type slug
143
+ * @param {string} objectId The object ID
144
+ * @param {object} options Revert options
145
+ * @param {string} [options.datetime] Target datetime
146
+ * @param {string} [options.auditTrailId] Audit trail entry ID to revert to
147
+ * @param {number} [options.version] Target version number
148
+ * @param {boolean} [options.overwriteVersion] Overwrite current version
149
+ * @return {Promise<object|null>} Updated object or null on error
150
+ */
151
+ async revertObject(type, objectId, options = {}) {
152
+ return this._lifecycleAction(type, objectId, 'revert', options)
153
+ },
154
+
155
+ /**
156
+ * Merge two objects together.
157
+ *
158
+ * @param {string} type The registered object type slug
159
+ * @param {string} sourceId The source object ID (will be merged into target)
160
+ * @param {object} options Merge options
161
+ * @param {string} options.target Target object ID
162
+ * @param {string} [options.fileAction] How to handle files ('move'|'copy'|'skip')
163
+ * @param {string} [options.relationAction] How to handle relations
164
+ * @param {string} [options.referenceAction] How to handle references
165
+ * @return {Promise<object|null>} Merge result or null on error
166
+ */
167
+ async mergeObjects(type, sourceId, options = {}) {
168
+ return this._lifecycleAction(type, sourceId, 'merge', options)
169
+ },
170
+
171
+ /**
172
+ * Clear lifecycle state.
173
+ */
174
+ clearLifecycle() {
175
+ this.lifecycleLoading = false
176
+ this.lifecycleError = null
177
+ },
178
+ },
179
+ }
180
+ }
@@ -1,68 +1,68 @@
1
- import { createSubResourcePlugin } from '../createSubResourcePlugin.js'
2
-
3
- /**
4
- * Relations plugin for the object store.
5
- *
6
- * Adds three sub-resources for object relations:
7
- * - contracts: contractual relations between objects
8
- * - uses: outgoing references (this object uses other objects)
9
- * - used: incoming references (other objects use this object)
10
- *
11
- * Each sub-resource gets its own state, loading, error, fetch, and clear.
12
- */
13
-
14
- const contractsBase = createSubResourcePlugin('contracts', 'contracts')
15
- const usesBase = createSubResourcePlugin('uses', 'uses')
16
- const usedBase = createSubResourcePlugin('used', 'used')
17
-
18
- /**
19
- * Combined relations plugin that registers contracts, uses, and used sub-resources.
20
- *
21
- * @param {object} [options={}] Plugin options
22
- * @return {Function} Plugin factory
23
- *
24
- * @example
25
- * const useStore = createObjectStore('object', {
26
- * plugins: [relationsPlugin()],
27
- * })
28
- * const store = useStore()
29
- * await store.fetchContracts('case', caseId)
30
- * await store.fetchUses('case', caseId)
31
- * await store.fetchUsed('case', caseId)
32
- */
33
- export function relationsPlugin(options = {}) {
34
- const contracts = contractsBase(options)
35
- const uses = usesBase(options)
36
- const used = usedBase(options)
37
-
38
- return {
39
- name: 'Relations',
40
-
41
- state: () => ({
42
- ...contracts.state(),
43
- ...uses.state(),
44
- ...used.state(),
45
- }),
46
-
47
- getters: {
48
- ...contracts.getters,
49
- ...uses.getters,
50
- ...used.getters,
51
- },
52
-
53
- actions: {
54
- ...contracts.actions,
55
- ...uses.actions,
56
- ...used.actions,
57
-
58
- /**
59
- * Clear all relation sub-resources.
60
- */
61
- clearRelations() {
62
- this.clearContracts()
63
- this.clearUses()
64
- this.clearUsed()
65
- },
66
- },
67
- }
68
- }
1
+ import { createSubResourcePlugin } from '../createSubResourcePlugin.js'
2
+
3
+ /**
4
+ * Relations plugin for the object store.
5
+ *
6
+ * Adds three sub-resources for object relations:
7
+ * - contracts: contractual relations between objects
8
+ * - uses: outgoing references (this object uses other objects)
9
+ * - used: incoming references (other objects use this object)
10
+ *
11
+ * Each sub-resource gets its own state, loading, error, fetch, and clear.
12
+ */
13
+
14
+ const contractsBase = createSubResourcePlugin('contracts', 'contracts')
15
+ const usesBase = createSubResourcePlugin('uses', 'uses')
16
+ const usedBase = createSubResourcePlugin('used', 'used')
17
+
18
+ /**
19
+ * Combined relations plugin that registers contracts, uses, and used sub-resources.
20
+ *
21
+ * @param {object} [options={}] Plugin options
22
+ * @return {Function} Plugin factory
23
+ *
24
+ * @example
25
+ * const useStore = createObjectStore('object', {
26
+ * plugins: [relationsPlugin()],
27
+ * })
28
+ * const store = useStore()
29
+ * await store.fetchContracts('case', caseId)
30
+ * await store.fetchUses('case', caseId)
31
+ * await store.fetchUsed('case', caseId)
32
+ */
33
+ export function relationsPlugin(options = {}) {
34
+ const contracts = contractsBase(options)
35
+ const uses = usesBase(options)
36
+ const used = usedBase(options)
37
+
38
+ return {
39
+ name: 'Relations',
40
+
41
+ state: () => ({
42
+ ...contracts.state(),
43
+ ...uses.state(),
44
+ ...used.state(),
45
+ }),
46
+
47
+ getters: {
48
+ ...contracts.getters,
49
+ ...uses.getters,
50
+ ...used.getters,
51
+ },
52
+
53
+ actions: {
54
+ ...contracts.actions,
55
+ ...uses.actions,
56
+ ...used.actions,
57
+
58
+ /**
59
+ * Clear all relation sub-resources.
60
+ */
61
+ clearRelations() {
62
+ this.clearContracts()
63
+ this.clearUses()
64
+ this.clearUsed()
65
+ },
66
+ },
67
+ }
68
+ }