@conduction/nextcloud-vue 0.1.0-beta.1 → 0.1.0-beta.10
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/README.md +226 -0
- package/css/index.css +5 -0
- package/dist/nextcloud-vue.cjs +67614 -0
- package/dist/nextcloud-vue.cjs.js +76311 -5905
- package/dist/nextcloud-vue.cjs.js.map +1 -1
- package/dist/nextcloud-vue.cjs.map +1 -0
- package/dist/nextcloud-vue.css +3279 -203
- package/dist/nextcloud-vue.esm.js +76240 -5882
- package/dist/nextcloud-vue.esm.js.map +1 -1
- package/package.json +89 -63
- package/src/components/CnActionsBar/CnActionsBar.vue +254 -0
- package/src/components/CnActionsBar/index.js +1 -0
- package/src/components/CnAdvancedFormDialog/CnAdvancedFormDialog.vue +569 -0
- package/src/components/CnAdvancedFormDialog/CnDataTab.vue +217 -0
- package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +121 -0
- package/src/components/CnAdvancedFormDialog/CnPropertiesTab.vue +422 -0
- package/src/components/CnAdvancedFormDialog/CnPropertyValueCell.vue +247 -0
- package/src/components/CnAdvancedFormDialog/index.js +1 -0
- package/src/components/CnCard/CnCard.vue +415 -0
- package/src/components/CnCard/index.js +1 -0
- package/src/components/CnCardGrid/CnCardGrid.vue +23 -20
- package/src/components/CnCardGrid/index.js +1 -1
- package/src/components/CnCellRenderer/index.js +1 -1
- package/src/components/CnChartWidget/CnChartWidget.vue +318 -0
- package/src/components/CnChartWidget/index.js +1 -0
- package/src/components/CnConfigurationCard/index.js +1 -1
- package/src/components/CnContextMenu/CnContextMenu.vue +142 -0
- package/src/components/CnContextMenu/index.js +1 -0
- package/src/components/CnCopyDialog/CnCopyDialog.vue +257 -0
- package/src/components/CnCopyDialog/index.js +1 -0
- package/src/components/CnDashboardGrid/CnDashboardGrid.vue +229 -0
- package/src/components/CnDashboardGrid/index.js +1 -0
- package/src/components/CnDashboardPage/CnDashboardPage.vue +396 -0
- package/src/components/CnDashboardPage/index.js +1 -0
- package/src/components/CnDataTable/CnDataTable.vue +24 -16
- package/src/components/CnDataTable/index.js +1 -1
- package/src/components/CnDeleteDialog/CnDeleteDialog.vue +177 -0
- package/src/components/CnDeleteDialog/index.js +1 -0
- package/src/components/CnDetailCard/CnDetailCard.vue +225 -0
- package/src/components/CnDetailCard/index.js +1 -0
- package/src/components/CnDetailGrid/CnDetailGrid.vue +254 -0
- package/src/components/CnDetailGrid/index.js +1 -0
- package/src/components/CnDetailPage/CnDetailPage.vue +431 -0
- package/src/components/CnDetailPage/index.js +1 -0
- package/src/components/CnFacetSidebar/CnFacetSidebar.vue +12 -2
- package/src/components/CnFacetSidebar/index.js +1 -1
- package/src/components/CnFilterBar/index.js +1 -1
- package/src/components/CnFormDialog/CnFormDialog.vue +934 -0
- package/src/components/CnFormDialog/index.js +1 -0
- package/src/components/CnIcon/CnIcon.vue +89 -0
- package/src/components/CnIcon/index.js +1 -0
- package/src/components/CnIndexPage/CnIndexPage.vue +589 -291
- package/src/components/CnIndexPage/index.js +1 -1
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +535 -0
- package/src/components/CnIndexSidebar/index.js +1 -0
- package/src/components/CnInfoWidget/CnInfoWidget.vue +219 -0
- package/src/components/CnInfoWidget/index.js +1 -0
- package/src/components/CnItemCard/CnItemCard.vue +134 -0
- package/src/components/CnItemCard/index.js +1 -0
- package/src/components/CnJsonViewer/CnJsonViewer.vue +283 -0
- package/src/components/CnJsonViewer/index.js +1 -0
- package/src/components/CnKpiGrid/CnKpiGrid.vue +5 -1
- package/src/components/CnKpiGrid/index.js +1 -1
- package/src/components/CnMassActionBar/CnMassActionBar.vue +6 -5
- package/src/components/CnMassActionBar/index.js +1 -1
- package/src/components/CnMassCopyDialog/CnMassCopyDialog.vue +16 -9
- package/src/components/CnMassCopyDialog/index.js +1 -1
- package/src/components/CnMassDeleteDialog/CnMassDeleteDialog.vue +16 -9
- package/src/components/CnMassDeleteDialog/index.js +1 -1
- package/src/components/CnMassExportDialog/CnMassExportDialog.vue +8 -7
- package/src/components/CnMassExportDialog/index.js +1 -1
- package/src/components/CnMassImportDialog/CnMassImportDialog.vue +20 -17
- package/src/components/CnMassImportDialog/index.js +1 -1
- package/src/components/CnNoteCard/CnNoteCard.vue +149 -0
- package/src/components/CnNoteCard/index.js +1 -0
- package/src/components/CnNotesCard/CnNotesCard.vue +415 -0
- package/src/components/CnNotesCard/index.js +1 -0
- package/src/components/CnObjectCard/CnObjectCard.vue +3 -1
- package/src/components/CnObjectCard/index.js +1 -1
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +853 -0
- package/src/components/CnObjectDataWidget/index.js +1 -0
- package/src/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue +288 -0
- package/src/components/CnObjectMetadataWidget/index.js +1 -0
- package/src/components/CnObjectSidebar/CnAuditTrailTab.vue +368 -0
- package/src/components/CnObjectSidebar/CnFilesTab.vue +286 -0
- package/src/components/CnObjectSidebar/CnNotesTab.vue +249 -0
- package/src/components/CnObjectSidebar/CnObjectSidebar.vue +254 -0
- package/src/components/CnObjectSidebar/CnTagsTab.vue +258 -0
- package/src/components/CnObjectSidebar/CnTasksTab.vue +482 -0
- package/src/components/CnObjectSidebar/index.js +6 -0
- package/src/components/CnPageHeader/CnPageHeader.vue +61 -0
- package/src/components/CnPageHeader/index.js +1 -0
- package/src/components/CnPagination/CnPagination.vue +7 -6
- package/src/components/CnPagination/index.js +1 -1
- package/src/components/CnProgressBar/CnProgressBar.vue +262 -0
- package/src/components/CnProgressBar/index.js +1 -0
- package/src/components/CnRegisterMapping/CnRegisterMapping.vue +792 -0
- package/src/components/CnRegisterMapping/index.js +1 -0
- package/src/components/CnRowActions/CnRowActions.vue +25 -3
- package/src/components/CnRowActions/index.js +1 -1
- package/src/components/CnSchemaFormDialog/CnSchemaConfigurationTab.vue +226 -0
- package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +787 -0
- package/src/components/CnSchemaFormDialog/CnSchemaPropertiesTab.vue +305 -0
- package/src/components/CnSchemaFormDialog/CnSchemaPropertyActions.vue +1398 -0
- package/src/components/CnSchemaFormDialog/CnSchemaSecurityTab.vue +236 -0
- package/src/components/CnSchemaFormDialog/index.js +1 -0
- package/src/components/CnSettingsCard/index.js +1 -1
- package/src/components/CnSettingsSection/index.js +1 -1
- package/src/components/CnStatsBlock/CnStatsBlock.vue +89 -19
- package/src/components/CnStatsBlock/index.js +1 -1
- package/src/components/CnStatsPanel/CnStatsPanel.vue +320 -0
- package/src/components/CnStatsPanel/index.js +1 -0
- package/src/components/CnStatusBadge/CnStatusBadge.vue +15 -2
- package/src/components/CnStatusBadge/index.js +1 -1
- package/src/components/CnTabbedFormDialog/CnTabbedFormDialog.vue +544 -0
- package/src/components/CnTabbedFormDialog/index.js +1 -0
- package/src/components/CnTableWidget/CnTableWidget.vue +332 -0
- package/src/components/CnTableWidget/index.js +1 -0
- package/src/components/CnTasksCard/CnTasksCard.vue +373 -0
- package/src/components/CnTasksCard/index.js +1 -0
- package/src/components/CnTileWidget/CnTileWidget.vue +159 -0
- package/src/components/CnTileWidget/index.js +1 -0
- package/src/components/CnTimelineStages/CnTimelineStages.vue +292 -0
- package/src/components/CnTimelineStages/index.js +1 -0
- package/src/components/CnUserActionMenu/CnUserActionMenu.vue +435 -0
- package/src/components/CnUserActionMenu/index.js +1 -0
- package/src/components/CnVersionInfoCard/index.js +1 -1
- package/src/components/CnWidgetRenderer/CnWidgetRenderer.vue +180 -0
- package/src/components/CnWidgetRenderer/index.js +1 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +246 -0
- package/src/components/CnWidgetWrapper/index.js +1 -0
- package/src/components/index.js +57 -25
- package/src/composables/index.js +5 -3
- package/src/composables/useContextMenu.js +126 -0
- package/src/composables/useDashboardView.js +286 -0
- package/src/composables/useDetailView.js +290 -132
- package/src/composables/useListView.js +364 -153
- package/src/composables/useSubResource.js +142 -142
- package/src/constants/metadata.js +30 -0
- package/src/css/CnSchemaFormDialog.css +546 -0
- package/src/css/__sample_nextcloud_tokens.css +110 -0
- package/src/css/actions-bar.css +54 -0
- package/src/css/badge.css +83 -51
- package/src/css/card.css +129 -128
- package/src/css/context-menu.css +20 -0
- package/src/css/dashboard.css +70 -0
- package/src/css/detail-page.css +235 -0
- package/src/css/detail.css +68 -68
- package/src/css/index-page.css +44 -0
- package/src/css/index-sidebar.css +193 -0
- package/src/css/index.css +17 -8
- package/src/css/layout.css +90 -90
- package/src/css/page-header.css +35 -0
- package/src/css/pagination.css +72 -72
- package/src/css/table.css +142 -143
- package/src/css/timeline-stages.css +220 -0
- package/src/css/utilities.css +46 -46
- package/src/index.js +91 -50
- package/src/mixins/gridLayout.js +118 -0
- package/src/store/createCrudStore.js +360 -0
- package/src/store/createSubResourcePlugin.js +125 -135
- package/src/store/index.js +4 -3
- package/src/store/plugins/auditTrails.js +357 -17
- package/src/store/plugins/files.js +250 -186
- package/src/store/plugins/index.js +7 -4
- package/src/store/plugins/lifecycle.js +180 -180
- package/src/store/plugins/registerMapping.js +195 -0
- package/src/store/plugins/relations.js +68 -68
- package/src/store/plugins/search.js +385 -0
- package/src/store/plugins/selection.js +104 -0
- package/src/store/useObjectStore.js +823 -625
- package/src/types/auditTrail.d.ts +32 -32
- package/src/types/file.d.ts +23 -23
- package/src/types/index.d.ts +35 -35
- package/src/types/notification.d.ts +36 -36
- package/src/types/object.d.ts +40 -40
- package/src/types/organisation.d.ts +41 -41
- package/src/types/register.d.ts +25 -25
- package/src/types/schema.d.ts +39 -39
- package/src/types/shared.d.ts +79 -79
- package/src/types/source.d.ts +14 -14
- package/src/types/task.d.ts +31 -31
- package/src/utils/errors.js +96 -96
- package/src/utils/getTheme.js +9 -0
- package/src/utils/headers.js +80 -44
- package/src/utils/id.js +13 -0
- package/src/utils/index.js +4 -3
- package/src/utils/schema.js +422 -287
- package/src/utils/widgetVisibility.js +162 -0
- package/src/components/CnDetailViewLayout/CnDetailViewLayout.vue +0 -88
- package/src/components/CnDetailViewLayout/index.js +0 -1
- package/src/components/CnEmptyState/CnEmptyState.vue +0 -78
- package/src/components/CnEmptyState/index.js +0 -1
- package/src/components/CnListViewLayout/CnListViewLayout.vue +0 -80
- package/src/components/CnListViewLayout/index.js +0 -1
- package/src/components/CnViewModeToggle/CnViewModeToggle.vue +0 -77
- package/src/components/CnViewModeToggle/index.js +0 -1
|
@@ -1,17 +1,357 @@
|
|
|
1
|
-
import { createSubResourcePlugin } from '../createSubResourcePlugin.js'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { createSubResourcePlugin, emptyPaginated } from '../createSubResourcePlugin.js'
|
|
2
|
+
import { buildHeaders, buildQueryString } from '../../utils/headers.js'
|
|
3
|
+
import { parseResponseError, networkError, genericError } from '../../utils/errors.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Audit trails plugin for the object store.
|
|
7
|
+
*
|
|
8
|
+
* Extends the generic sub-resource plugin with global audit trail operations:
|
|
9
|
+
* fetching all audit trails (not scoped to one object), statistics, and delete.
|
|
10
|
+
*
|
|
11
|
+
* **Object-scoped** (from createSubResourcePlugin):
|
|
12
|
+
* State: auditTrails, auditTrailsLoading, auditTrailsError
|
|
13
|
+
* Actions: fetchAuditTrails(type, objectId, params), clearAuditTrails()
|
|
14
|
+
* Getters: getAuditTrails, isAuditTrailsLoading, getAuditTrailsError
|
|
15
|
+
*
|
|
16
|
+
* **Global** (added by this plugin):
|
|
17
|
+
* State: globalAuditTrails, globalAuditTrailsLoading, globalAuditTrailsError,
|
|
18
|
+
* auditTrailStatistics, auditTrailStatisticsLoading, auditTrailStatisticsError,
|
|
19
|
+
* auditTrailItem, auditTrailFilters, auditTrailSearch
|
|
20
|
+
* Actions: fetchGlobalAuditTrails(params), fetchAuditTrailStatistics(),
|
|
21
|
+
* deleteGlobalAuditTrail(id), deleteMultipleGlobalAuditTrails(ids),
|
|
22
|
+
* refreshGlobalAuditTrails(), setAuditTrailItem(item),
|
|
23
|
+
* setAuditTrailFilters(filters), setAuditTrailSearch(search),
|
|
24
|
+
* clearAuditTrailFilters(), clearGlobalAuditTrails()
|
|
25
|
+
* Getters: getGlobalAuditTrails, isGlobalAuditTrailsLoading, getGlobalAuditTrailsError,
|
|
26
|
+
* getAuditTrailStatistics, isAuditTrailStatisticsLoading, getAuditTrailStatisticsError,
|
|
27
|
+
* getAuditTrailItem, getAuditTrailFilters, getAuditTrailSearch
|
|
28
|
+
*
|
|
29
|
+
* @param {object} [options={}] Plugin options
|
|
30
|
+
* @param {number} [options.limit=20] Default page size for object-scoped queries
|
|
31
|
+
* @param {number} [options.globalLimit=50] Default page size for global queries
|
|
32
|
+
* @return {object} Plugin definition
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* const useStore = createObjectStore('object', {
|
|
36
|
+
* plugins: [auditTrailsPlugin()],
|
|
37
|
+
* })
|
|
38
|
+
* const store = useStore()
|
|
39
|
+
*
|
|
40
|
+
* // Object-scoped (unchanged)
|
|
41
|
+
* await store.fetchAuditTrails('case', caseId)
|
|
42
|
+
*
|
|
43
|
+
* // Global
|
|
44
|
+
* await store.fetchGlobalAuditTrails({ _limit: 50, _page: 1 })
|
|
45
|
+
* await store.fetchAuditTrailStatistics()
|
|
46
|
+
* await store.deleteGlobalAuditTrail(id)
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
const GLOBAL_PATH = '/audit-trails'
|
|
50
|
+
|
|
51
|
+
const EMPTY_STATISTICS = {
|
|
52
|
+
total: 0,
|
|
53
|
+
create: 0,
|
|
54
|
+
update: 0,
|
|
55
|
+
delete: 0,
|
|
56
|
+
read: 0,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Build the global audit trails API URL from the store base URL.
|
|
61
|
+
* e.g. /apps/openregister/api/objects -> /apps/openregister/api/audit-trails
|
|
62
|
+
*
|
|
63
|
+
* @param {string} baseUrl Store base URL
|
|
64
|
+
* @return {string} Global audit trails endpoint URL
|
|
65
|
+
*/
|
|
66
|
+
function buildGlobalUrl(baseUrl) {
|
|
67
|
+
return baseUrl.replace(/\/objects\/?$/, '') + GLOBAL_PATH
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function auditTrailsPlugin(options = {}) {
|
|
71
|
+
const base = createSubResourcePlugin('auditTrails', 'audit-trails', options)()
|
|
72
|
+
const globalLimit = options.globalLimit || 50
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
...base,
|
|
76
|
+
|
|
77
|
+
state: () => ({
|
|
78
|
+
...base.state(),
|
|
79
|
+
globalAuditTrails: emptyPaginated(globalLimit),
|
|
80
|
+
globalAuditTrailsLoading: false,
|
|
81
|
+
globalAuditTrailsError: null,
|
|
82
|
+
auditTrailStatistics: { ...EMPTY_STATISTICS },
|
|
83
|
+
auditTrailStatisticsLoading: false,
|
|
84
|
+
auditTrailStatisticsError: null,
|
|
85
|
+
auditTrailItem: null,
|
|
86
|
+
auditTrailFilters: {},
|
|
87
|
+
auditTrailSearch: '',
|
|
88
|
+
}),
|
|
89
|
+
|
|
90
|
+
getters: {
|
|
91
|
+
...base.getters,
|
|
92
|
+
getGlobalAuditTrails: (state) => state.globalAuditTrails,
|
|
93
|
+
isGlobalAuditTrailsLoading: (state) => state.globalAuditTrailsLoading || false,
|
|
94
|
+
getGlobalAuditTrailsError: (state) => state.globalAuditTrailsError || null,
|
|
95
|
+
getAuditTrailStatistics: (state) => state.auditTrailStatistics,
|
|
96
|
+
isAuditTrailStatisticsLoading: (state) => state.auditTrailStatisticsLoading || false,
|
|
97
|
+
getAuditTrailStatisticsError: (state) => state.auditTrailStatisticsError || null,
|
|
98
|
+
getAuditTrailItem: (state) => state.auditTrailItem || null,
|
|
99
|
+
getAuditTrailFilters: (state) => state.auditTrailFilters || {},
|
|
100
|
+
getAuditTrailSearch: (state) => state.auditTrailSearch || '',
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
actions: {
|
|
104
|
+
...base.actions,
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Fetch audit trails from the global endpoint (not scoped to an object).
|
|
108
|
+
*
|
|
109
|
+
* @param {object} [params] Query parameters (_limit, _page, _search, _order, filters)
|
|
110
|
+
* @return {Promise<Array>} The fetched results
|
|
111
|
+
*/
|
|
112
|
+
async fetchGlobalAuditTrails(params = {}) {
|
|
113
|
+
this.globalAuditTrailsLoading = true
|
|
114
|
+
this.globalAuditTrailsError = null
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
const url = buildGlobalUrl(this._options.baseUrl) + buildQueryString(params)
|
|
118
|
+
|
|
119
|
+
const response = await fetch(url, {
|
|
120
|
+
method: 'GET',
|
|
121
|
+
headers: buildHeaders(),
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
this.globalAuditTrailsError = await parseResponseError(response, 'audit trails')
|
|
126
|
+
console.error('Error fetching global audit trails:', this.globalAuditTrailsError)
|
|
127
|
+
return []
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const data = await response.json()
|
|
131
|
+
const results = data.results || data
|
|
132
|
+
|
|
133
|
+
this.globalAuditTrails = {
|
|
134
|
+
results,
|
|
135
|
+
total: data.total || results.length,
|
|
136
|
+
page: data.page || 1,
|
|
137
|
+
pages: data.pages || 0,
|
|
138
|
+
limit: params._limit || globalLimit,
|
|
139
|
+
offset: data.offset || 0,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return results
|
|
143
|
+
} catch (error) {
|
|
144
|
+
this.globalAuditTrailsError = error.name === 'TypeError'
|
|
145
|
+
? networkError(error)
|
|
146
|
+
: genericError(error)
|
|
147
|
+
console.error('Error fetching global audit trails:', error)
|
|
148
|
+
return []
|
|
149
|
+
} finally {
|
|
150
|
+
this.globalAuditTrailsLoading = false
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Fetch audit trail statistics from the global statistics endpoint.
|
|
156
|
+
*
|
|
157
|
+
* @return {Promise<object>} The statistics object
|
|
158
|
+
*/
|
|
159
|
+
async fetchAuditTrailStatistics() {
|
|
160
|
+
this.auditTrailStatisticsLoading = true
|
|
161
|
+
this.auditTrailStatisticsError = null
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
const url = buildGlobalUrl(this._options.baseUrl) + '/statistics'
|
|
165
|
+
|
|
166
|
+
const response = await fetch(url, {
|
|
167
|
+
method: 'GET',
|
|
168
|
+
headers: buildHeaders(),
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
if (!response.ok) {
|
|
172
|
+
this.auditTrailStatisticsError = await parseResponseError(response, 'audit trail statistics')
|
|
173
|
+
console.error('Error fetching audit trail statistics:', this.auditTrailStatisticsError)
|
|
174
|
+
return { ...EMPTY_STATISTICS }
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const data = await response.json()
|
|
178
|
+
this.auditTrailStatistics = { ...EMPTY_STATISTICS, ...data }
|
|
179
|
+
return this.auditTrailStatistics
|
|
180
|
+
} catch (error) {
|
|
181
|
+
this.auditTrailStatisticsError = error.name === 'TypeError'
|
|
182
|
+
? networkError(error)
|
|
183
|
+
: genericError(error)
|
|
184
|
+
console.error('Error fetching audit trail statistics:', error)
|
|
185
|
+
return { ...EMPTY_STATISTICS }
|
|
186
|
+
} finally {
|
|
187
|
+
this.auditTrailStatisticsLoading = false
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Delete a single audit trail by ID.
|
|
193
|
+
*
|
|
194
|
+
* @param {string} id The audit trail ID
|
|
195
|
+
* @return {Promise<boolean>} True if deleted successfully
|
|
196
|
+
*/
|
|
197
|
+
async deleteGlobalAuditTrail(id) {
|
|
198
|
+
this.globalAuditTrailsLoading = true
|
|
199
|
+
this.globalAuditTrailsError = null
|
|
200
|
+
|
|
201
|
+
try {
|
|
202
|
+
const url = buildGlobalUrl(this._options.baseUrl) + `/${id}`
|
|
203
|
+
|
|
204
|
+
const response = await fetch(url, {
|
|
205
|
+
method: 'DELETE',
|
|
206
|
+
headers: buildHeaders(),
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
if (!response.ok) {
|
|
210
|
+
this.globalAuditTrailsError = await parseResponseError(response, 'audit trail')
|
|
211
|
+
console.error(`Error deleting audit trail ${id}:`, this.globalAuditTrailsError)
|
|
212
|
+
return false
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
this.globalAuditTrails = {
|
|
216
|
+
...this.globalAuditTrails,
|
|
217
|
+
results: this.globalAuditTrails.results.filter((item) => item.id !== id),
|
|
218
|
+
total: Math.max(0, this.globalAuditTrails.total - 1),
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return true
|
|
222
|
+
} catch (error) {
|
|
223
|
+
this.globalAuditTrailsError = error.name === 'TypeError'
|
|
224
|
+
? networkError(error)
|
|
225
|
+
: genericError(error)
|
|
226
|
+
console.error(`Error deleting audit trail ${id}:`, error)
|
|
227
|
+
return false
|
|
228
|
+
} finally {
|
|
229
|
+
this.globalAuditTrailsLoading = false
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Delete multiple audit trails by IDs.
|
|
235
|
+
*
|
|
236
|
+
* @param {string[]} ids Array of audit trail IDs to delete
|
|
237
|
+
* @return {Promise<boolean>} True if deleted successfully
|
|
238
|
+
*/
|
|
239
|
+
async deleteMultipleGlobalAuditTrails(ids) {
|
|
240
|
+
if (!ids?.length) return true
|
|
241
|
+
|
|
242
|
+
this.globalAuditTrailsLoading = true
|
|
243
|
+
this.globalAuditTrailsError = null
|
|
244
|
+
|
|
245
|
+
try {
|
|
246
|
+
const url = buildGlobalUrl(this._options.baseUrl)
|
|
247
|
+
|
|
248
|
+
const response = await fetch(url, {
|
|
249
|
+
method: 'DELETE',
|
|
250
|
+
headers: buildHeaders(),
|
|
251
|
+
body: JSON.stringify({ ids }),
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
if (!response.ok) {
|
|
255
|
+
this.globalAuditTrailsError = await parseResponseError(response, 'audit trails')
|
|
256
|
+
console.error('Error deleting audit trails:', this.globalAuditTrailsError)
|
|
257
|
+
return false
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const idSet = new Set(ids)
|
|
261
|
+
const remaining = this.globalAuditTrails.results.filter((item) => !idSet.has(item.id))
|
|
262
|
+
|
|
263
|
+
this.globalAuditTrails = {
|
|
264
|
+
...this.globalAuditTrails,
|
|
265
|
+
results: remaining,
|
|
266
|
+
total: Math.max(0, this.globalAuditTrails.total - (this.globalAuditTrails.results.length - remaining.length)),
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return true
|
|
270
|
+
} catch (error) {
|
|
271
|
+
this.globalAuditTrailsError = error.name === 'TypeError'
|
|
272
|
+
? networkError(error)
|
|
273
|
+
: genericError(error)
|
|
274
|
+
console.error('Error deleting audit trails:', error)
|
|
275
|
+
return false
|
|
276
|
+
} finally {
|
|
277
|
+
this.globalAuditTrailsLoading = false
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Re-fetch global audit trails with current pagination state.
|
|
283
|
+
*
|
|
284
|
+
* @return {Promise<Array>} The fetched results
|
|
285
|
+
*/
|
|
286
|
+
async refreshGlobalAuditTrails() {
|
|
287
|
+
return this.fetchGlobalAuditTrails({
|
|
288
|
+
_limit: this.globalAuditTrails.limit,
|
|
289
|
+
_page: this.globalAuditTrails.page,
|
|
290
|
+
})
|
|
291
|
+
},
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Set the active audit trail item (for detail views).
|
|
295
|
+
*
|
|
296
|
+
* @param {object|null} item The audit trail item or null to clear
|
|
297
|
+
*/
|
|
298
|
+
setAuditTrailItem(item) {
|
|
299
|
+
this.auditTrailItem = item || null
|
|
300
|
+
},
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Set audit trail filters (merged with existing).
|
|
304
|
+
*
|
|
305
|
+
* @param {object} filters Filter key-value pairs
|
|
306
|
+
*/
|
|
307
|
+
setAuditTrailFilters(filters) {
|
|
308
|
+
this.auditTrailFilters = { ...this.auditTrailFilters, ...filters }
|
|
309
|
+
},
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Set the audit trail search term.
|
|
313
|
+
*
|
|
314
|
+
* @param {string} search The search term
|
|
315
|
+
*/
|
|
316
|
+
setAuditTrailSearch(search) {
|
|
317
|
+
this.auditTrailSearch = search || ''
|
|
318
|
+
},
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Clear all audit trail filters and search.
|
|
322
|
+
*/
|
|
323
|
+
clearAuditTrailFilters() {
|
|
324
|
+
this.auditTrailFilters = {}
|
|
325
|
+
this.auditTrailSearch = ''
|
|
326
|
+
},
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Clear all global audit trail state back to defaults.
|
|
330
|
+
*/
|
|
331
|
+
clearGlobalAuditTrails() {
|
|
332
|
+
this.globalAuditTrails = emptyPaginated(globalLimit)
|
|
333
|
+
this.globalAuditTrailsLoading = false
|
|
334
|
+
this.globalAuditTrailsError = null
|
|
335
|
+
this.auditTrailStatistics = { ...EMPTY_STATISTICS }
|
|
336
|
+
this.auditTrailStatisticsLoading = false
|
|
337
|
+
this.auditTrailStatisticsError = null
|
|
338
|
+
this.auditTrailItem = null
|
|
339
|
+
this.auditTrailFilters = {}
|
|
340
|
+
this.auditTrailSearch = ''
|
|
341
|
+
},
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Clear all audit trail state (both object-scoped and global).
|
|
345
|
+
* Overrides the base clearAuditTrails so clearAllSubResources() clears everything.
|
|
346
|
+
*/
|
|
347
|
+
clearAuditTrails() {
|
|
348
|
+
// Base sub-resource clear
|
|
349
|
+
this.auditTrails = emptyPaginated(options.limit || 20)
|
|
350
|
+
this.auditTrailsLoading = false
|
|
351
|
+
this.auditTrailsError = null
|
|
352
|
+
// Global clear
|
|
353
|
+
this.clearGlobalAuditTrails()
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
}
|
|
357
|
+
}
|