@conduction/nextcloud-vue 0.1.0-beta.3 → 0.1.0-beta.5

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 (142) hide show
  1. package/README.md +226 -226
  2. package/dist/nextcloud-vue.cjs +67614 -0
  3. package/dist/nextcloud-vue.cjs.js +58386 -6112
  4. package/dist/nextcloud-vue.cjs.js.map +1 -1
  5. package/dist/nextcloud-vue.cjs.map +1 -0
  6. package/dist/nextcloud-vue.css +1819 -285
  7. package/dist/nextcloud-vue.esm.js +58342 -6088
  8. package/dist/nextcloud-vue.esm.js.map +1 -1
  9. package/package.json +82 -62
  10. package/src/components/CnActionsBar/CnActionsBar.vue +17 -7
  11. package/src/components/CnActionsBar/index.js +1 -1
  12. package/src/components/CnAdvancedFormDialog/CnAdvancedFormDialog.vue +579 -0
  13. package/src/components/CnAdvancedFormDialog/CnDataTab.vue +217 -0
  14. package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +121 -0
  15. package/src/components/CnAdvancedFormDialog/CnPropertiesTab.vue +418 -0
  16. package/src/components/CnAdvancedFormDialog/CnPropertyValueCell.vue +247 -0
  17. package/src/components/CnAdvancedFormDialog/index.js +1 -0
  18. package/src/components/CnCardGrid/CnCardGrid.vue +1 -1
  19. package/src/components/CnCardGrid/index.js +1 -1
  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/index.js +1 -1
  24. package/src/components/CnCopyDialog/CnCopyDialog.vue +250 -250
  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 +1 -1
  30. package/src/components/CnDataTable/index.js +1 -1
  31. package/src/components/CnDeleteDialog/CnDeleteDialog.vue +170 -170
  32. package/src/components/CnDetailCard/CnDetailCard.vue +214 -0
  33. package/src/components/CnDetailCard/index.js +1 -0
  34. package/src/components/CnDetailPage/CnDetailPage.vue +285 -0
  35. package/src/components/CnDetailPage/index.js +1 -0
  36. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +9 -1
  37. package/src/components/CnFacetSidebar/index.js +1 -1
  38. package/src/components/CnFilterBar/index.js +1 -1
  39. package/src/components/CnFormDialog/CnFormDialog.vue +302 -11
  40. package/src/components/CnIcon/index.js +1 -1
  41. package/src/components/CnIndexPage/CnIndexPage.vue +71 -3
  42. package/src/components/CnIndexPage/index.js +1 -1
  43. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +121 -102
  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/index.js +1 -1
  48. package/src/components/CnMassActionBar/index.js +1 -1
  49. package/src/components/CnMassCopyDialog/index.js +1 -1
  50. package/src/components/CnMassDeleteDialog/index.js +1 -1
  51. package/src/components/CnMassExportDialog/index.js +1 -1
  52. package/src/components/CnMassImportDialog/index.js +1 -1
  53. package/src/components/CnNoteCard/CnNoteCard.vue +149 -0
  54. package/src/components/CnNoteCard/index.js +1 -0
  55. package/src/components/CnNotesCard/CnNotesCard.vue +413 -0
  56. package/src/components/CnNotesCard/index.js +1 -0
  57. package/src/components/CnObjectCard/CnObjectCard.vue +1 -1
  58. package/src/components/CnObjectCard/index.js +1 -1
  59. package/src/components/CnObjectSidebar/CnObjectSidebar.vue +876 -0
  60. package/src/components/CnObjectSidebar/index.js +1 -0
  61. package/src/components/CnPageHeader/index.js +1 -1
  62. package/src/components/CnPagination/index.js +1 -1
  63. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +792 -792
  64. package/src/components/CnRowActions/CnRowActions.vue +25 -3
  65. package/src/components/CnRowActions/index.js +1 -1
  66. package/src/components/CnSchemaFormDialog/CnSchemaConfigurationTab.vue +226 -0
  67. package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +787 -0
  68. package/src/components/CnSchemaFormDialog/CnSchemaPropertiesTab.vue +305 -0
  69. package/src/components/CnSchemaFormDialog/CnSchemaPropertyActions.vue +1398 -0
  70. package/src/components/CnSchemaFormDialog/CnSchemaSecurityTab.vue +236 -0
  71. package/src/components/CnSchemaFormDialog/index.js +1 -0
  72. package/src/components/CnSettingsCard/index.js +1 -1
  73. package/src/components/CnSettingsSection/index.js +1 -1
  74. package/src/components/CnStatsBlock/CnStatsBlock.vue +62 -8
  75. package/src/components/CnStatsBlock/index.js +1 -1
  76. package/src/components/CnStatusBadge/index.js +1 -1
  77. package/src/components/CnTabbedFormDialog/CnTabbedFormDialog.vue +540 -0
  78. package/src/components/CnTabbedFormDialog/index.js +1 -0
  79. package/src/components/CnTasksCard/CnTasksCard.vue +373 -0
  80. package/src/components/CnTasksCard/index.js +1 -0
  81. package/src/components/CnTileWidget/CnTileWidget.vue +159 -0
  82. package/src/components/CnTileWidget/index.js +1 -0
  83. package/src/components/CnTimelineStages/CnTimelineStages.vue +292 -0
  84. package/src/components/CnTimelineStages/index.js +1 -0
  85. package/src/components/CnUserActionMenu/CnUserActionMenu.vue +435 -0
  86. package/src/components/CnUserActionMenu/index.js +1 -0
  87. package/src/components/CnVersionInfoCard/index.js +1 -1
  88. package/src/components/CnWidgetRenderer/CnWidgetRenderer.vue +180 -0
  89. package/src/components/CnWidgetRenderer/index.js +1 -0
  90. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +211 -0
  91. package/src/components/CnWidgetWrapper/index.js +1 -0
  92. package/src/components/index.js +43 -29
  93. package/src/composables/index.js +4 -3
  94. package/src/composables/useDashboardView.js +240 -0
  95. package/src/composables/useDetailView.js +289 -132
  96. package/src/composables/useListView.js +363 -362
  97. package/src/composables/useSubResource.js +142 -142
  98. package/src/constants/metadata.js +30 -30
  99. package/src/css/CnSchemaFormDialog.css +546 -0
  100. package/src/css/__sample_nextcloud_tokens.css +110 -0
  101. package/src/css/actions-bar.css +48 -48
  102. package/src/css/badge.css +51 -51
  103. package/src/css/card.css +128 -128
  104. package/src/css/dashboard.css +70 -0
  105. package/src/css/detail-page.css +168 -0
  106. package/src/css/detail.css +68 -68
  107. package/src/css/index-page.css +44 -32
  108. package/src/css/index-sidebar.css +193 -187
  109. package/src/css/index.css +16 -12
  110. package/src/css/layout.css +90 -90
  111. package/src/css/page-header.css +33 -33
  112. package/src/css/pagination.css +72 -72
  113. package/src/css/table.css +142 -142
  114. package/src/css/timeline-stages.css +218 -0
  115. package/src/css/utilities.css +46 -46
  116. package/src/index.js +72 -53
  117. package/src/store/createSubResourcePlugin.js +135 -135
  118. package/src/store/index.js +3 -3
  119. package/src/store/plugins/auditTrails.js +17 -17
  120. package/src/store/plugins/files.js +250 -186
  121. package/src/store/plugins/index.js +7 -5
  122. package/src/store/plugins/lifecycle.js +180 -180
  123. package/src/store/plugins/relations.js +68 -68
  124. package/src/store/plugins/search.js +372 -0
  125. package/src/store/plugins/selection.js +104 -0
  126. package/src/store/useObjectStore.js +829 -686
  127. package/src/types/auditTrail.d.ts +32 -32
  128. package/src/types/file.d.ts +23 -23
  129. package/src/types/index.d.ts +35 -35
  130. package/src/types/notification.d.ts +36 -36
  131. package/src/types/object.d.ts +40 -40
  132. package/src/types/organisation.d.ts +41 -41
  133. package/src/types/register.d.ts +25 -25
  134. package/src/types/schema.d.ts +39 -39
  135. package/src/types/shared.d.ts +79 -79
  136. package/src/types/source.d.ts +14 -14
  137. package/src/types/task.d.ts +31 -31
  138. package/src/utils/errors.js +96 -96
  139. package/src/utils/headers.js +68 -50
  140. package/src/utils/id.js +13 -0
  141. package/src/utils/index.js +3 -3
  142. 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
+ }