@conduction/nextcloud-vue 0.1.0-beta.1 → 0.1.0-beta.2
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/dist/nextcloud-vue.cjs.js +7039 -2409
- package/dist/nextcloud-vue.cjs.js.map +1 -1
- package/dist/nextcloud-vue.css +237 -52
- package/dist/nextcloud-vue.esm.js +7012 -2386
- package/dist/nextcloud-vue.esm.js.map +1 -1
- package/package.json +2 -4
- package/src/components/CnActionsBar/CnActionsBar.vue +225 -0
- package/src/components/CnActionsBar/index.js +1 -0
- package/src/components/CnCopyDialog/CnCopyDialog.vue +250 -0
- package/src/components/CnCopyDialog/index.js +1 -0
- package/src/components/CnDataTable/CnDataTable.vue +0 -5
- package/src/components/CnDeleteDialog/CnDeleteDialog.vue +170 -0
- package/src/components/CnDeleteDialog/index.js +1 -0
- package/src/components/CnFormDialog/CnFormDialog.vue +629 -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 +434 -300
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +484 -0
- package/src/components/CnIndexSidebar/index.js +1 -0
- package/src/components/CnPageHeader/CnPageHeader.vue +57 -0
- package/src/components/CnPageHeader/index.js +1 -0
- package/src/components/CnRegisterMapping/CnRegisterMapping.vue +792 -0
- package/src/components/CnRegisterMapping/index.js +1 -0
- package/src/components/index.js +8 -4
- package/src/constants/metadata.js +30 -0
- package/src/css/actions-bar.css +48 -0
- package/src/css/badge.css +4 -4
- package/src/css/card.css +23 -23
- package/src/css/detail.css +13 -13
- package/src/css/index-page.css +32 -0
- package/src/css/index-sidebar.css +187 -0
- package/src/css/index.css +4 -0
- package/src/css/layout.css +14 -14
- package/src/css/page-header.css +33 -0
- package/src/css/pagination.css +12 -12
- package/src/css/table.css +21 -22
- package/src/css/utilities.css +2 -2
- package/src/index.js +11 -8
- package/src/store/plugins/index.js +1 -0
- package/src/store/plugins/registerMapping.js +185 -0
- package/src/store/useObjectStore.js +122 -61
- package/src/utils/headers.js +7 -1
- package/src/utils/index.js +1 -1
- package/src/utils/schema.js +133 -1
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextcloud-vue.cjs.js","sources":["../src/utils/schema.js","../src/components/CnStatusBadge/CnStatusBadge.vue","../node_modules/vue-runtime-helpers/dist/normalize-component.mjs","../src/components/CnCellRenderer/CnCellRenderer.vue","../src/components/CnDataTable/CnDataTable.vue","../src/components/CnFilterBar/CnFilterBar.vue","../src/components/CnListViewLayout/CnListViewLayout.vue","../src/components/CnDetailViewLayout/CnDetailViewLayout.vue","../src/components/CnEmptyState/CnEmptyState.vue","../src/components/CnPagination/CnPagination.vue","../src/components/CnSettingsCard/CnSettingsCard.vue","../src/components/CnSettingsSection/CnSettingsSection.vue","../src/components/CnStatsBlock/CnStatsBlock.vue","../src/components/CnConfigurationCard/CnConfigurationCard.vue","../src/components/CnVersionInfoCard/CnVersionInfoCard.vue","../src/components/CnObjectCard/CnObjectCard.vue","../src/components/CnCardGrid/CnCardGrid.vue","../src/components/CnFacetSidebar/CnFacetSidebar.vue","../src/components/CnViewModeToggle/CnViewModeToggle.vue","../src/components/CnRowActions/CnRowActions.vue","../src/components/CnMassActionBar/CnMassActionBar.vue","../src/components/CnMassDeleteDialog/CnMassDeleteDialog.vue","../src/components/CnMassCopyDialog/CnMassCopyDialog.vue","../src/components/CnMassExportDialog/CnMassExportDialog.vue","../src/components/CnMassImportDialog/CnMassImportDialog.vue","../src/components/CnIndexPage/CnIndexPage.vue","../src/components/CnKpiGrid/CnKpiGrid.vue","../src/utils/headers.js","../src/utils/errors.js","../src/store/useObjectStore.js","../src/store/createSubResourcePlugin.js","../src/store/plugins/auditTrails.js","../src/store/plugins/relations.js","../src/store/plugins/files.js","../src/store/plugins/lifecycle.js","../src/composables/useListView.js","../src/composables/useDetailView.js","../src/composables/useSubResource.js"],"sourcesContent":["/**\r\n * Schema utility functions for auto-generating table columns, cell formatting,\r\n * and faceted filter definitions from OpenRegister schema property definitions.\r\n *\r\n * @module utils/schema\r\n */\r\n\r\n/**\r\n * Default column widths per property type/format.\r\n */\r\nconst DEFAULT_WIDTHS = {\r\n\tboolean: '80px',\r\n\tinteger: '100px',\r\n\tnumber: '100px',\r\n\t'string:uuid': '140px',\r\n\t'string:date-time': '180px',\r\n\t'string:email': '200px',\r\n}\r\n\r\n/**\r\n * Get default width for a property type + format combination.\r\n *\r\n * @param {string} type Property type\r\n * @param {string} [format] Property format\r\n * @return {string|undefined} CSS width or undefined\r\n */\r\nfunction getDefaultWidth(type, format) {\r\n\tif (format) {\r\n\t\treturn DEFAULT_WIDTHS[`${type}:${format}`]\r\n\t}\r\n\treturn DEFAULT_WIDTHS[type]\r\n}\r\n\r\n/**\r\n * Generate CnDataTable column definitions from a schema's properties.\r\n *\r\n * Reads `schema.properties` and creates column objects sorted by the `order`\r\n * hint (if present) then alphabetically. Filters out properties marked\r\n * `visible: false`. Supports include/exclude lists and per-column overrides.\r\n *\r\n * @param {object} schema The schema object with a `properties` field\r\n * @param {object} [options] Configuration options\r\n * @param {string[]} [options.exclude] Property keys to exclude\r\n * @param {string[]} [options.include] Property keys to include (whitelist mode)\r\n * @param {object} [options.overrides] Per-key column overrides, e.g. `{ status: { width: '200px' } }`\r\n * @return {Array<{key: string, label: string, sortable: boolean, type: string, format: string, width: string}>}\r\n */\r\nexport function columnsFromSchema(schema, options = {}) {\r\n\tconst { exclude = [], include = null, overrides = {} } = options\r\n\r\n\tif (!schema || !schema.properties) {\r\n\t\treturn []\r\n\t}\r\n\r\n\tconst entries = Object.entries(schema.properties)\r\n\t\t.filter(([key, prop]) => {\r\n\t\t\t// Skip properties marked as not visible\r\n\t\t\tif (prop.visible === false) return false\r\n\t\t\t// Apply exclude list\r\n\t\t\tif (exclude.includes(key)) return false\r\n\t\t\t// Apply include whitelist\r\n\t\t\tif (include && !include.includes(key)) return false\r\n\t\t\t// Skip complex object types by default (they don't render well in tables)\r\n\t\t\tif (prop.type === 'object') return false\r\n\t\t\treturn true\r\n\t\t})\r\n\t\t.sort(([keyA, propA], [keyB, propB]) => {\r\n\t\t\t// Sort by order hint first, then alphabetically\r\n\t\t\tconst orderA = typeof propA.order === 'number' ? propA.order : Infinity\r\n\t\t\tconst orderB = typeof propB.order === 'number' ? propB.order : Infinity\r\n\t\t\tif (orderA !== orderB) return orderA - orderB\r\n\t\t\treturn keyA.localeCompare(keyB)\r\n\t\t})\r\n\r\n\treturn entries.map(([key, prop]) => {\r\n\t\tconst column = {\r\n\t\t\tkey,\r\n\t\t\tlabel: prop.title || key,\r\n\t\t\tsortable: true,\r\n\t\t\ttype: prop.type || 'string',\r\n\t\t\tformat: prop.format || null,\r\n\t\t}\r\n\r\n\t\t// Apply default width\r\n\t\tconst defaultWidth = getDefaultWidth(column.type, column.format)\r\n\t\tif (defaultWidth) {\r\n\t\t\tcolumn.width = defaultWidth\r\n\t\t}\r\n\r\n\t\t// Store enum values for cell renderer\r\n\t\tif (prop.enum) {\r\n\t\t\tcolumn.enum = prop.enum\r\n\t\t}\r\n\r\n\t\t// Store items type for arrays\r\n\t\tif (prop.items) {\r\n\t\t\tcolumn.items = prop.items\r\n\t\t}\r\n\r\n\t\t// Apply per-column overrides\r\n\t\tif (overrides[key]) {\r\n\t\t\tObject.assign(column, overrides[key])\r\n\t\t}\r\n\r\n\t\treturn column\r\n\t})\r\n}\r\n\r\n/**\r\n * Format a cell value based on its schema property definition.\r\n *\r\n * Handles dates, booleans, arrays, numbers, UUIDs, emails, and markdown.\r\n * Returns a plain string suitable for display in a table cell.\r\n *\r\n * @param {*} value The raw value\r\n * @param {object} [property] The schema property definition `{ type, format, enum, items }`\r\n * @param {object} [options] Formatting options\r\n * @param {number} [options.truncate=100] Maximum string length before truncation\r\n * @return {string} Formatted display string\r\n */\r\nexport function formatValue(value, property = {}, options = {}) {\r\n\tconst { truncate = 100 } = options\r\n\r\n\t// Null/undefined/empty\r\n\tif (value === null || value === undefined || value === '') {\r\n\t\treturn '—'\r\n\t}\r\n\r\n\tconst { type = 'string', format } = property\r\n\r\n\t// Boolean\r\n\tif (type === 'boolean' || typeof value === 'boolean') {\r\n\t\treturn value ? '✓' : '—'\r\n\t}\r\n\r\n\t// Number/Integer\r\n\tif (type === 'integer' || type === 'number') {\r\n\t\tconst num = Number(value)\r\n\t\tif (Number.isNaN(num)) return String(value)\r\n\t\treturn num.toLocaleString()\r\n\t}\r\n\r\n\t// Array\r\n\tif (type === 'array' || Array.isArray(value)) {\r\n\t\tif (!Array.isArray(value)) return String(value)\r\n\t\tif (value.length === 0) return '—'\r\n\t\t// For short arrays, join values\r\n\t\tif (value.length <= 3) {\r\n\t\t\treturn value.join(', ')\r\n\t\t}\r\n\t\treturn `${value.slice(0, 3).join(', ')} +${value.length - 3}`\r\n\t}\r\n\r\n\t// Object (shouldn't normally appear in tables)\r\n\tif (type === 'object' || (typeof value === 'object' && value !== null)) {\r\n\t\treturn '[Object]'\r\n\t}\r\n\r\n\t// String types\r\n\tconst str = String(value)\r\n\r\n\t// Date-time\r\n\tif (format === 'date-time' || format === 'date') {\r\n\t\ttry {\r\n\t\t\tconst date = new Date(str)\r\n\t\t\tif (Number.isNaN(date.getTime())) return str\r\n\t\t\tif (format === 'date') {\r\n\t\t\t\treturn date.toLocaleDateString(undefined, {\r\n\t\t\t\t\tday: '2-digit',\r\n\t\t\t\t\tmonth: '2-digit',\r\n\t\t\t\t\tyear: 'numeric',\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\treturn date.toLocaleDateString(undefined, {\r\n\t\t\t\tday: '2-digit',\r\n\t\t\t\tmonth: '2-digit',\r\n\t\t\t\tyear: 'numeric',\r\n\t\t\t}) + ', ' + date.toLocaleTimeString(undefined, {\r\n\t\t\t\thour: '2-digit',\r\n\t\t\t\tminute: '2-digit',\r\n\t\t\t\tsecond: '2-digit',\r\n\t\t\t})\r\n\t\t} catch {\r\n\t\t\treturn str\r\n\t\t}\r\n\t}\r\n\r\n\t// UUID — truncate to first 8 chars\r\n\tif (format === 'uuid') {\r\n\t\tif (str.length > 8) {\r\n\t\t\treturn str.substring(0, 8) + '...'\r\n\t\t}\r\n\t\treturn str\r\n\t}\r\n\r\n\t// URI — show truncated\r\n\tif (format === 'uri' || format === 'url') {\r\n\t\ttry {\r\n\t\t\tconst url = new URL(str)\r\n\t\t\treturn url.hostname + url.pathname.substring(0, 20)\r\n\t\t} catch {\r\n\t\t\treturn truncateString(str, truncate)\r\n\t\t}\r\n\t}\r\n\r\n\t// Markdown — strip formatting\r\n\tif (format === 'markdown') {\r\n\t\tconst stripped = str\r\n\t\t\t.replace(/#{1,6}\\s+/g, '') // headings\r\n\t\t\t.replace(/[*_]{1,3}([^*_]+)[*_]{1,3}/g, '$1') // bold/italic\r\n\t\t\t.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // links\r\n\t\t\t.replace(/`{1,3}[^`]*`{1,3}/g, '') // code\r\n\t\t\t.replace(/\\n+/g, ' ') // newlines\r\n\t\t\t.trim()\r\n\t\treturn truncateString(stripped, truncate)\r\n\t}\r\n\r\n\t// Email — display as-is (no truncation)\r\n\tif (format === 'email') {\r\n\t\treturn str\r\n\t}\r\n\r\n\t// Plain string — truncate if needed\r\n\treturn truncateString(str, truncate)\r\n}\r\n\r\n/**\r\n * Truncate a string to the given length, adding ellipsis if needed.\r\n *\r\n * @param {string} str The string to truncate\r\n * @param {number} maxLength Maximum length\r\n * @return {string} Truncated string\r\n */\r\nfunction truncateString(str, maxLength) {\r\n\tif (str.length <= maxLength) return str\r\n\treturn str.substring(0, maxLength) + '...'\r\n}\r\n\r\n/**\r\n * Generate faceted filter definitions from a schema's facetable properties.\r\n *\r\n * Reads `schema.properties` and creates filter definitions for properties\r\n * marked with `facetable: true`. Maps property types to appropriate filter\r\n * widget types (select, checkbox, text).\r\n *\r\n * @param {object} schema The schema object with a `properties` field\r\n * @return {Array<{key: string, label: string, type: string, propertyType: string, options: Array}>}\r\n */\r\nexport function filtersFromSchema(schema) {\r\n\tif (!schema || !schema.properties) {\r\n\t\treturn []\r\n\t}\r\n\r\n\treturn Object.entries(schema.properties)\r\n\t\t.filter(([, prop]) => prop.facetable === true)\r\n\t\t.sort(([keyA, propA], [keyB, propB]) => {\r\n\t\t\tconst orderA = typeof propA.order === 'number' ? propA.order : Infinity\r\n\t\t\tconst orderB = typeof propB.order === 'number' ? propB.order : Infinity\r\n\t\t\tif (orderA !== orderB) return orderA - orderB\r\n\t\t\treturn keyA.localeCompare(keyB)\r\n\t\t})\r\n\t\t.map(([key, prop]) => {\r\n\t\t\tconst filter = {\r\n\t\t\t\tkey,\r\n\t\t\t\tlabel: prop.title || key,\r\n\t\t\t\tpropertyType: prop.type || 'string',\r\n\t\t\t\toptions: [],\r\n\t\t\t\tvalue: null,\r\n\t\t\t}\r\n\r\n\t\t\t// Map property type to filter widget type\r\n\t\t\tif (prop.type === 'boolean') {\r\n\t\t\t\tfilter.type = 'checkbox'\r\n\t\t\t} else if (prop.enum) {\r\n\t\t\t\tfilter.type = 'select'\r\n\t\t\t\tfilter.options = prop.enum.map((val) => ({\r\n\t\t\t\t\tid: val,\r\n\t\t\t\t\tlabel: val,\r\n\t\t\t\t}))\r\n\t\t\t} else {\r\n\t\t\t\t// Default to select — options loaded dynamically from facet API\r\n\t\t\t\tfilter.type = 'select'\r\n\t\t\t}\r\n\r\n\t\t\treturn filter\r\n\t\t})\r\n}\r\n","<template>\r\n\t<span\r\n\t\tclass=\"cn-status-badge\"\r\n\t\t:class=\"badgeClasses\">\r\n\t\t<slot>{{ label }}</slot>\r\n\t</span>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * CnStatusBadge — Color-coded pill badge for status, priority, or category display.\r\n *\r\n * Replaces the various .status-badge / .priority-badge CSS patterns duplicated\r\n * across Pipelinq and Procest. Supports a colorMap for automatic variant lookup.\r\n *\r\n * @example\r\n * <CnStatusBadge label=\"Open\" variant=\"success\" />\r\n * <CnStatusBadge label=\"Urgent\" variant=\"error\" size=\"small\" />\r\n *\r\n * @example\r\n * <!-- With colorMap: variant auto-resolved from label -->\r\n * <CnStatusBadge\r\n * label=\"overdue\"\r\n * :color-map=\"{ open: 'success', closed: 'default', overdue: 'error' }\" />\r\n */\r\nexport default {\r\n\tname: 'CnStatusBadge',\r\n\r\n\tprops: {\r\n\t\t/** Badge label text */\r\n\t\tlabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/**\r\n\t\t * Color variant: 'default', 'primary', 'success', 'warning', 'error', 'info'\r\n\t\t */\r\n\t\tvariant: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'default',\r\n\t\t\tvalidator: (v) => ['default', 'primary', 'success', 'warning', 'error', 'info'].includes(v),\r\n\t\t},\r\n\t\t/** Size: 'small' or 'medium' */\r\n\t\tsize: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'medium',\r\n\t\t\tvalidator: (v) => ['small', 'medium'].includes(v),\r\n\t\t},\r\n\t\t/**\r\n\t\t * Map of label values to variants. When provided, the variant is resolved\r\n\t\t * from this map using the label (case-insensitive). Falls back to the variant prop.\r\n\t\t * @example { open: 'success', closed: 'default', overdue: 'error' }\r\n\t\t */\r\n\t\tcolorMap: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tresolvedVariant() {\r\n\t\t\tif (this.colorMap && this.label) {\r\n\t\t\t\tconst key = this.label.toLowerCase()\r\n\t\t\t\treturn this.colorMap[key] || this.variant\r\n\t\t\t}\r\n\t\t\treturn this.variant\r\n\t\t},\r\n\r\n\t\tbadgeClasses() {\r\n\t\t\treturn {\r\n\t\t\t\t['cn-status-badge--' + this.resolvedVariant]: true,\r\n\t\t\t\t'cn-status-badge--small': this.size === 'small',\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {\r\n if (typeof shadowMode !== 'boolean') {\r\n createInjectorSSR = createInjector;\r\n createInjector = shadowMode;\r\n shadowMode = false;\r\n }\r\n // Vue.extend constructor export interop.\r\n const options = typeof script === 'function' ? script.options : script;\r\n // render functions\r\n if (template && template.render) {\r\n options.render = template.render;\r\n options.staticRenderFns = template.staticRenderFns;\r\n options._compiled = true;\r\n // functional template\r\n if (isFunctionalTemplate) {\r\n options.functional = true;\r\n }\r\n }\r\n // scopedId\r\n if (scopeId) {\r\n options._scopeId = scopeId;\r\n }\r\n let hook;\r\n if (moduleIdentifier) {\r\n // server build\r\n hook = function (context) {\r\n // 2.3 injection\r\n context =\r\n context || // cached call\r\n (this.$vnode && this.$vnode.ssrContext) || // stateful\r\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional\r\n // 2.2 with runInNewContext: true\r\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\r\n context = __VUE_SSR_CONTEXT__;\r\n }\r\n // inject component styles\r\n if (style) {\r\n style.call(this, createInjectorSSR(context));\r\n }\r\n // register component module identifier for async chunk inference\r\n if (context && context._registeredComponents) {\r\n context._registeredComponents.add(moduleIdentifier);\r\n }\r\n };\r\n // used by ssr in case component is cached and beforeCreate\r\n // never gets called\r\n options._ssrRegister = hook;\r\n }\r\n else if (style) {\r\n hook = shadowMode\r\n ? function (context) {\r\n style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));\r\n }\r\n : function (context) {\r\n style.call(this, createInjector(context));\r\n };\r\n }\r\n if (hook) {\r\n if (options.functional) {\r\n // register for functional component in vue file\r\n const originalRender = options.render;\r\n options.render = function renderWithStyleInjection(h, context) {\r\n hook.call(context);\r\n return originalRender(h, context);\r\n };\r\n }\r\n else {\r\n // inject component registration as beforeCreate hook\r\n const existing = options.beforeCreate;\r\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook];\r\n }\r\n }\r\n return script;\r\n}\n\nexport default normalizeComponent;\n//# sourceMappingURL=normalize-component.mjs.map\n","<template>\r\n\t<span class=\"cn-cell-renderer\" :class=\"cellClass\">\r\n\t\t<!-- Boolean: icon -->\r\n\t\t<template v-if=\"propertyType === 'boolean'\">\r\n\t\t\t<CheckBold v-if=\"value\" :size=\"16\" class=\"cn-cell-renderer__icon cn-cell-renderer__icon--success\" />\r\n\t\t\t<span v-else class=\"cn-cell-renderer__dash\">—</span>\r\n\t\t</template>\r\n\r\n\t\t<!-- Enum: status badge -->\r\n\t\t<template v-else-if=\"isEnum\">\r\n\t\t\t<CnStatusBadge v-if=\"value\" :label=\"String(value)\" />\r\n\t\t\t<span v-else class=\"cn-cell-renderer__dash\">—</span>\r\n\t\t</template>\r\n\r\n\t\t<!-- Array: comma-joined or count -->\r\n\t\t<template v-else-if=\"propertyType === 'array'\">\r\n\t\t\t<span v-if=\"!value || !value.length\" class=\"cn-cell-renderer__dash\">—</span>\r\n\t\t\t<span v-else :title=\"Array.isArray(value) ? value.join(', ') : ''\">\r\n\t\t\t\t{{ formattedValue }}\r\n\t\t\t</span>\r\n\t\t</template>\r\n\r\n\t\t<!-- Default: formatted text -->\r\n\t\t<template v-else>\r\n\t\t\t<span :title=\"rawTitle\">{{ formattedValue }}</span>\r\n\t\t</template>\r\n\t</span>\r\n</template>\r\n\r\n<script>\r\nimport { formatValue } from '../../utils/schema.js'\r\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\r\nimport CheckBold from 'vue-material-design-icons/CheckBold.vue'\r\n\r\n/**\r\n * CnCellRenderer — Type-aware cell renderer for schema-driven tables.\r\n *\r\n * Renders a single cell value based on its schema property definition.\r\n * Booleans render as icons, enums as status badges, dates as formatted strings,\r\n * and everything else as truncated text via `formatValue()`.\r\n *\r\n * @example\r\n * <CnCellRenderer :value=\"row.status\" :property=\"schema.properties.status\" />\r\n */\r\nexport default {\r\n\tname: 'CnCellRenderer',\r\n\r\n\tcomponents: {\r\n\t\tCnStatusBadge,\r\n\t\tCheckBold,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** The raw cell value */\r\n\t\tvalue: {\r\n\t\t\ttype: [String, Number, Boolean, Array, Object],\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Schema property definition: { type, format, enum, items, title } */\r\n\t\tproperty: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Maximum string length before truncation */\r\n\t\ttruncate: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 100,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tpropertyType() {\r\n\t\t\treturn this.property?.type || (typeof this.value)\r\n\t\t},\r\n\r\n\t\tisEnum() {\r\n\t\t\treturn !!(this.property?.enum && this.property.enum.length > 0)\r\n\t\t},\r\n\r\n\t\tformattedValue() {\r\n\t\t\treturn formatValue(this.value, this.property, { truncate: this.truncate })\r\n\t\t},\r\n\r\n\t\trawTitle() {\r\n\t\t\t// Show full value on hover if it was truncated\r\n\t\t\tconst raw = this.value\r\n\t\t\tif (typeof raw === 'string' && raw.length > this.truncate) {\r\n\t\t\t\treturn raw\r\n\t\t\t}\r\n\t\t\treturn undefined\r\n\t\t},\r\n\r\n\t\tcellClass() {\r\n\t\t\tconst classes = []\r\n\t\t\tif (this.propertyType === 'boolean') classes.push('cn-cell-renderer--boolean')\r\n\t\t\tif (this.isEnum) classes.push('cn-cell-renderer--enum')\r\n\t\t\tif (this.property?.format === 'date-time' || this.property?.format === 'date') {\r\n\t\t\t\tclasses.push('cn-cell-renderer--date')\r\n\t\t\t}\r\n\t\t\tif (this.property?.format === 'uuid') classes.push('cn-cell-renderer--uuid')\r\n\t\t\tif (this.propertyType === 'integer' || this.propertyType === 'number') {\r\n\t\t\t\tclasses.push('cn-cell-renderer--number')\r\n\t\t\t}\r\n\t\t\treturn classes\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-cell-renderer--uuid {\r\n\tfont-family: monospace;\r\n\tfont-size: 13px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-cell-renderer--number {\r\n\tfont-variant-numeric: tabular-nums;\r\n}\r\n\r\n.cn-cell-renderer--date {\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-cell-renderer__dash {\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-cell-renderer__icon--success {\r\n\tcolor: var(--color-success);\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-table-container\" :class=\"{ 'cn-table-container--scrollable': scrollable }\">\r\n\t\t<!-- Loading State -->\r\n\t\t<div v-if=\"loading\" class=\"cn-table-loading\">\r\n\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t\t<p>{{ loadingText }}</p>\r\n\t\t</div>\r\n\r\n\t\t<!-- Table -->\r\n\t\t<table v-else class=\"cn-data-table\">\r\n\t\t\t<thead>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<!-- Checkbox column -->\r\n\t\t\t\t\t<th v-if=\"selectable\" class=\"cn-table-col--checkbox\">\r\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t\t\t:checked=\"allSelected\"\r\n\t\t\t\t\t\t\t:indeterminate=\"someSelected && !allSelected\"\r\n\t\t\t\t\t\t\t@update:checked=\"toggleSelectAll\" />\r\n\t\t\t\t\t</th>\r\n\r\n\t\t\t\t\t<!-- Data columns -->\r\n\t\t\t\t\t<th\r\n\t\t\t\t\t\tv-for=\"col in effectiveColumns\"\r\n\t\t\t\t\t\t:key=\"col.key\"\r\n\t\t\t\t\t\t:class=\"[\r\n\t\t\t\t\t\t\tcol.sortable ? 'cn-table-header--sortable' : '',\r\n\t\t\t\t\t\t\tcol.class || '',\r\n\t\t\t\t\t\t]\"\r\n\t\t\t\t\t\t:style=\"col.width ? { width: col.width } : {}\"\r\n\t\t\t\t\t\t@click=\"col.sortable ? onSort(col.key) : null\">\r\n\t\t\t\t\t\t{{ col.label }}\r\n\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\tv-if=\"col.sortable && sortKey === col.key\"\r\n\t\t\t\t\t\t\tclass=\"cn-table-sort-indicator\">\r\n\t\t\t\t\t\t\t{{ sortOrder === 'asc' ? '▲' : '▼' }}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</th>\r\n\r\n\t\t\t\t\t<!-- Actions column -->\r\n\t\t\t\t\t<th v-if=\"$scopedSlots['row-actions']\" class=\"cn-table-col--actions\">\r\n\t\t\t\t\t\t<!-- Actions header intentionally empty -->\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\r\n\t\t\t<tbody>\r\n\t\t\t\t<!-- Empty state -->\r\n\t\t\t\t<tr v-if=\"rows.length === 0\" class=\"cn-table-empty\">\r\n\t\t\t\t\t<td :colspan=\"totalColumns\">\r\n\t\t\t\t\t\t<slot name=\"empty\">\r\n\t\t\t\t\t\t\t{{ emptyText }}\r\n\t\t\t\t\t\t</slot>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\r\n\t\t\t\t<!-- Data rows -->\r\n\t\t\t\t<tr\r\n\t\t\t\t\tv-for=\"row in rows\"\r\n\t\t\t\t\tv-else\r\n\t\t\t\t\t:key=\"row[rowKey]\"\r\n\t\t\t\t\tclass=\"cn-table-row\"\r\n\t\t\t\t\t:class=\"[\r\n\t\t\t\t\t\tisSelected(row) ? 'cn-table-row--selected' : '',\r\n\t\t\t\t\t\trowClass ? rowClass(row) : '',\r\n\t\t\t\t\t]\"\r\n\t\t\t\t\t@click=\"$emit('row-click', row)\">\r\n\t\t\t\t\t<!-- Checkbox -->\r\n\t\t\t\t\t<td v-if=\"selectable\" class=\"cn-table-col--checkbox\" @click.stop>\r\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t\t\t:checked=\"isSelected(row)\"\r\n\t\t\t\t\t\t\t@update:checked=\"toggleSelect(row)\" />\r\n\t\t\t\t\t</td>\r\n\r\n\t\t\t\t\t<!-- Data cells -->\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tv-for=\"col in effectiveColumns\"\r\n\t\t\t\t\t\t:key=\"col.key\"\r\n\t\t\t\t\t\t:class=\"col.cellClass || ''\"\r\n\t\t\t\t\t\t:style=\"col.width ? { maxWidth: col.width } : {}\">\r\n\t\t\t\t\t\t<slot :name=\"'column-' + col.key\" :row=\"row\" :value=\"getCellValue(row, col.key)\">\r\n\t\t\t\t\t\t\t<!-- Schema-driven: use CnCellRenderer -->\r\n\t\t\t\t\t\t\t<CnCellRenderer\r\n\t\t\t\t\t\t\t\tv-if=\"isSchemaColumn(col)\"\r\n\t\t\t\t\t\t\t\t:value=\"getCellValue(row, col.key)\"\r\n\t\t\t\t\t\t\t\t:property=\"getSchemaProperty(col.key)\" />\r\n\t\t\t\t\t\t\t<!-- Manual: plain text -->\r\n\t\t\t\t\t\t\t<template v-else>\r\n\t\t\t\t\t\t\t\t{{ getCellValue(row, col.key) }}\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t</slot>\r\n\t\t\t\t\t</td>\r\n\r\n\t\t\t\t\t<!-- Row actions -->\r\n\t\t\t\t\t<td v-if=\"$scopedSlots['row-actions']\" class=\"cn-table-col--actions\" @click.stop>\r\n\t\t\t\t\t\t<slot name=\"row-actions\" :row=\"row\" />\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon, NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport { CnCellRenderer } from '../CnCellRenderer/index.js'\r\nimport { columnsFromSchema } from '../../utils/schema.js'\r\n\r\n/**\r\n * CnDataTable — Generic sortable data table for list views.\r\n *\r\n * Replaces the copy-pasted `<table class=\"viewTable\">` HTML pattern found in\r\n * every list view across OpenRegister, Pipelinq, and Procest. Supports sorting,\r\n * row selection, custom cell rendering via scoped slots, loading states,\r\n * and empty states.\r\n *\r\n * When a `schema` prop is provided, columns are auto-generated from schema\r\n * properties and cells render through CnCellRenderer for type-aware formatting\r\n * (dates, booleans, UUIDs, enums, etc.). Scoped slots still override individual\r\n * columns when needed.\r\n *\r\n * NL Design tokens used:\r\n * - --nldesign-component-table-header-background-color\r\n * - --nldesign-component-table-row-hover-background-color\r\n * - --nldesign-component-table-border-color\r\n *\r\n * @example Manual columns (backwards compatible)\r\n * <CnDataTable\r\n * :columns=\"[\r\n * { key: 'name', label: 'Name', sortable: true },\r\n * { key: 'email', label: 'Email' },\r\n * ]\"\r\n * :rows=\"clients\"\r\n * @row-click=\"openClient\" />\r\n *\r\n * @example Schema-driven (auto columns)\r\n * <CnDataTable :schema=\"schema\" :rows=\"objects\" />\r\n *\r\n * @example Schema with overrides and custom cell\r\n * <CnDataTable\r\n * :schema=\"schema\"\r\n * :exclude-columns=\"['description']\"\r\n * :column-overrides=\"{ status: { width: '200px' } }\"\r\n * :rows=\"objects\">\r\n * <template #column-status=\"{ row, value }\">\r\n * <QuickStatusDropdown :case-obj=\"row\" />\r\n * </template>\r\n * </CnDataTable>\r\n */\r\nexport default {\r\n\tname: 'CnDataTable',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tCnCellRenderer,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/**\r\n\t\t * Column definitions (manual mode).\r\n\t\t * Not required when `schema` is provided.\r\n\t\t * @type {Array<{key: string, label: string, sortable?: boolean, width?: string, class?: string, cellClass?: string}>}\r\n\t\t */\r\n\t\tcolumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/**\r\n\t\t * Schema object with `properties` field (schema-driven mode).\r\n\t\t * When provided, columns are auto-generated from schema properties.\r\n\t\t */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Per-column overrides when using schema mode: { key: { width, label, sortable, ... } } */\r\n\t\tcolumnOverrides: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Column keys to exclude when using schema mode */\r\n\t\texcludeColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Column keys to include when using schema mode (whitelist) */\r\n\t\tincludeColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Row data array. Each row should have a unique identifier (see rowKey). */\r\n\t\trows: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Whether data is loading (shows loading spinner) */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Current sort column key */\r\n\t\tsortKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Current sort order: 'asc' or 'desc' */\r\n\t\tsortOrder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'asc',\r\n\t\t\tvalidator: (v) => ['asc', 'desc'].includes(v),\r\n\t\t},\r\n\t\t/** Whether rows can be selected with checkboxes */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Array of currently selected row IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Property name used as unique row identifier */\r\n\t\trowKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'id',\r\n\t\t},\r\n\t\t/** Text shown when there are no rows */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items found',\r\n\t\t},\r\n\t\t/** Function returning CSS class(es) for a row: (row) => string|object */\r\n\t\trowClass: {\r\n\t\t\ttype: Function,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Whether to constrain table height and make it scrollable */\r\n\t\tscrollable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Text shown while loading */\r\n\t\tloadingText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Loading...',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\t/**\r\n\t\t * Effective columns: schema-generated or manually provided.\r\n\t\t * Schema columns take precedence when schema is provided and no manual columns given.\r\n\t\t */\r\n\t\teffectiveColumns() {\r\n\t\t\tif (this.schema && this.columns.length === 0) {\r\n\t\t\t\treturn columnsFromSchema(this.schema, {\r\n\t\t\t\t\texclude: this.excludeColumns,\r\n\t\t\t\t\tinclude: this.includeColumns,\r\n\t\t\t\t\toverrides: this.columnOverrides,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\treturn this.columns\r\n\t\t},\r\n\r\n\t\ttotalColumns() {\r\n\t\t\tlet count = this.effectiveColumns.length\r\n\t\t\tif (this.selectable) count++\r\n\t\t\tif (this.$scopedSlots['row-actions']) count++\r\n\t\t\treturn count\r\n\t\t},\r\n\r\n\t\tallSelected() {\r\n\t\t\treturn this.rows.length > 0\r\n\t\t\t\t&& this.rows.every((row) => this.selectedIds.includes(row[this.rowKey]))\r\n\t\t},\r\n\r\n\t\tsomeSelected() {\r\n\t\t\treturn this.rows.some((row) => this.selectedIds.includes(row[this.rowKey]))\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Get a cell value from a row using dot-notation key.\r\n\t\t * @param {object} row The row data\r\n\t\t * @param {string} key The column key (supports dot notation: 'address.city')\r\n\t\t * @return {*} The cell value\r\n\t\t */\r\n\t\tgetCellValue(row, key) {\r\n\t\t\tif (key.includes('.')) {\r\n\t\t\t\treturn key.split('.').reduce((obj, k) => obj?.[k], row)\r\n\t\t\t}\r\n\t\t\treturn row[key]\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Check if a column was generated from schema (has type info).\r\n\t\t * @param {object} col Column definition\r\n\t\t * @return {boolean}\r\n\t\t */\r\n\t\tisSchemaColumn(col) {\r\n\t\t\treturn !!(this.schema && col.type)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Get the schema property definition for a column key.\r\n\t\t * @param {string} key Column key\r\n\t\t * @return {object} Property definition\r\n\t\t */\r\n\t\tgetSchemaProperty(key) {\r\n\t\t\treturn this.schema?.properties?.[key] || {}\r\n\t\t},\r\n\r\n\t\tisSelected(row) {\r\n\t\t\treturn this.selectedIds.includes(row[this.rowKey])\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handle sort column click.\r\n\t\t * @param {string} key Column key\r\n\t\t */\r\n\t\tonSort(key) {\r\n\t\t\tlet order = 'asc'\r\n\t\t\tif (this.sortKey === key) {\r\n\t\t\t\torder = this.sortOrder === 'asc' ? 'desc' : 'asc'\r\n\t\t\t}\r\n\t\t\t/**\r\n\t\t\t * @event sort Emitted when a sortable column header is clicked.\r\n\t\t\t * @type {{ key: string, order: 'asc'|'desc' }}\r\n\t\t\t */\r\n\t\t\tthis.$emit('sort', { key, order })\r\n\t\t},\r\n\r\n\t\ttoggleSelect(row) {\r\n\t\t\tconst id = row[this.rowKey]\r\n\t\t\tconst newIds = this.isSelected(row)\r\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\r\n\t\t\t\t: [...this.selectedIds, id]\r\n\t\t\t/** @event select Emitted when row selection changes. Payload: array of selected IDs. */\r\n\t\t\tthis.$emit('select', newIds)\r\n\t\t},\r\n\r\n\t\ttoggleSelectAll() {\r\n\t\t\tif (this.allSelected) {\r\n\t\t\t\tthis.$emit('select', [])\r\n\t\t\t} else {\r\n\t\t\t\tthis.$emit('select', this.rows.map((row) => row[this.rowKey]))\r\n\t\t\t}\r\n\t\t\t/** @event select-all Emitted when select-all checkbox is toggled. */\r\n\t\t\tthis.$emit('select-all', !this.allSelected)\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div class=\"cn-filter-bar\">\r\n\t\t<!-- Search input -->\r\n\t\t<div class=\"cn-filter-bar__search\">\r\n\t\t\t<NcTextField\r\n\t\t\t\t:value=\"searchValue\"\r\n\t\t\t\t:placeholder=\"searchPlaceholder\"\r\n\t\t\t\t:label=\"searchPlaceholder\"\r\n\t\t\t\ttrailing-button-icon=\"close\"\r\n\t\t\t\t:show-trailing-button=\"searchValue !== ''\"\r\n\t\t\t\t@update:value=\"$emit('search', $event)\"\r\n\t\t\t\t@trailing-button-click=\"$emit('search', '')\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<Magnify :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t</NcTextField>\r\n\t\t</div>\r\n\r\n\t\t<!-- Filter controls -->\r\n\t\t<div class=\"cn-filter-bar__filters\">\r\n\t\t\t<template v-for=\"filter in filters\">\r\n\t\t\t\t<!-- Select filter -->\r\n\t\t\t\t<NcSelect\r\n\t\t\t\t\tv-if=\"filter.type === 'select'\"\r\n\t\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\t\tclass=\"cn-filter-bar__filter\"\r\n\t\t\t\t\t:value=\"filter.value\"\r\n\t\t\t\t\t:options=\"filter.options || []\"\r\n\t\t\t\t\t:placeholder=\"filter.label\"\r\n\t\t\t\t\t:input-label=\"filter.label\"\r\n\t\t\t\t\t:clearable=\"true\"\r\n\t\t\t\t\t@input=\"onFilterChange(filter.key, $event)\" />\r\n\r\n\t\t\t\t<!-- Text filter -->\r\n\t\t\t\t<NcTextField\r\n\t\t\t\t\tv-else-if=\"filter.type === 'text'\"\r\n\t\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\t\tclass=\"cn-filter-bar__filter\"\r\n\t\t\t\t\t:value=\"filter.value || ''\"\r\n\t\t\t\t\t:placeholder=\"filter.label\"\r\n\t\t\t\t\t:label=\"filter.label\"\r\n\t\t\t\t\t@update:value=\"onFilterChange(filter.key, $event)\" />\r\n\r\n\t\t\t\t<!-- Checkbox filter -->\r\n\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\tv-else-if=\"filter.type === 'checkbox'\"\r\n\t\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\t\t:checked=\"!!filter.value\"\r\n\t\t\t\t\t@update:checked=\"onFilterChange(filter.key, $event)\">\r\n\t\t\t\t\t{{ filter.label }}\r\n\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t</template>\r\n\t\t</div>\r\n\r\n\t\t<!-- Clear all -->\r\n\t\t<NcButton\r\n\t\t\tv-if=\"showClearAll && hasActiveFilters\"\r\n\t\t\tclass=\"cn-filter-bar__clear\"\r\n\t\t\t@click=\"$emit('clear-all')\">\r\n\t\t\t{{ clearAllLabel }}\r\n\t\t</NcButton>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcTextField, NcSelect, NcButton, NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\r\n\r\n/**\r\n * CnFilterBar — Search and filter controls row for list views.\r\n *\r\n * Extracted from the repeated search + filter pattern in CaseList, ClientList,\r\n * LeadList, RequestList across Pipelinq and Procest. Supports text search,\r\n * select dropdowns, text inputs, and checkbox filters.\r\n *\r\n * @example\r\n * <CnFilterBar\r\n * :search-value=\"searchTerm\"\r\n * search-placeholder=\"Search clients...\"\r\n * :filters=\"[\r\n * { key: 'type', label: 'All types', type: 'select', options: typeOptions, value: selectedType },\r\n * { key: 'active', label: 'Active only', type: 'checkbox', value: showActiveOnly },\r\n * ]\"\r\n * @search=\"onSearch\"\r\n * @filter-change=\"onFilterChange\"\r\n * @clear-all=\"clearFilters\" />\r\n */\r\nexport default {\r\n\tname: 'CnFilterBar',\r\n\r\n\tcomponents: {\r\n\t\tNcTextField,\r\n\t\tNcSelect,\r\n\t\tNcButton,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tMagnify,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/**\r\n\t\t * Filter definitions.\r\n\t\t * @type {Array<{key: string, label: string, type: 'select'|'text'|'checkbox', options?: Array, value?: *}>}\r\n\t\t */\r\n\t\tfilters: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Current search text */\r\n\t\tsearchValue: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Search input placeholder text */\r\n\t\tsearchPlaceholder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Search...',\r\n\t\t},\r\n\t\t/** Whether to show the \"Clear all\" button */\r\n\t\tshowClearAll: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Clear all button label */\r\n\t\tclearAllLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Clear filters',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\thasActiveFilters() {\r\n\t\t\treturn this.searchValue !== ''\r\n\t\t\t\t|| this.filters.some((f) => f.value !== null && f.value !== '' && f.value !== false)\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Emit filter change event.\r\n\t\t * @param {string} key Filter key\r\n\t\t * @param {*} value New filter value\r\n\t\t */\r\n\t\tonFilterChange(key, value) {\r\n\t\t\t/**\r\n\t\t\t * @event filter-change Emitted when any filter changes.\r\n\t\t\t * @type {{ key: string, value: * }}\r\n\t\t\t */\r\n\t\t\tthis.$emit('filter-change', { key, value })\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div class=\"cn-list-layout\">\r\n\t\t<!-- Header -->\r\n\t\t<div class=\"cn-list-layout__header\">\r\n\t\t\t<div class=\"cn-list-layout__title\">\r\n\t\t\t\t<h2>{{ title }}</h2>\r\n\t\t\t\t<span v-if=\"totalItems > 0\" class=\"cn-list-layout__count\">({{ totalItems }})</span>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"cn-list-layout__actions\">\r\n\t\t\t\t<slot name=\"actions\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Filters slot -->\r\n\t\t<slot name=\"filters\" />\r\n\r\n\t\t<!-- Loading state -->\r\n\t\t<div v-if=\"loading\" class=\"cn-loading-container\">\r\n\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Main content (table area) -->\r\n\t\t<template v-else>\r\n\t\t\t<slot />\r\n\t\t</template>\r\n\r\n\t\t<!-- Pagination slot -->\r\n\t\t<slot name=\"pagination\" />\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon } from '@nextcloud/vue'\r\n\r\n/**\r\n * CnListViewLayout — Full list page layout wrapping header, filters, table, and pagination.\r\n *\r\n * Provides the standard page structure used by every list view: a header with\r\n * title + action buttons, a filter/search area, the main content (table), and pagination.\r\n *\r\n * @example\r\n * <CnListViewLayout title=\"Clients\" :total-items=\"clients.length\" :loading=\"isLoading\">\r\n * <template #actions>\r\n * <NcButton type=\"primary\" @click=\"createClient\">New client</NcButton>\r\n * </template>\r\n * <template #filters>\r\n * <CnFilterBar ... />\r\n * </template>\r\n * <CnDataTable :columns=\"columns\" :rows=\"clients\" />\r\n * <template #pagination>\r\n * <CnPagination ... />\r\n * </template>\r\n * </CnListViewLayout>\r\n */\r\nexport default {\r\n\tname: 'CnListViewLayout',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Page title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Total items count (shown next to title) */\r\n\t\ttotalItems: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t},\r\n\t\t/** Whether data is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div class=\"cn-detail-layout\">\r\n\t\t<!-- Header -->\r\n\t\t<div class=\"cn-detail-layout__header\">\r\n\t\t\t<NcButton @click=\"$emit('back')\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<ArrowLeft :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ backLabel }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<h2 class=\"cn-detail-layout__title\">\r\n\t\t\t\t<slot name=\"title\">{{ title }}</slot>\r\n\t\t\t</h2>\r\n\r\n\t\t\t<div class=\"cn-detail-layout__actions\">\r\n\t\t\t\t<slot name=\"actions\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Loading state -->\r\n\t\t<div v-if=\"loading\" class=\"cn-loading-container\">\r\n\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Main content -->\r\n\t\t<div v-else class=\"cn-detail-layout__content\">\r\n\t\t\t<slot />\r\n\t\t</div>\r\n\r\n\t\t<!-- Delete confirmation dialog -->\r\n\t\t<slot name=\"dialogs\" />\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcButton, NcLoadingIcon } from '@nextcloud/vue'\r\nimport ArrowLeft from 'vue-material-design-icons/ArrowLeft.vue'\r\n\r\n/**\r\n * CnDetailViewLayout — Detail page layout with back button, title, actions, and content.\r\n *\r\n * Provides the standard structure for detail/edit views: back navigation,\r\n * page title, action buttons, and a content area. Supports loading state\r\n * and a dialogs slot for modals.\r\n *\r\n * @example\r\n * <CnDetailViewLayout\r\n * title=\"Client: Acme Corp\"\r\n * :loading=\"isLoading\"\r\n * @back=\"goBack\">\r\n * <template #actions>\r\n * <NcButton @click=\"edit\">Edit</NcButton>\r\n * <NcButton type=\"error\" @click=\"confirmDelete\">Delete</NcButton>\r\n * </template>\r\n * <div class=\"cn-detail-grid\">\r\n * <div class=\"cn-detail-item\">...</div>\r\n * </div>\r\n * </CnDetailViewLayout>\r\n */\r\nexport default {\r\n\tname: 'CnDetailViewLayout',\r\n\r\n\tcomponents: {\r\n\t\tNcButton,\r\n\t\tNcLoadingIcon,\r\n\t\tArrowLeft,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Page title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Whether data is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Back button label */\r\n\t\tbackLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Back',\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<NcEmptyContent :name=\"title\" :description=\"description\">\r\n\t\t<template #icon>\r\n\t\t\t<slot name=\"icon\">\r\n\t\t\t\t<component :is=\"icon\" v-if=\"icon\" :size=\"64\" />\r\n\t\t\t</slot>\r\n\t\t</template>\r\n\t\t<template v-if=\"actionLabel\" #action>\r\n\t\t\t<slot name=\"action\">\r\n\t\t\t\t<NcButton :type=\"actionType\" @click=\"$emit('action')\">\r\n\t\t\t\t\t{{ actionLabel }}\r\n\t\t\t\t</NcButton>\r\n\t\t\t</slot>\r\n\t\t</template>\r\n\t</NcEmptyContent>\r\n</template>\r\n\r\n<script>\r\nimport { NcEmptyContent, NcButton } from '@nextcloud/vue'\r\n\r\n/**\r\n * CnEmptyState — Consistent empty state display wrapping NcEmptyContent.\r\n *\r\n * Provides a unified empty state pattern with icon, title, description,\r\n * and optional action button. Used across all list views.\r\n *\r\n * @example\r\n * <CnEmptyState\r\n * title=\"No clients yet\"\r\n * description=\"Create your first client to get started\"\r\n * action-label=\"New Client\"\r\n * @action=\"createClient\" />\r\n *\r\n * @example\r\n * <!-- With custom icon -->\r\n * <CnEmptyState title=\"No results\">\r\n * <template #icon>\r\n * <Magnify :size=\"64\" />\r\n * </template>\r\n * </CnEmptyState>\r\n */\r\nexport default {\r\n\tname: 'CnEmptyState',\r\n\r\n\tcomponents: {\r\n\t\tNcEmptyContent,\r\n\t\tNcButton,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Main title text */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Description text below the title */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Vue component for the icon (e.g., imported material design icon) */\r\n\t\ticon: {\r\n\t\t\ttype: [Object, null],\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Action button label. If empty, no button is shown. */\r\n\t\tactionLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** NcButton type for the action button */\r\n\t\tactionType: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'primary',\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div v-if=\"totalPages > 1 || totalItems > minItemsToShow\" class=\"cn-pagination\">\r\n\t\t<!-- Page info -->\r\n\t\t<div class=\"cn-pagination__info\">\r\n\t\t\t<span class=\"cn-pagination__page-info\">\r\n\t\t\t\t{{ pageInfoText }}\r\n\t\t\t</span>\r\n\t\t</div>\r\n\r\n\t\t<!-- Page navigation -->\r\n\t\t<div v-if=\"totalPages > 1\" class=\"cn-pagination__nav\">\r\n\t\t\t<NcButton\r\n\t\t\t\t:disabled=\"currentPage === 1\"\r\n\t\t\t\t@click=\"changePage(1)\">\r\n\t\t\t\t{{ firstLabel }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<NcButton\r\n\t\t\t\t:disabled=\"currentPage === 1\"\r\n\t\t\t\t@click=\"changePage(currentPage - 1)\">\r\n\t\t\t\t{{ previousLabel }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<div class=\"cn-pagination__numbers\">\r\n\t\t\t\t<template v-for=\"page in visiblePages\">\r\n\t\t\t\t\t<span v-if=\"page === '...'\" :key=\"'ellipsis-' + page\" class=\"cn-pagination__ellipsis\">...</span>\r\n\t\t\t\t\t<NcButton\r\n\t\t\t\t\t\tv-else\r\n\t\t\t\t\t\t:key=\"page\"\r\n\t\t\t\t\t\t:type=\"page === currentPage ? 'primary' : 'secondary'\"\r\n\t\t\t\t\t\t:disabled=\"page === currentPage\"\r\n\t\t\t\t\t\t@click=\"changePage(page)\">\r\n\t\t\t\t\t\t{{ page }}\r\n\t\t\t\t\t</NcButton>\r\n\t\t\t\t</template>\r\n\t\t\t</div>\r\n\r\n\t\t\t<NcButton\r\n\t\t\t\t:disabled=\"currentPage === totalPages\"\r\n\t\t\t\t@click=\"changePage(currentPage + 1)\">\r\n\t\t\t\t{{ nextLabel }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<NcButton\r\n\t\t\t\t:disabled=\"currentPage === totalPages\"\r\n\t\t\t\t@click=\"changePage(totalPages)\">\r\n\t\t\t\t{{ lastLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</div>\r\n\r\n\t\t<!-- Page size selector -->\r\n\t\t<div class=\"cn-pagination__page-size\">\r\n\t\t\t<label :for=\"pageSizeId\">{{ itemsPerPageLabel }}</label>\r\n\t\t\t<NcSelect\r\n\t\t\t\t:input-id=\"pageSizeId\"\r\n\t\t\t\tclass=\"cn-pagination__page-size-select\"\r\n\t\t\t\t:value=\"currentPageSizeOption\"\r\n\t\t\t\t:options=\"pageSizeOptions\"\r\n\t\t\t\t:clearable=\"false\"\r\n\t\t\t\t:input-label=\"itemsPerPageLabel\"\r\n\t\t\t\t@option:selected=\"changePageSize\" />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcButton, NcSelect } from '@nextcloud/vue'\r\n\r\n/**\r\n * CnPagination — Full pagination with page numbers, navigation, and page size selector.\r\n *\r\n * Extracted from OpenRegister's PaginationComponent. Zero store dependencies.\r\n * Supports First/Previous/Next/Last buttons, smart page number display with\r\n * ellipsis, and configurable page size.\r\n *\r\n * NL Design tokens used:\r\n * - Inherits from cn-pagination CSS class (see css/pagination.css)\r\n *\r\n * @example\r\n * <CnPagination\r\n * :current-page=\"page\"\r\n * :total-pages=\"totalPages\"\r\n * :total-items=\"totalItems\"\r\n * :current-page-size=\"limit\"\r\n * @page-changed=\"onPageChange\"\r\n * @page-size-changed=\"onPageSizeChange\" />\r\n */\r\nexport default {\r\n\tname: 'CnPagination',\r\n\r\n\tcomponents: {\r\n\t\tNcButton,\r\n\t\tNcSelect,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Current page number (1-based) */\r\n\t\tcurrentPage: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 1,\r\n\t\t},\r\n\t\t/** Total number of pages */\r\n\t\ttotalPages: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 1,\r\n\t\t},\r\n\t\t/** Total number of items across all pages */\r\n\t\ttotalItems: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t},\r\n\t\t/** Current items per page */\r\n\t\tcurrentPageSize: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 20,\r\n\t\t},\r\n\t\t/** Available page size options */\r\n\t\tpageSizeOptions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [\r\n\t\t\t\t{ value: 10, label: '10' },\r\n\t\t\t\t{ value: 20, label: '20' },\r\n\t\t\t\t{ value: 50, label: '50' },\r\n\t\t\t\t{ value: 100, label: '100' },\r\n\t\t\t\t{ value: 250, label: '250' },\r\n\t\t\t\t{ value: 500, label: '500' },\r\n\t\t\t\t{ value: 1000, label: '1000' },\r\n\t\t\t],\r\n\t\t},\r\n\t\t/** Minimum items before pagination is shown */\r\n\t\tminItemsToShow: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 10,\r\n\t\t},\r\n\t\t/** Label for \"First\" button */\r\n\t\tfirstLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'First',\r\n\t\t},\r\n\t\t/** Label for \"Previous\" button */\r\n\t\tpreviousLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Previous',\r\n\t\t},\r\n\t\t/** Label for \"Next\" button */\r\n\t\tnextLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Next',\r\n\t\t},\r\n\t\t/** Label for \"Last\" button */\r\n\t\tlastLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Last',\r\n\t\t},\r\n\t\t/** Label for \"Items per page:\" */\r\n\t\titemsPerPageLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Items per page:',\r\n\t\t},\r\n\t\t/**\r\n\t\t * Page info format string. Use {current} and {total} as placeholders.\r\n\t\t * @example \"Page {current} of {total}\"\r\n\t\t */\r\n\t\tpageInfoFormat: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Page {current} of {total}',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tpageSizeId() {\r\n\t\t\treturn 'cn-page-size-' + this._uid\r\n\t\t},\r\n\r\n\t\tcurrentPageSizeOption() {\r\n\t\t\treturn this.pageSizeOptions.find(\r\n\t\t\t\t(option) => option.value === this.currentPageSize,\r\n\t\t\t) || this.pageSizeOptions[1]\r\n\t\t},\r\n\r\n\t\tpageInfoText() {\r\n\t\t\treturn this.pageInfoFormat\r\n\t\t\t\t.replace('{current}', this.currentPage)\r\n\t\t\t\t.replace('{total}', this.totalPages)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Calculate visible page numbers with ellipsis for large page counts.\r\n\t\t * Shows up to 7 page numbers at a time.\r\n\t\t */\r\n\t\tvisiblePages() {\r\n\t\t\tconst current = this.currentPage\r\n\t\t\tconst total = this.totalPages\r\n\t\t\tconst pages = []\r\n\r\n\t\t\tif (total <= 7) {\r\n\t\t\t\tfor (let i = 1; i <= total; i++) {\r\n\t\t\t\t\tpages.push(i)\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tpages.push(1)\r\n\r\n\t\t\t\tif (current <= 4) {\r\n\t\t\t\t\tfor (let i = 2; i <= 5; i++) {\r\n\t\t\t\t\t\tpages.push(i)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpages.push('...')\r\n\t\t\t\t\tpages.push(total)\r\n\t\t\t\t} else if (current >= total - 3) {\r\n\t\t\t\t\tpages.push('...')\r\n\t\t\t\t\tfor (let i = total - 4; i <= total; i++) {\r\n\t\t\t\t\t\tpages.push(i)\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpages.push('...')\r\n\t\t\t\t\tfor (let i = current - 1; i <= current + 1; i++) {\r\n\t\t\t\t\t\tpages.push(i)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpages.push('...')\r\n\t\t\t\t\tpages.push(total)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn pages\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Navigate to a specific page.\r\n\t\t * @param {number} page Target page number\r\n\t\t */\r\n\t\tchangePage(page) {\r\n\t\t\tif (page !== this.currentPage && page >= 1 && page <= this.totalPages) {\r\n\t\t\t\t/** @event page-changed Emitted when page changes. Payload: new page number. */\r\n\t\t\t\tthis.$emit('page-changed', page)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Change the page size.\r\n\t\t * @param {object} option Selected page size option { value, label }\r\n\t\t */\r\n\t\tchangePageSize(option) {\r\n\t\t\tif (option.value !== this.currentPageSize) {\r\n\t\t\t\t/** @event page-size-changed Emitted when page size changes. Payload: new page size. */\r\n\t\t\t\tthis.$emit('page-size-changed', option.value)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div class=\"cn-settings-card\" :class=\"{ 'cn-settings-card--collapsible': collapsible }\">\r\n\t\t<h4\r\n\t\t\tv-if=\"title\"\r\n\t\t\t:class=\"{ 'cn-settings-card__header--clickable': collapsible }\"\r\n\t\t\t@click=\"collapsible ? toggleCollapsed() : null\">\r\n\t\t\t<span>{{ icon }} {{ title }}</span>\r\n\t\t\t<ChevronDown\r\n\t\t\t\tv-if=\"collapsible && !isCollapsed\"\r\n\t\t\t\t:size=\"20\"\r\n\t\t\t\tclass=\"cn-settings-card__chevron\" />\r\n\t\t\t<ChevronUp\r\n\t\t\t\tv-if=\"collapsible && isCollapsed\"\r\n\t\t\t\t:size=\"20\"\r\n\t\t\t\tclass=\"cn-settings-card__chevron\" />\r\n\t\t</h4>\r\n\r\n\t\t<transition v-if=\"collapsible\" name=\"cn-slide-fade\">\r\n\t\t\t<div v-show=\"!isCollapsed\" class=\"cn-settings-card__content\">\r\n\t\t\t\t<slot />\r\n\t\t\t</div>\r\n\t\t</transition>\r\n\r\n\t\t<div v-else>\r\n\t\t\t<slot />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\r\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\r\n\r\n/**\r\n * CnSettingsCard — Collapsible card for settings and configuration sections.\r\n *\r\n * Extracted from OpenRegister's SettingsCard. Provides a titled card with\r\n * optional collapse/expand animation.\r\n *\r\n * @example\r\n * <CnSettingsCard title=\"Database Settings\" icon=\"🗄️\" collapsible>\r\n * <p>Content here</p>\r\n * </CnSettingsCard>\r\n */\r\nexport default {\r\n\tname: 'CnSettingsCard',\r\n\r\n\tcomponents: {\r\n\t\tChevronDown,\r\n\t\tChevronUp,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Card title text */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Icon emoji or text displayed before the title */\r\n\t\ticon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Whether the card can be collapsed */\r\n\t\tcollapsible: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether the card starts collapsed (only applies when collapsible) */\r\n\t\tdefaultCollapsed: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tisCollapsed: this.defaultCollapsed,\r\n\t\t}\r\n\t},\r\n\r\n\tmethods: {\r\n\t\ttoggleCollapsed() {\r\n\t\t\tif (this.collapsible) {\r\n\t\t\t\tthis.isCollapsed = !this.isCollapsed\r\n\t\t\t\t/** @event toggle Emitted when collapse state changes. Payload: isCollapsed boolean. */\r\n\t\t\t\tthis.$emit('toggle', this.isCollapsed)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<NcSettingsSection\r\n\t\t:name=\"name\"\r\n\t\t:description=\"description\"\r\n\t\t:doc-url=\"docUrl\"\r\n\t\tv-bind=\"$attrs\">\r\n\t\t<!-- Action buttons positioned top-right -->\r\n\t\t<div v-if=\"$slots.actions\" class=\"cn-settings-section__actions\">\r\n\t\t\t<slot name=\"actions\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Section Description (optional detailed description box) -->\r\n\t\t<div v-if=\"$slots.description || detailedDescription\" class=\"cn-settings-section__description\">\r\n\t\t\t<slot name=\"description\">\r\n\t\t\t\t<p v-if=\"detailedDescription\" class=\"cn-settings-section__description-text\">\r\n\t\t\t\t\t{{ detailedDescription }}\r\n\t\t\t\t</p>\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- Main Content -->\r\n\t\t<div class=\"cn-settings-section__content\">\r\n\t\t\t<slot />\r\n\t\t</div>\r\n\r\n\t\t<!-- Loading State -->\r\n\t\t<div v-if=\"loading\" class=\"cn-settings-section__loading\">\r\n\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t\t<p>{{ loadingMessage }}</p>\r\n\t\t</div>\r\n\r\n\t\t<!-- Error State -->\r\n\t\t<div v-if=\"error && !loading\" class=\"cn-settings-section__error\">\r\n\t\t\t<p class=\"cn-settings-section__error-message\">\r\n\t\t\t\t{{ errorMessage }}\r\n\t\t\t</p>\r\n\t\t\t<NcButton v-if=\"onRetry\" type=\"primary\" @click=\"onRetry\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<Refresh :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ retryButtonText }}\r\n\t\t\t</NcButton>\r\n\t\t</div>\r\n\r\n\t\t<!-- Empty State -->\r\n\t\t<div v-if=\"empty && !loading && !error\" class=\"cn-settings-section__empty\">\r\n\t\t\t<slot name=\"empty\">\r\n\t\t\t\t<div class=\"cn-settings-section__empty-content\">\r\n\t\t\t\t\t<InformationOutline :size=\"48\" />\r\n\t\t\t\t\t<p>{{ emptyMessage }}</p>\r\n\t\t\t\t</div>\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- Footer Actions -->\r\n\t\t<div v-if=\"$slots.footer\" class=\"cn-settings-section__footer\">\r\n\t\t\t<slot name=\"footer\" />\r\n\t\t</div>\r\n\t</NcSettingsSection>\r\n</template>\r\n\r\n<script>\r\nimport { NcSettingsSection, NcLoadingIcon, NcButton } from '@nextcloud/vue'\r\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\r\nimport InformationOutline from 'vue-material-design-icons/InformationOutline.vue'\r\n\r\n/**\r\n * CnSettingsSection - Admin settings section wrapper with consistent layout.\r\n *\r\n * Wraps NcSettingsSection with action buttons (top-right), loading/error/empty\r\n * states, and a footer slot. Use this as the container for each section on an\r\n * admin settings page.\r\n *\r\n * Extracted from OpenRegister's SettingsSection. Designed for reuse across all\r\n * Conduction Nextcloud apps.\r\n *\r\n * @example Basic usage\r\n * <CnSettingsSection name=\"Cache Management\" description=\"Manage application caches\">\r\n * <template #actions>\r\n * <NcButton @click=\"clearCache\">Clear Cache</NcButton>\r\n * </template>\r\n * <p>Cache hit rate: 94%</p>\r\n * </CnSettingsSection>\r\n *\r\n * @example With loading and error states\r\n * <CnSettingsSection\r\n * name=\"Statistics\"\r\n * :loading=\"isLoading\"\r\n * loading-message=\"Loading statistics...\"\r\n * :error=\"hasError\"\r\n * error-message=\"Failed to load statistics\"\r\n * :on-retry=\"loadStats\">\r\n * <StatsTable :data=\"stats\" />\r\n * </CnSettingsSection>\r\n *\r\n * @example With empty state\r\n * <CnSettingsSection name=\"API Tokens\" :empty=\"tokens.length === 0\" empty-message=\"No tokens configured\">\r\n * <TokenList :tokens=\"tokens\" />\r\n * </CnSettingsSection>\r\n */\r\nexport default {\r\n\tname: 'CnSettingsSection',\r\n\r\n\tcomponents: {\r\n\t\tNcSettingsSection,\r\n\t\tNcLoadingIcon,\r\n\t\tNcButton,\r\n\t\tRefresh,\r\n\t\tInformationOutline,\r\n\t},\r\n\r\n\tinheritAttrs: false,\r\n\r\n\tprops: {\r\n\t\t/** Section name/title */\r\n\t\tname: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Brief section description (shown under title by NcSettingsSection) */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Detailed description shown in a separate block below the title */\r\n\t\tdetailedDescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Documentation URL (shows info icon next to title) */\r\n\t\tdocUrl: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Whether the section is in a loading state */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Message shown during loading */\r\n\t\tloadingMessage: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Loading...',\r\n\t\t},\r\n\t\t/** Whether the section is in an error state */\r\n\t\terror: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Message shown when in error state */\r\n\t\terrorMessage: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'An error occurred',\r\n\t\t},\r\n\t\t/** Callback function for retry button (shown in error state). If null, no retry button is shown. */\r\n\t\tonRetry: {\r\n\t\t\ttype: Function,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Text for the retry button */\r\n\t\tretryButtonText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Retry',\r\n\t\t},\r\n\t\t/** Whether the section has no data to show */\r\n\t\tempty: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Message shown when section is empty */\r\n\t\temptyMessage: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No data available',\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-settings-section__actions {\r\n\tdisplay: flex;\r\n\tgap: 0.5rem;\r\n\talign-items: center;\r\n\tjustify-content: flex-end;\r\n\tfloat: right;\r\n\tmargin-top: -66px;\r\n\tmargin-bottom: 26px;\r\n\tposition: relative;\r\n\tz-index: 10;\r\n}\r\n\r\n.cn-settings-section__content {\r\n\tclear: both;\r\n}\r\n\r\n.cn-settings-section__description-text {\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n.cn-settings-section__loading {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tpadding: 40px 20px;\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-settings-section__loading p {\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-size: 14px;\r\n}\r\n\r\n.cn-settings-section__error {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tpadding: 32px 20px;\r\n\tgap: 16px;\r\n\tbackground: var(--color-error-light);\r\n\tborder: 1px solid var(--color-error);\r\n\tborder-radius: var(--border-radius-large);\r\n}\r\n\r\n.cn-settings-section__error-message {\r\n\tcolor: var(--color-error);\r\n\tfont-weight: 500;\r\n\tmargin: 0;\r\n}\r\n\r\n.cn-settings-section__empty {\r\n\tpadding: 40px 20px;\r\n}\r\n\r\n.cn-settings-section__empty-content {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tgap: 16px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-settings-section__empty-content p {\r\n\tmargin: 0;\r\n\tfont-size: 14px;\r\n}\r\n\r\n.cn-settings-section__footer {\r\n\tmargin-top: 24px;\r\n\tpadding-top: 24px;\r\n\tborder-top: 1px solid var(--color-border);\r\n}\r\n\r\n@media (max-width: 768px) {\r\n\t.cn-settings-section__actions {\r\n\t\tposition: static;\r\n\t\tmargin-top: 0;\r\n\t\tmargin-bottom: 1rem;\r\n\t\tfloat: none;\r\n\t\tflex-direction: column;\r\n\t\talign-items: stretch;\r\n\t}\r\n}\r\n</style>\r\n","<template>\r\n\t<component\r\n\t\t:is=\"clickable ? 'a' : 'div'\"\r\n\t\tclass=\"cn-stats-block\"\r\n\t\t:class=\"rootClasses\"\r\n\t\tv-bind=\"clickable ? { href: '#', role: 'button', tabindex: '0' } : {}\"\r\n\t\t@click=\"onClick\">\r\n\t\t<!-- Icon -->\r\n\t\t<div v-if=\"hasIcon\" class=\"cn-stats-block__icon\" :class=\"iconClasses\">\r\n\t\t\t<slot name=\"icon\">\r\n\t\t\t\t<component :is=\"icon\" v-if=\"icon\" :size=\"iconSize\" />\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- Content -->\r\n\t\t<div class=\"cn-stats-block__content\">\r\n\t\t\t<div class=\"cn-stats-block__header\">\r\n\t\t\t\t<h4>{{ title || 'Objects' }}</h4>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div v-if=\"count > 0\" class=\"cn-stats-block__count\">\r\n\t\t\t\t<span class=\"cn-stats-block__count-value\">{{ formattedCount }}</span>\r\n\t\t\t\t<span class=\"cn-stats-block__count-label\">{{ countLabel }}</span>\r\n\t\t\t</div>\r\n\t\t\t<div v-else-if=\"loading\" class=\"cn-stats-block__loading\">\r\n\t\t\t\t<NcLoadingIcon :size=\"16\" />\r\n\t\t\t\t{{ loadingLabel }}\r\n\t\t\t</div>\r\n\t\t\t<div v-else class=\"cn-stats-block__empty\">\r\n\t\t\t\t{{ emptyLabel }}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Breakdown details -->\r\n\t\t\t<div v-if=\"breakdown && count > 0\" class=\"cn-stats-block__breakdown\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"(value, key) in breakdown\"\r\n\t\t\t\t\t:key=\"key\"\r\n\t\t\t\t\tclass=\"cn-stats-block__breakdown-item\">\r\n\t\t\t\t\t<span class=\"cn-stats-block__breakdown-label\">{{ formatBreakdownLabel(key) }}</span>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\tclass=\"cn-stats-block__breakdown-value\"\r\n\t\t\t\t\t\t:class=\"'cn-stats-block__breakdown-value--' + key\">\r\n\t\t\t\t\t\t{{ value }}\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</component>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon } from '@nextcloud/vue'\r\n\r\n/**\r\n * CnStatsBlock — Statistics display card with icon, count, and optional breakdown.\r\n *\r\n * Supports vertical (default) and horizontal layouts, color variants, icons,\r\n * and clickable state. Use in a CnKpiGrid for responsive dashboard layouts.\r\n *\r\n * @example Basic vertical (default)\r\n * <CnStatsBlock title=\"Cases\" :count=\"42\" count-label=\"open cases\" />\r\n *\r\n * @example Horizontal with icon and variant\r\n * <CnStatsBlock\r\n * title=\"Open Cases\"\r\n * :count=\"42\"\r\n * :icon=\"BriefcaseOutline\"\r\n * variant=\"primary\"\r\n * horizontal\r\n * clickable\r\n * @click=\"goToCases\" />\r\n *\r\n * @example With breakdown\r\n * <CnStatsBlock\r\n * title=\"Cases\"\r\n * :count=\"42\"\r\n * :breakdown=\"{ total: 100, invalid: 3, deleted: 5, published: 92 }\" />\r\n *\r\n * @example Custom icon slot\r\n * <CnStatsBlock title=\"Files\" :count=\"128\">\r\n * <template #icon>\r\n * <FileDocumentOutline :size=\"24\" />\r\n * </template>\r\n * </CnStatsBlock>\r\n */\r\nexport default {\r\n\tname: 'CnStatsBlock',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Block title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** The main count number to display prominently */\r\n\t\tcount: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t},\r\n\t\t/** Label displayed next to the count */\r\n\t\tcountLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'objects',\r\n\t\t},\r\n\t\t/** Detailed breakdown object (key-value pairs) */\r\n\t\tbreakdown: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Whether data is currently loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Text shown while loading */\r\n\t\tloadingLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Loading...',\r\n\t\t},\r\n\t\t/** Text shown when count is 0 */\r\n\t\temptyLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items found',\r\n\t\t},\r\n\t\t/** Icon component (e.g., imported MDI icon) */\r\n\t\ticon: {\r\n\t\t\ttype: [Object, Function],\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Icon size in pixels */\r\n\t\ticonSize: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 24,\r\n\t\t},\r\n\t\t/** Color variant: 'default', 'primary', 'success', 'warning', 'error' */\r\n\t\tvariant: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'default',\r\n\t\t\tvalidator: (v) => ['default', 'primary', 'success', 'warning', 'error'].includes(v),\r\n\t\t},\r\n\t\t/** Use horizontal layout (icon left, content right) */\r\n\t\thorizontal: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether the card is clickable */\r\n\t\tclickable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\thasIcon() {\r\n\t\t\treturn this.icon !== null || this.$scopedSlots.icon || this.$slots.icon\r\n\t\t},\r\n\r\n\t\tformattedCount() {\r\n\t\t\treturn this.count.toLocaleString()\r\n\t\t},\r\n\r\n\t\trootClasses() {\r\n\t\t\treturn {\r\n\t\t\t\t'cn-stats-block--horizontal': this.horizontal,\r\n\t\t\t\t'cn-stats-block--clickable': this.clickable,\r\n\t\t\t\t[`cn-stats-block--${this.variant}`]: this.variant !== 'default',\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ticonClasses() {\r\n\t\t\treturn {\r\n\t\t\t\t[`cn-stats-block__icon--${this.variant}`]: this.variant !== 'default',\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tformatBreakdownLabel(key) {\r\n\t\t\treturn key.charAt(0).toUpperCase() + key.slice(1) + ':'\r\n\t\t},\r\n\r\n\t\tonClick(event) {\r\n\t\t\tif (this.clickable) {\r\n\t\t\t\tevent.preventDefault()\r\n\t\t\t\tthis.$emit('click', event)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-stats-block {\r\n\tbackground: var(--color-background-hover);\r\n\tborder-radius: var(--border-radius-large, 10px);\r\n\tpadding: 1rem;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\ttext-decoration: none;\r\n\tcolor: inherit;\r\n\tborder: 2px solid transparent;\r\n\ttransition: border-color 0.15s ease, box-shadow 0.15s ease;\r\n}\r\n\r\n.cn-stats-block--horizontal {\r\n\tflex-direction: row;\r\n\talign-items: flex-start;\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-stats-block--horizontal .cn-stats-block__content {\r\n\ttext-align: left;\r\n}\r\n\r\n.cn-stats-block--horizontal .cn-stats-block__count {\r\n\tjustify-content: flex-start;\r\n}\r\n\r\n.cn-stats-block--clickable {\r\n\tcursor: pointer;\r\n}\r\n\r\n.cn-stats-block--clickable:hover {\r\n\tborder-color: var(--color-primary-element);\r\n\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.cn-stats-block--clickable:focus-visible {\r\n\toutline: 2px solid var(--color-primary-element);\r\n\toutline-offset: 2px;\r\n}\r\n\r\n/* Icon */\r\n.cn-stats-block__icon {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\twidth: 44px;\r\n\theight: 44px;\r\n\tborder-radius: 50%;\r\n\tbackground: var(--color-primary-element-light, rgba(0, 130, 201, 0.1));\r\n\tcolor: var(--color-primary-element);\r\n\tflex-shrink: 0;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.cn-stats-block--horizontal .cn-stats-block__icon {\r\n\tmargin-bottom: 0;\r\n}\r\n\r\n.cn-stats-block__icon--primary {\r\n\tbackground: var(--color-primary-element-light, rgba(0, 130, 201, 0.1));\r\n\tcolor: var(--color-primary-element);\r\n}\r\n\r\n.cn-stats-block__icon--success {\r\n\tbackground: rgba(70, 186, 97, 0.1);\r\n\tcolor: var(--color-success);\r\n}\r\n\r\n.cn-stats-block__icon--warning {\r\n\tbackground: rgba(232, 163, 24, 0.1);\r\n\tcolor: var(--color-warning);\r\n}\r\n\r\n.cn-stats-block__icon--error {\r\n\tbackground: rgba(224, 36, 36, 0.1);\r\n\tcolor: var(--color-error);\r\n}\r\n\r\n/* Content */\r\n.cn-stats-block__content {\r\n\tflex: 1;\r\n\tmin-width: 0;\r\n\ttext-align: center;\r\n}\r\n\r\n.cn-stats-block__header h4 {\r\n\tmargin-top: 0;\r\n\tmargin-bottom: 0.5rem;\r\n\tcolor: var(--color-main-text);\r\n\tfont-size: 14px;\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-stats-block__count {\r\n\tdisplay: flex;\r\n\talign-items: baseline;\r\n\tjustify-content: center;\r\n\tgap: 0.5rem;\r\n\tfont-size: 1.2rem;\r\n\tmargin-bottom: 0.5rem;\r\n}\r\n\r\n.cn-stats-block__count-value {\r\n\tfont-size: 2rem;\r\n\tfont-weight: bold;\r\n\tcolor: var(--color-primary-element);\r\n}\r\n\r\n.cn-stats-block--primary .cn-stats-block__count-value { color: var(--color-primary-element); }\r\n.cn-stats-block--success .cn-stats-block__count-value { color: var(--color-success); }\r\n.cn-stats-block--warning .cn-stats-block__count-value { color: var(--color-warning); }\r\n.cn-stats-block--error .cn-stats-block__count-value { color: var(--color-error); }\r\n\r\n.cn-stats-block__count-label {\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-stats-block__loading {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 0.5rem;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tmargin-bottom: 0.5rem;\r\n}\r\n\r\n.cn-stats-block__empty {\r\n\ttext-align: center;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-style: italic;\r\n\tmargin-bottom: 0.5rem;\r\n}\r\n\r\n.cn-stats-block__breakdown {\r\n\tmargin-top: 0.5rem;\r\n\tpadding: 0.75rem;\r\n\tbackground: var(--color-background-hover);\r\n\tborder-radius: var(--border-radius);\r\n\tborder: 1px solid var(--color-border);\r\n\twidth: 100%;\r\n}\r\n\r\n.cn-stats-block__breakdown-item {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 0.5rem;\r\n}\r\n\r\n.cn-stats-block__breakdown-item:last-child {\r\n\tmargin-bottom: 0;\r\n}\r\n\r\n.cn-stats-block__breakdown-label {\r\n\tfont-weight: 500;\r\n\tcolor: var(--color-main-text);\r\n}\r\n\r\n.cn-stats-block__breakdown-value {\r\n\tfont-weight: 600;\r\n\tpadding: 0.25rem 0.5rem;\r\n\tborder-radius: var(--border-radius);\r\n\tbackground: var(--color-background-hover);\r\n}\r\n\r\n.cn-stats-block__breakdown-value--invalid { color: var(--color-warning); }\r\n.cn-stats-block__breakdown-value--deleted { color: var(--color-error); }\r\n.cn-stats-block__breakdown-value--published { color: var(--color-success); }\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-card\">\r\n\t\t<div class=\"cn-card-header\">\r\n\t\t\t<h3>\r\n\t\t\t\t<slot name=\"icon\" />\r\n\t\t\t\t{{ title }}\r\n\t\t\t</h3>\r\n\t\t\t<div class=\"cn-card-header__actions\">\r\n\t\t\t\t<slot name=\"actions\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Status badges -->\r\n\t\t<div v-if=\"$slots.status\" class=\"cn-config-card__status\">\r\n\t\t\t<slot name=\"status\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Main content -->\r\n\t\t<div class=\"cn-config-card__content\">\r\n\t\t\t<slot />\r\n\t\t</div>\r\n\r\n\t\t<!-- Footer -->\r\n\t\t<div v-if=\"$slots.footer\" class=\"cn-config-card__footer\">\r\n\t\t\t<slot name=\"footer\" />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * CnConfigurationCard — Configuration card with title, actions, status, and content.\r\n *\r\n * Decoupled from OpenRegister's ConfigurationCard. All data is provided via\r\n * props and slots — no store dependencies. Consumer wraps this and handles\r\n * navigation/store logic.\r\n *\r\n * @example\r\n * <CnConfigurationCard title=\"Database Configuration\">\r\n * <template #actions>\r\n * <NcActions><NcActionButton @click=\"edit\">Edit</NcActionButton></NcActions>\r\n * </template>\r\n * <template #status>\r\n * <CnStatusBadge label=\"Connected\" variant=\"success\" />\r\n * </template>\r\n * <p>PostgreSQL 15.2 on localhost:5432</p>\r\n * </CnConfigurationCard>\r\n */\r\nexport default {\r\n\tname: 'CnConfigurationCard',\r\n\r\n\tprops: {\r\n\t\t/** Card title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-config-card__status {\r\n\tdisplay: flex;\r\n\tgap: 8px;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.cn-config-card__content {\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.cn-config-card__footer {\r\n\tpadding-top: 12px;\r\n\tborder-top: 1px solid var(--color-border);\r\n}\r\n</style>\r\n","<template>\r\n\t<CnSettingsSection\r\n\t\t:name=\"title\"\r\n\t\t:description=\"description\"\r\n\t\t:doc-url=\"docUrl\"\r\n\t\t:loading=\"loading\"\r\n\t\tloading-message=\"Loading version information...\">\r\n\t\t<!-- Actions slot -->\r\n\t\t<template #actions>\r\n\t\t\t<!-- Update Button -->\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"showUpdateButton\"\r\n\t\t\t\t:type=\"updateButtonType\"\r\n\t\t\t\t:disabled=\"updateButtonDisabled\"\r\n\t\t\t\t@click=\"handleUpdateClick\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"updating\" :size=\"20\" />\r\n\t\t\t\t\t<Check v-else-if=\"isUpToDate\" :size=\"20\" />\r\n\t\t\t\t\t<Update v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ updateButtonText }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<!-- Additional Actions (slot) -->\r\n\t\t\t<slot name=\"actions\" />\r\n\t\t</template>\r\n\r\n\t\t<!-- Main content (only shown when not loading) -->\r\n\t\t<div v-if=\"!loading\" class=\"cn-version-info\">\r\n\t\t\t<!-- Version card with gray background -->\r\n\t\t\t<div class=\"cn-version-info__card\">\r\n\t\t\t\t<h4>{{ cardTitle }}</h4>\r\n\t\t\t\t<div class=\"cn-version-info__details\">\r\n\t\t\t\t\t<!-- Application Name -->\r\n\t\t\t\t\t<div class=\"cn-version-info__item\">\r\n\t\t\t\t\t\t<span class=\"cn-version-info__label\">{{ labels.appName }}:</span>\r\n\t\t\t\t\t\t<span class=\"cn-version-info__value\">{{ appName }}</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Version -->\r\n\t\t\t\t\t<div class=\"cn-version-info__item\">\r\n\t\t\t\t\t\t<span class=\"cn-version-info__label\">{{ labels.version }}:</span>\r\n\t\t\t\t\t\t<span class=\"cn-version-info__value\">{{ appVersion }}</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Configured Version (if provided) -->\r\n\t\t\t\t\t<div v-if=\"configuredVersion\" class=\"cn-version-info__item\">\r\n\t\t\t\t\t\t<span class=\"cn-version-info__label\">{{ labels.configuredVersion }}:</span>\r\n\t\t\t\t\t\t<span class=\"cn-version-info__value\">{{ configuredVersion }}</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Additional items -->\r\n\t\t\t\t\t<div v-for=\"item in additionalItems\" :key=\"item.label\" class=\"cn-version-info__item\">\r\n\t\t\t\t\t\t<span class=\"cn-version-info__label\">{{ item.label }}:</span>\r\n\t\t\t\t\t\t<span class=\"cn-version-info__value\" :class=\"item.statusClass\">{{ item.value }}</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Optional additional items slot -->\r\n\t\t\t\t\t<slot name=\"additional-items\" />\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Optional footer slot -->\r\n\t\t\t\t<slot name=\"footer\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Optional extra cards slot -->\r\n\t\t\t<slot name=\"extra-cards\" />\r\n\t\t</div>\r\n\t</CnSettingsSection>\r\n</template>\r\n\r\n<script>\r\nimport { CnSettingsSection } from '../CnSettingsSection/index.js'\r\nimport { NcLoadingIcon, NcButton } from '@nextcloud/vue'\r\nimport Check from 'vue-material-design-icons/Check.vue'\r\nimport Update from 'vue-material-design-icons/Update.vue'\r\n\r\n/**\r\n * CnVersionInfoCard - App version information card for admin settings pages.\r\n *\r\n * Displays application name, version, and optional configured version with an\r\n * update button. Wraps CnSettingsSection for consistent admin settings layout.\r\n *\r\n * Every Conduction Nextcloud app should show this as the first section on its\r\n * admin settings page.\r\n *\r\n * @example Basic usage\r\n * <CnVersionInfoCard app-name=\"Open Register\" app-version=\"0.2.3\" />\r\n *\r\n * @example With update button\r\n * <CnVersionInfoCard\r\n * app-name=\"Open Register\"\r\n * app-version=\"0.2.3\"\r\n * configured-version=\"0.2.2\"\r\n * :is-up-to-date=\"false\"\r\n * :show-update-button=\"true\"\r\n * :updating=\"isUpdating\"\r\n * @update=\"runUpdate\" />\r\n *\r\n * @example With additional items and actions\r\n * <CnVersionInfoCard\r\n * app-name=\"Pipelinq\"\r\n * app-version=\"0.1.7\"\r\n * :additional-items=\"[{ label: 'Database', value: 'Connected', statusClass: 'cn-version-info__status--ok' }]\">\r\n * <template #actions>\r\n * <NcButton @click=\"clearCache\">Clear App Store Cache</NcButton>\r\n * </template>\r\n * </CnVersionInfoCard>\r\n */\r\nexport default {\r\n\tname: 'CnVersionInfoCard',\r\n\r\n\tcomponents: {\r\n\t\tCnSettingsSection,\r\n\t\tNcLoadingIcon,\r\n\t\tNcButton,\r\n\t\tCheck,\r\n\t\tUpdate,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Section title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Version Information',\r\n\t\t},\r\n\t\t/** Section description */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Information about the current application installation',\r\n\t\t},\r\n\t\t/** Documentation URL (shows info icon next to title) */\r\n\t\tdocUrl: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Card heading text */\r\n\t\tcardTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Application Information',\r\n\t\t},\r\n\t\t/** Application name to display */\r\n\t\tappName: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Application version string */\r\n\t\tappVersion: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Configured version (optional, for apps that track configuration versions separately) */\r\n\t\tconfiguredVersion: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Whether the app configuration is up to date */\r\n\t\tisUpToDate: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the update button */\r\n\t\tshowUpdateButton: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether an update is currently in progress */\r\n\t\tupdating: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/**\r\n\t\t * Additional key-value items to display.\r\n\t\t * Format: [{ label: 'Label', value: 'Value', statusClass: 'cn-version-info__status--ok' }]\r\n\t\t */\r\n\t\tadditionalItems: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Whether version info is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Custom labels for the standard fields */\r\n\t\tlabels: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({\r\n\t\t\t\tappName: 'Application Name',\r\n\t\t\t\tversion: 'Version',\r\n\t\t\t\tconfiguredVersion: 'Configured Version',\r\n\t\t\t}),\r\n\t\t},\r\n\t},\r\n\r\n\temits: ['update'],\r\n\r\n\tcomputed: {\r\n\t\t/** @return {string} Button type based on update status */\r\n\t\tupdateButtonType() {\r\n\t\t\tif (this.isUpToDate) {\r\n\t\t\t\treturn 'success'\r\n\t\t\t}\r\n\t\t\treturn 'error'\r\n\t\t},\r\n\r\n\t\t/** @return {boolean} Whether the update button should be disabled */\r\n\t\tupdateButtonDisabled() {\r\n\t\t\treturn this.isUpToDate || this.updating\r\n\t\t},\r\n\r\n\t\t/** @return {string} Update button label text */\r\n\t\tupdateButtonText() {\r\n\t\t\tif (this.updating) {\r\n\t\t\t\treturn 'Updating...'\r\n\t\t\t}\r\n\t\t\tif (this.isUpToDate) {\r\n\t\t\t\treturn 'Up to date'\r\n\t\t\t}\r\n\t\t\treturn 'Update'\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\thandleUpdateClick() {\r\n\t\t\tif (!this.updateButtonDisabled) {\r\n\t\t\t\tthis.$emit('update')\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-version-info__card {\r\n\tbackground: var(--color-background-hover);\r\n\tborder: 1px solid var(--color-border);\r\n\tborder-radius: var(--border-radius-large);\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n}\r\n\r\n.cn-version-info__card h4 {\r\n\tmargin: 0 0 16px 0;\r\n\tfont-size: 16px;\r\n\tfont-weight: 600;\r\n\tcolor: var(--color-main-text);\r\n}\r\n\r\n.cn-version-info__details {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 12px;\r\n}\r\n\r\n.cn-version-info__item {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tpadding: 8px 0;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-version-info__item:last-child {\r\n\tborder-bottom: none;\r\n}\r\n\r\n.cn-version-info__label {\r\n\tfont-weight: 500;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-size: 14px;\r\n}\r\n\r\n.cn-version-info__value {\r\n\tfont-family: 'Courier New', Courier, monospace;\r\n\tfont-weight: 600;\r\n\tcolor: var(--color-main-text);\r\n\tfont-size: 14px;\r\n}\r\n\r\n/* Status classes for values */\r\n.cn-version-info__status--ok {\r\n\tcolor: var(--color-success);\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-version-info__status--warning {\r\n\tcolor: var(--color-warning);\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-version-info__status--error {\r\n\tcolor: var(--color-error);\r\n\tfont-weight: 600;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n\t.cn-version-info__item {\r\n\t\tflex-direction: column;\r\n\t\talign-items: flex-start;\r\n\t\tgap: 4px;\r\n\t}\r\n\r\n\t.cn-version-info__label {\r\n\t\tfont-weight: 600;\r\n\t}\r\n\r\n\t.cn-version-info__value {\r\n\t\tword-break: break-all;\r\n\t}\r\n}\r\n</style>\r\n","<template>\r\n\t<div\r\n\t\tclass=\"cn-object-card\"\r\n\t\t:class=\"{ 'cn-object-card--selected': selected }\"\r\n\t\t@click=\"$emit('click', object)\">\r\n\t\t<!-- Selection checkbox -->\r\n\t\t<div v-if=\"selectable\" class=\"cn-object-card__checkbox\" @click.stop>\r\n\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t:checked=\"selected\"\r\n\t\t\t\t@update:checked=\"$emit('select', object)\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Card content -->\r\n\t\t<div class=\"cn-object-card__content\">\r\n\t\t\t<!-- Header: image + title -->\r\n\t\t\t<div class=\"cn-object-card__header\">\r\n\t\t\t\t<img\r\n\t\t\t\t\tv-if=\"imageUrl\"\r\n\t\t\t\t\t:src=\"imageUrl\"\r\n\t\t\t\t\t:alt=\"title\"\r\n\t\t\t\t\tclass=\"cn-object-card__image\">\r\n\r\n\t\t\t\t<div class=\"cn-object-card__title-area\">\r\n\t\t\t\t\t<h3 class=\"cn-object-card__title\">{{ title }}</h3>\r\n\t\t\t\t\t<p v-if=\"description\" class=\"cn-object-card__description\">\r\n\t\t\t\t\t\t{{ truncatedDescription }}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Badges slot -->\r\n\t\t\t<div v-if=\"$scopedSlots.badges\" class=\"cn-object-card__badges\">\r\n\t\t\t\t<slot name=\"badges\" :object=\"object\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Metadata: visible properties as label:value pairs -->\r\n\t\t\t<div v-if=\"metadataFields.length > 0\" class=\"cn-object-card__metadata\">\r\n\t\t\t\t<slot name=\"metadata\" :object=\"object\" :fields=\"metadataFields\">\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tv-for=\"field in metadataFields\"\r\n\t\t\t\t\t\t:key=\"field.key\"\r\n\t\t\t\t\t\tclass=\"cn-object-card__meta-item\">\r\n\t\t\t\t\t\t<span class=\"cn-object-card__meta-label\">{{ field.label }}</span>\r\n\t\t\t\t\t\t<CnCellRenderer\r\n\t\t\t\t\t\t\t:value=\"field.value\"\r\n\t\t\t\t\t\t\t:property=\"field.property\"\r\n\t\t\t\t\t\t\t:truncate=\"60\" />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</slot>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Actions slot -->\r\n\t\t<div v-if=\"$scopedSlots.actions\" class=\"cn-object-card__actions\" @click.stop>\r\n\t\t\t<slot name=\"actions\" :object=\"object\" />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport { CnCellRenderer } from '../CnCellRenderer/index.js'\r\nimport { formatValue } from '../../utils/schema.js'\r\n\r\n/**\r\n * CnObjectCard — Schema-configuration-driven card for object display.\r\n *\r\n * Uses `schema.configuration` to determine which fields map to the card title,\r\n * description, and image. Remaining visible properties are shown as metadata.\r\n *\r\n * @example\r\n * <CnObjectCard :object=\"publication\" :schema=\"pubSchema\">\r\n * <template #actions=\"{ object }\">\r\n * <NcActions><NcActionButton @click=\"edit(object)\">Edit</NcActionButton></NcActions>\r\n * </template>\r\n * </CnObjectCard>\r\n */\r\nexport default {\r\n\tname: 'CnObjectCard',\r\n\r\n\tcomponents: {\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tCnCellRenderer,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** The object data */\r\n\t\tobject: {\r\n\t\t\ttype: Object,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Schema definition with properties and configuration */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Whether this card is selected */\r\n\t\tselected: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether to show selection checkbox */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Maximum number of metadata fields to show */\r\n\t\tmaxMetadata: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 4,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tconfig() {\r\n\t\t\treturn this.schema?.configuration || {}\r\n\t\t},\r\n\r\n\t\ttitle() {\r\n\t\t\tconst field = this.config.objectNameField\r\n\t\t\tif (field && this.object[field]) {\r\n\t\t\t\treturn String(this.object[field])\r\n\t\t\t}\r\n\t\t\treturn this.object.title || this.object.name || this.object.id || '—'\r\n\t\t},\r\n\r\n\t\tdescription() {\r\n\t\t\tconst field = this.config.objectDescriptionField\r\n\t\t\tif (field && this.object[field]) {\r\n\t\t\t\treturn String(this.object[field])\r\n\t\t\t}\r\n\t\t\treturn null\r\n\t\t},\r\n\r\n\t\ttruncatedDescription() {\r\n\t\t\tif (!this.description) return null\r\n\t\t\tif (this.description.length > 120) {\r\n\t\t\t\treturn this.description.substring(0, 120) + '...'\r\n\t\t\t}\r\n\t\t\treturn this.description\r\n\t\t},\r\n\r\n\t\timageUrl() {\r\n\t\t\tconst field = this.config.objectImageField\r\n\t\t\tif (field && this.object[field]) {\r\n\t\t\t\treturn this.object[field]\r\n\t\t\t}\r\n\t\t\treturn null\r\n\t\t},\r\n\r\n\t\t/** Fields excluded from metadata (already shown as title/desc/image) */\r\n\t\tconfigFields() {\r\n\t\t\treturn [\r\n\t\t\t\tthis.config.objectNameField,\r\n\t\t\t\tthis.config.objectDescriptionField,\r\n\t\t\t\tthis.config.objectSummaryField,\r\n\t\t\t\tthis.config.objectImageField,\r\n\t\t\t].filter(Boolean)\r\n\t\t},\r\n\r\n\t\t/** Remaining visible properties for the metadata section */\r\n\t\tmetadataFields() {\r\n\t\t\tif (!this.schema?.properties) return []\r\n\r\n\t\t\treturn Object.entries(this.schema.properties)\r\n\t\t\t\t.filter(([key, prop]) => {\r\n\t\t\t\t\tif (this.configFields.includes(key)) return false\r\n\t\t\t\t\tif (prop.visible === false) return false\r\n\t\t\t\t\tif (prop.type === 'object') return false\r\n\t\t\t\t\tif (prop.format === 'markdown') return false\r\n\t\t\t\t\treturn true\r\n\t\t\t\t})\r\n\t\t\t\t.sort(([, a], [, b]) => {\r\n\t\t\t\t\tconst orderA = typeof a.order === 'number' ? a.order : Infinity\r\n\t\t\t\t\tconst orderB = typeof b.order === 'number' ? b.order : Infinity\r\n\t\t\t\t\treturn orderA - orderB\r\n\t\t\t\t})\r\n\t\t\t\t.slice(0, this.maxMetadata)\r\n\t\t\t\t.map(([key, prop]) => ({\r\n\t\t\t\t\tkey,\r\n\t\t\t\t\tlabel: prop.title || key,\r\n\t\t\t\t\tvalue: this.object[key],\r\n\t\t\t\t\tproperty: prop,\r\n\t\t\t\t}))\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tformatValue,\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-object-card {\r\n\tdisplay: flex;\r\n\tgap: 12px;\r\n\tpadding: 16px;\r\n\tbackground: var(--color-main-background);\r\n\tborder: 1px solid var(--color-border);\r\n\tborder-radius: var(--border-radius-large, 10px);\r\n\tcursor: pointer;\r\n\ttransition: box-shadow 0.2s ease, border-color 0.2s ease;\r\n}\r\n\r\n.cn-object-card:hover {\r\n\tborder-color: var(--color-primary-element);\r\n\tbox-shadow: 0 2px 8px var(--color-box-shadow);\r\n}\r\n\r\n.cn-object-card--selected {\r\n\tborder-color: var(--color-primary-element);\r\n\tbackground: var(--color-primary-element-light);\r\n}\r\n\r\n.cn-object-card__checkbox {\r\n\tflex-shrink: 0;\r\n\tpadding-top: 2px;\r\n}\r\n\r\n.cn-object-card__content {\r\n\tflex: 1;\r\n\tmin-width: 0;\r\n}\r\n\r\n.cn-object-card__header {\r\n\tdisplay: flex;\r\n\tgap: 12px;\r\n\talign-items: flex-start;\r\n}\r\n\r\n.cn-object-card__image {\r\n\twidth: 48px;\r\n\theight: 48px;\r\n\tborder-radius: var(--border-radius);\r\n\tobject-fit: cover;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.cn-object-card__title-area {\r\n\tflex: 1;\r\n\tmin-width: 0;\r\n}\r\n\r\n.cn-object-card__title {\r\n\tmargin: 0;\r\n\tfont-size: 16px;\r\n\tfont-weight: 600;\r\n\tline-height: 1.3;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-object-card__description {\r\n\tmargin: 4px 0 0;\r\n\tfont-size: 13px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tline-height: 1.4;\r\n}\r\n\r\n.cn-object-card__badges {\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.cn-object-card__metadata {\r\n\tdisplay: grid;\r\n\tgrid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\r\n\tgap: 8px;\r\n\tmargin-top: 12px;\r\n\tpadding-top: 12px;\r\n\tborder-top: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-object-card__meta-item {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 2px;\r\n}\r\n\r\n.cn-object-card__meta-label {\r\n\tfont-size: 11px;\r\n\tfont-weight: 500;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\ttext-transform: uppercase;\r\n\tletter-spacing: 0.3px;\r\n}\r\n\r\n.cn-object-card__actions {\r\n\tflex-shrink: 0;\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-card-grid\">\r\n\t\t<!-- Loading state -->\r\n\t\t<div v-if=\"loading\" class=\"cn-card-grid__loading\">\r\n\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Empty state -->\r\n\t\t<div v-else-if=\"objects.length === 0\" class=\"cn-card-grid__empty\">\r\n\t\t\t<slot name=\"empty\">\r\n\t\t\t\t<NcEmptyContent :name=\"emptyText\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<ViewGrid :size=\"64\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</NcEmptyContent>\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- Card grid -->\r\n\t\t<div v-else class=\"cn-card-grid__grid\">\r\n\t\t\t<slot\r\n\t\t\t\tv-for=\"object in objects\"\r\n\t\t\t\tname=\"card\"\r\n\t\t\t\t:object=\"object\"\r\n\t\t\t\t:selected=\"isSelected(object)\"\r\n\t\t\t\t:schema=\"schema\">\r\n\t\t\t\t<CnObjectCard\r\n\t\t\t\t\t:key=\"object[rowKey]\"\r\n\t\t\t\t\t:object=\"object\"\r\n\t\t\t\t\t:schema=\"schema\"\r\n\t\t\t\t\t:selectable=\"selectable\"\r\n\t\t\t\t\t:selected=\"isSelected(object)\"\r\n\t\t\t\t\t@click=\"$emit('click', object)\"\r\n\t\t\t\t\t@select=\"toggleSelect(object)\">\r\n\t\t\t\t\t<template v-if=\"$scopedSlots['card-actions']\" #actions=\"{ object: obj }\">\r\n\t\t\t\t\t\t<slot name=\"card-actions\" :object=\"obj\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-if=\"$scopedSlots['card-badges']\" #badges=\"{ object: obj }\">\r\n\t\t\t\t\t\t<slot name=\"card-badges\" :object=\"obj\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</CnObjectCard>\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon, NcEmptyContent } from '@nextcloud/vue'\r\nimport ViewGrid from 'vue-material-design-icons/ViewGrid.vue'\r\nimport { CnObjectCard } from '../CnObjectCard/index.js'\r\n\r\n/**\r\n * CnCardGrid — Responsive grid container for CnObjectCard instances.\r\n *\r\n * Displays objects in a responsive CSS grid layout using schema-driven cards.\r\n * Supports selection, loading/empty states, and custom card rendering via slots.\r\n *\r\n * @example\r\n * <CnCardGrid\r\n * :objects=\"publications\"\r\n * :schema=\"pubSchema\"\r\n * :selectable=\"true\"\r\n * :selected-ids=\"selectedIds\"\r\n * @click=\"openPublication\"\r\n * @select=\"onSelect\">\r\n * <template #card-actions=\"{ object }\">\r\n * <NcActions><NcActionButton>Edit</NcActionButton></NcActions>\r\n * </template>\r\n * </CnCardGrid>\r\n */\r\nexport default {\r\n\tname: 'CnCardGrid',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t\tNcEmptyContent,\r\n\t\tViewGrid,\r\n\t\tCnObjectCard,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Array of objects to display as cards */\r\n\t\tobjects: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Schema definition (passed through to CnObjectCard) */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Whether data is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether cards can be selected */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Array of currently selected object IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Property name used as unique identifier */\r\n\t\trowKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'id',\r\n\t\t},\r\n\t\t/** Text shown when there are no objects */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items found',\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tisSelected(object) {\r\n\t\t\treturn this.selectedIds.includes(object[this.rowKey])\r\n\t\t},\r\n\r\n\t\ttoggleSelect(object) {\r\n\t\t\tconst id = object[this.rowKey]\r\n\t\t\tconst newIds = this.isSelected(object)\r\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\r\n\t\t\t\t: [...this.selectedIds, id]\r\n\t\t\tthis.$emit('select', newIds)\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-card-grid__grid {\r\n\tdisplay: grid;\r\n\tgrid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-card-grid__loading {\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\tpadding: 40px;\r\n}\r\n\r\n.cn-card-grid__empty {\r\n\tpadding: 40px 20px;\r\n\ttext-align: center;\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-facet-sidebar\">\r\n\t\t<div class=\"cn-facet-sidebar__header\">\r\n\t\t\t<h3 class=\"cn-facet-sidebar__title\">{{ title }}</h3>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"hasActiveFilters\"\r\n\t\t\t\ttype=\"tertiary\"\r\n\t\t\t\tclass=\"cn-facet-sidebar__clear\"\r\n\t\t\t\t@click=\"$emit('clear-all')\">\r\n\t\t\t\t{{ clearLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</div>\r\n\r\n\t\t<!-- Loading state -->\r\n\t\t<div v-if=\"loading\" class=\"cn-facet-sidebar__loading\">\r\n\t\t\t<NcLoadingIcon :size=\"20\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Filter groups -->\r\n\t\t<div v-else class=\"cn-facet-sidebar__filters\">\r\n\t\t\t<div\r\n\t\t\t\tv-for=\"filter in effectiveFilters\"\r\n\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\tclass=\"cn-facet-sidebar__group\">\r\n\t\t\t\t<label class=\"cn-facet-sidebar__label\">{{ filter.label }}</label>\r\n\r\n\t\t\t\t<!-- Checkbox filter (boolean) -->\r\n\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\tv-if=\"filter.type === 'checkbox'\"\r\n\t\t\t\t\t:checked=\"getFilterValue(filter.key) === true\"\r\n\t\t\t\t\t@update:checked=\"onFilterChange(filter.key, $event)\">\r\n\t\t\t\t\t{{ filter.label }}\r\n\t\t\t\t</NcCheckboxRadioSwitch>\r\n\r\n\t\t\t\t<!-- Select filter (enum / facet values) -->\r\n\t\t\t\t<NcSelect\r\n\t\t\t\t\tv-else-if=\"filter.type === 'select'\"\r\n\t\t\t\t\tclass=\"cn-facet-sidebar__select\"\r\n\t\t\t\t\t:value=\"getSelectedOptions(filter)\"\r\n\t\t\t\t\t:options=\"getFilterOptions(filter)\"\r\n\t\t\t\t\t:placeholder=\"filter.label\"\r\n\t\t\t\t\t:input-label=\"filter.label\"\r\n\t\t\t\t\t:multiple=\"true\"\r\n\t\t\t\t\t:clearable=\"true\"\r\n\t\t\t\t\t@input=\"onSelectChange(filter.key, $event)\" />\r\n\r\n\t\t\t\t<!-- Text filter (fallback) -->\r\n\t\t\t\t<NcTextField\r\n\t\t\t\t\tv-else\r\n\t\t\t\t\t:value=\"getFilterValue(filter.key) || ''\"\r\n\t\t\t\t\t:placeholder=\"filter.label\"\r\n\t\t\t\t\t:label=\"filter.label\"\r\n\t\t\t\t\t@update:value=\"onFilterChange(filter.key, $event)\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcButton, NcSelect, NcTextField, NcCheckboxRadioSwitch, NcLoadingIcon } from '@nextcloud/vue'\r\nimport { filtersFromSchema } from '../../utils/schema.js'\r\n\r\n/**\r\n * CnFacetSidebar — Auto-generated faceted search sidebar from schema properties.\r\n *\r\n * Reads properties marked `facetable: true` in the schema and generates\r\n * appropriate filter widgets. Accepts live facet data from the API for\r\n * dynamic option values with counts.\r\n *\r\n * @example\r\n * <CnFacetSidebar\r\n * :schema=\"schema\"\r\n * :facet-data=\"facetData\"\r\n * :active-filters=\"filters\"\r\n * @filter-change=\"onFilterChange\"\r\n * @clear-all=\"clearFilters\" />\r\n */\r\nexport default {\r\n\tname: 'CnFacetSidebar',\r\n\r\n\tcomponents: {\r\n\t\tNcButton,\r\n\t\tNcSelect,\r\n\t\tNcTextField,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tNcLoadingIcon,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Schema definition — reads facetable properties */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Live facet data from API: { fieldName: { values: [{value, count}] } } */\r\n\t\tfacetData: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Current active filters: { fieldName: value | [values] } */\r\n\t\tactiveFilters: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Whether facet data is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Sidebar title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Filters',\r\n\t\t},\r\n\t\t/** Clear all button label */\r\n\t\tclearLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Clear all',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\teffectiveFilters() {\r\n\t\t\treturn filtersFromSchema(this.schema)\r\n\t\t},\r\n\r\n\t\thasActiveFilters() {\r\n\t\t\treturn Object.values(this.activeFilters).some((v) => {\r\n\t\t\t\tif (Array.isArray(v)) return v.length > 0\r\n\t\t\t\treturn v !== null && v !== undefined && v !== '' && v !== false\r\n\t\t\t})\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tgetFilterValue(key) {\r\n\t\t\treturn this.activeFilters[key] ?? null\r\n\t\t},\r\n\r\n\t\tgetFilterOptions(filter) {\r\n\t\t\t// Use facet data if available (live values with counts)\r\n\t\t\tconst facet = this.facetData[filter.key]\r\n\t\t\tif (facet?.values?.length > 0) {\r\n\t\t\t\treturn facet.values.map((v) => ({\r\n\t\t\t\t\tid: v.value,\r\n\t\t\t\t\tlabel: v.count !== undefined ? `${v.value} (${v.count})` : String(v.value),\r\n\t\t\t\t}))\r\n\t\t\t}\r\n\t\t\t// Fall back to static enum options from schema\r\n\t\t\treturn filter.options || []\r\n\t\t},\r\n\r\n\t\tgetSelectedOptions(filter) {\r\n\t\t\tconst value = this.getFilterValue(filter.key)\r\n\t\t\tif (!value) return []\r\n\t\t\tconst values = Array.isArray(value) ? value : [value]\r\n\t\t\tconst options = this.getFilterOptions(filter)\r\n\t\t\treturn values.map((v) => options.find((o) => o.id === v) || { id: v, label: String(v) })\r\n\t\t},\r\n\r\n\t\tonSelectChange(key, selected) {\r\n\t\t\tconst values = selected ? selected.map((o) => o.id) : []\r\n\t\t\tthis.$emit('filter-change', { key, values })\r\n\t\t},\r\n\r\n\t\tonFilterChange(key, value) {\r\n\t\t\tthis.$emit('filter-change', { key, values: value })\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-facet-sidebar {\r\n\tpadding: 16px;\r\n\tborder-right: 1px solid var(--color-border);\r\n\tmin-width: 240px;\r\n\tmax-width: 300px;\r\n}\r\n\r\n.cn-facet-sidebar__header {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n.cn-facet-sidebar__title {\r\n\tmargin: 0;\r\n\tfont-size: 15px;\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-facet-sidebar__loading {\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\tpadding: 20px;\r\n}\r\n\r\n.cn-facet-sidebar__filters {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-facet-sidebar__group {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 4px;\r\n}\r\n\r\n.cn-facet-sidebar__label {\r\n\tfont-size: 12px;\r\n\tfont-weight: 500;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\ttext-transform: uppercase;\r\n\tletter-spacing: 0.3px;\r\n}\r\n\r\n.cn-facet-sidebar__select {\r\n\twidth: 100%;\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-view-mode-toggle\" role=\"group\" :aria-label=\"ariaLabel\">\r\n\t\t<NcButton\r\n\t\t\t:type=\"value === 'cards' ? 'primary' : 'secondary'\"\r\n\t\t\t:aria-pressed=\"String(value === 'cards')\"\r\n\t\t\t@click=\"$emit('input', 'cards')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<ViewGrid :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ cardsLabel }}\r\n\t\t</NcButton>\r\n\t\t<NcButton\r\n\t\t\t:type=\"value === 'table' ? 'primary' : 'secondary'\"\r\n\t\t\t:aria-pressed=\"String(value === 'table')\"\r\n\t\t\t@click=\"$emit('input', 'table')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<ViewList :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ tableLabel }}\r\n\t\t</NcButton>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcButton } from '@nextcloud/vue'\r\nimport ViewGrid from 'vue-material-design-icons/ViewGrid.vue'\r\nimport ViewList from 'vue-material-design-icons/ViewList.vue'\r\n\r\n/**\r\n * CnViewModeToggle — Cards/Table view mode toggle.\r\n *\r\n * @example\r\n * <CnViewModeToggle v-model=\"viewMode\" />\r\n */\r\nexport default {\r\n\tname: 'CnViewModeToggle',\r\n\r\n\tcomponents: {\r\n\t\tNcButton,\r\n\t\tViewGrid,\r\n\t\tViewList,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Current view mode: 'cards' or 'table' */\r\n\t\tvalue: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'table',\r\n\t\t\tvalidator: (v) => ['cards', 'table'].includes(v),\r\n\t\t},\r\n\t\t/** Label for cards button */\r\n\t\tcardsLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Cards',\r\n\t\t},\r\n\t\t/** Label for table button */\r\n\t\ttableLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Table',\r\n\t\t},\r\n\t\t/** Aria label for the toggle group */\r\n\t\tariaLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'View mode',\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-view-mode-toggle {\r\n\tdisplay: inline-flex;\r\n\tgap: 0;\r\n\tborder-radius: var(--border-radius-pill, 20px);\r\n\toverflow: hidden;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcActions :force-menu=\"actions.length > 3\">\r\n\t\t<NcActionButton\r\n\t\t\tv-for=\"action in actions\"\r\n\t\t\t:key=\"action.label\"\r\n\t\t\t:disabled=\"action.disabled\"\r\n\t\t\t:class=\"{ 'cn-row-action--destructive': action.destructive }\"\r\n\t\t\t@click=\"onAction(action)\">\r\n\t\t\t<template v-if=\"action.icon\" #icon>\r\n\t\t\t\t<component :is=\"action.icon\" :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ action.label }}\r\n\t\t</NcActionButton>\r\n\t</NcActions>\r\n</template>\r\n\r\n<script>\r\nimport { NcActions, NcActionButton } from '@nextcloud/vue'\r\n\r\n/**\r\n * CnRowActions — Action menu wrapper for table rows and cards.\r\n *\r\n * Wraps NcActions + NcActionButton for consistent row/card action menus.\r\n * Actions are defined as an array of objects with label, icon, handler, etc.\r\n *\r\n * @example\r\n * <CnRowActions\r\n * :actions=\"[\r\n * { label: 'Edit', icon: PencilIcon, handler: (row) => editRow(row) },\r\n * { label: 'Delete', icon: TrashIcon, handler: (row) => deleteRow(row), destructive: true },\r\n * ]\"\r\n * :row=\"row\" />\r\n */\r\nexport default {\r\n\tname: 'CnRowActions',\r\n\r\n\tcomponents: {\r\n\t\tNcActions,\r\n\t\tNcActionButton,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/**\r\n\t\t * Action definitions.\r\n\t\t * @type {Array<{label: string, icon?: Component, handler: Function, disabled?: boolean, destructive?: boolean}>}\r\n\t\t */\r\n\t\tactions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** The row/object data (passed to action handlers) */\r\n\t\trow: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tonAction(action) {\r\n\t\t\tif (action.handler && typeof action.handler === 'function') {\r\n\t\t\t\taction.handler(this.row)\r\n\t\t\t}\r\n\t\t\tthis.$emit('action', { action: action.label, row: this.row })\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-row-action--destructive {\r\n\tcolor: var(--color-error) !important;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcActions\r\n\t\tv-if=\"count > 0\"\r\n\t\t:menu-name=\"menuLabel\"\r\n\t\t:inline=\"0\">\r\n\t\t<template #icon>\r\n\t\t\t<TuneVariant :size=\"20\" />\r\n\t\t</template>\r\n\r\n\t\t<!-- Built-in: Import -->\r\n\t\t<NcActionButton\r\n\t\t\tv-if=\"showImport\"\r\n\t\t\t@click=\"$emit('mass-import')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<Import :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ importLabel }}\r\n\t\t</NcActionButton>\r\n\r\n\t\t<!-- Built-in: Export -->\r\n\t\t<NcActionButton\r\n\t\t\tv-if=\"showExport\"\r\n\t\t\t@click=\"$emit('mass-export')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<Export :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ exportLabel }}\r\n\t\t</NcActionButton>\r\n\r\n\t\t<!-- Built-in: Copy -->\r\n\t\t<NcActionButton\r\n\t\t\tv-if=\"showCopy\"\r\n\t\t\t@click=\"$emit('mass-copy')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<ContentCopy :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ copyLabel }}\r\n\t\t</NcActionButton>\r\n\r\n\t\t<!-- Built-in: Delete -->\r\n\t\t<NcActionButton\r\n\t\t\tv-if=\"showDelete\"\r\n\t\t\t@click=\"$emit('mass-delete')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<TrashCanOutline :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ deleteLabel }}\r\n\t\t</NcActionButton>\r\n\r\n\t\t<!-- Custom actions slot -->\r\n\t\t<slot name=\"actions\" :count=\"count\" :selected-ids=\"selectedIds\" />\r\n\t</NcActions>\r\n</template>\r\n\r\n<script>\r\nimport { NcActions, NcActionButton } from '@nextcloud/vue'\r\nimport TuneVariant from 'vue-material-design-icons/TuneVariant.vue'\r\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\r\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\r\nimport Import from 'vue-material-design-icons/Import.vue'\r\nimport Export from 'vue-material-design-icons/Export.vue'\r\n\r\n/**\r\n * CnMassActionBar — Mass action dropdown button for selected items.\r\n *\r\n * Renders as a single \"Mass Actions (N)\" dropdown button with built-in\r\n * Import, Export, Copy, and Delete actions plus a slot for custom actions.\r\n * Place this in the header/action bar of your index page.\r\n *\r\n * ## Adding Custom Mass Actions\r\n *\r\n * Use the `#actions` scoped slot to add app-specific mass actions.\r\n * Slot content should use `NcActionButton` components:\r\n *\r\n * ```vue\r\n * <CnMassActionBar :selected-ids=\"selectedIds\" :count=\"selectedIds.length\">\r\n * <template #actions=\"{ count, selectedIds }\">\r\n * <NcActionButton @click=\"migrateSelected(selectedIds)\">\r\n * <template #icon><SwapHorizontal :size=\"20\" /></template>\r\n * Migrate\r\n * </NcActionButton>\r\n * <NcActionButton @click=\"publishSelected(selectedIds)\">\r\n * <template #icon><Publish :size=\"20\" /></template>\r\n * Publish\r\n * </NcActionButton>\r\n * </template>\r\n * </CnMassActionBar>\r\n * ```\r\n *\r\n * @example Basic usage\r\n * <CnMassActionBar\r\n * :selected-ids=\"selectedIds\"\r\n * :count=\"selectedIds.length\"\r\n * @mass-copy=\"openCopyDialog\"\r\n * @mass-delete=\"openDeleteDialog\"\r\n * @mass-import=\"openImportDialog\"\r\n * @mass-export=\"openExportDialog\" />\r\n */\r\nexport default {\r\n\tname: 'CnMassActionBar',\r\n\r\n\tcomponents: {\r\n\t\tNcActions,\r\n\t\tNcActionButton,\r\n\t\tTuneVariant,\r\n\t\tContentCopy,\r\n\t\tTrashCanOutline,\r\n\t\tImport,\r\n\t\tExport,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Array of selected item IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Number of selected items */\r\n\t\tcount: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t},\r\n\t\t/** Whether to show the built-in Import action */\r\n\t\tshowImport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in Export action */\r\n\t\tshowExport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in Copy action */\r\n\t\tshowCopy: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in Delete action */\r\n\t\tshowDelete: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Label template for the menu button. Use {count} for the count. */\r\n\t\tmenuLabelTemplate: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Mass Actions ({count})',\r\n\t\t},\r\n\t\timportLabel: { type: String, default: 'Import' },\r\n\t\texportLabel: { type: String, default: 'Export' },\r\n\t\tcopyLabel: { type: String, default: 'Copy' },\r\n\t\tdeleteLabel: { type: String, default: 'Delete' },\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tmenuLabel() {\r\n\t\t\treturn this.menuLabelTemplate.replace('{count}', String(this.count))\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<NcDialog\r\n\t\t:name=\"dialogTitle\"\r\n\t\tsize=\"normal\"\r\n\t\t:can-close=\"!loading\"\r\n\t\t@closing=\"$emit('close')\">\r\n\t\t<!-- Review phase -->\r\n\t\t<div v-if=\"result === null\" class=\"cn-mass-delete__review\">\r\n\t\t\t<NcNoteCard type=\"warning\">\r\n\t\t\t\t{{ warningText }}\r\n\t\t\t</NcNoteCard>\r\n\r\n\t\t\t<div class=\"cn-mass-delete__list\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"item in localItems\"\r\n\t\t\t\t\t:key=\"item.id\"\r\n\t\t\t\t\tclass=\"cn-mass-delete__item\">\r\n\t\t\t\t\t<span class=\"cn-mass-delete__item-name\">\r\n\t\t\t\t\t\t{{ getItemName(item) }}\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<NcButton\r\n\t\t\t\t\t\ttype=\"tertiary\"\r\n\t\t\t\t\t\t:aria-label=\"removeLabel\"\r\n\t\t\t\t\t\t@click=\"removeItem(item.id)\">\r\n\t\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t\t<Close :size=\"16\" />\r\n\t\t\t\t\t\t</template>\r\n\t\t\t\t\t</NcButton>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<p v-if=\"localItems.length === 0\" class=\"cn-mass-delete__empty\">\r\n\t\t\t\t{{ emptyText }}\r\n\t\t\t</p>\r\n\t\t</div>\r\n\r\n\t\t<!-- Result phase -->\r\n\t\t<div v-else class=\"cn-mass-delete__result\">\r\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\r\n\t\t\t\t{{ successText }}\r\n\t\t\t</NcNoteCard>\r\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\r\n\t\t\t\t{{ result.error }}\r\n\t\t\t</NcNoteCard>\r\n\t\t</div>\r\n\r\n\t\t<template #actions>\r\n\t\t\t<NcButton @click=\"$emit('close')\">\r\n\t\t\t\t{{ result === null ? cancelLabel : closeLabel }}\r\n\t\t\t</NcButton>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"result === null\"\r\n\t\t\t\ttype=\"error\"\r\n\t\t\t\t:disabled=\"loading || localItems.length === 0\"\r\n\t\t\t\t@click=\"executeDelete\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\r\n\t\t\t\t\t<TrashCanOutline v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ confirmLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</template>\r\n\t</NcDialog>\r\n</template>\r\n\r\n<script>\r\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon } from '@nextcloud/vue'\r\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\r\nimport Close from 'vue-material-design-icons/Close.vue'\r\n\r\n/**\r\n * CnMassDeleteDialog — Two-phase mass delete confirmation dialog.\r\n *\r\n * Phase 1 (review): Shows the items to be deleted with the ability to remove\r\n * individual items before confirming. Phase 2 (result): Shows success or error.\r\n *\r\n * The dialog does NOT perform the delete itself — it emits a `confirm` event\r\n * with the item IDs. The parent component performs the actual API call and\r\n * calls `setResult()` via a ref.\r\n *\r\n * @example\r\n * <CnMassDeleteDialog\r\n * v-if=\"showDeleteDialog\"\r\n * :items=\"selectedObjects\"\r\n * :name-field=\"'title'\"\r\n * @confirm=\"onDeleteConfirm\"\r\n * @close=\"showDeleteDialog = false\" />\r\n *\r\n * // In methods:\r\n * async onDeleteConfirm(ids) {\r\n * try {\r\n * await store.massDelete(ids)\r\n * this.$refs.deleteDialog.setResult({ success: true })\r\n * } catch (e) {\r\n * this.$refs.deleteDialog.setResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnMassDeleteDialog',\r\n\r\n\tcomponents: {\r\n\t\tNcDialog,\r\n\t\tNcButton,\r\n\t\tNcNoteCard,\r\n\t\tNcLoadingIcon,\r\n\t\tTrashCanOutline,\r\n\t\tClose,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Items to delete. Each must have an `id` property. */\r\n\t\titems: {\r\n\t\t\ttype: Array,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Property name used for display (e.g., 'title', 'name') */\r\n\t\tnameField: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'title',\r\n\t\t},\r\n\t\t/** Dialog title */\r\n\t\tdialogTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Delete Items',\r\n\t\t},\r\n\t\t/** Warning text shown above the item list */\r\n\t\twarningText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'The following items will be permanently deleted. Remove any items you want to keep.',\r\n\t\t},\r\n\t\t/** Text when all items removed from list */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items selected for deletion.',\r\n\t\t},\r\n\t\t/** Success message */\r\n\t\tsuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Items successfully deleted.',\r\n\t\t},\r\n\t\tcancelLabel: { type: String, default: 'Cancel' },\r\n\t\tcloseLabel: { type: String, default: 'Close' },\r\n\t\tconfirmLabel: { type: String, default: 'Delete' },\r\n\t\tremoveLabel: { type: String, default: 'Remove from list' },\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tlocalItems: [...this.items],\r\n\t\t\tloading: false,\r\n\t\t\tresult: null,\r\n\t\t\tcloseTimeout: null,\r\n\t\t}\r\n\t},\r\n\r\n\twatch: {\r\n\t\titems(val) {\r\n\t\t\tthis.localItems = [...val]\r\n\t\t},\r\n\t},\r\n\r\n\tbeforeDestroy() {\r\n\t\tif (this.closeTimeout) clearTimeout(this.closeTimeout)\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tgetItemName(item) {\r\n\t\t\treturn item[this.nameField] || item.name || item.title || item.id\r\n\t\t},\r\n\r\n\t\tremoveItem(id) {\r\n\t\t\tthis.localItems = this.localItems.filter((i) => i.id !== id)\r\n\t\t},\r\n\r\n\t\texecuteDelete() {\r\n\t\t\tthis.loading = true\r\n\t\t\tconst ids = this.localItems.map((i) => i.id)\r\n\t\t\t/**\r\n\t\t\t * @event confirm Emitted when the user confirms deletion.\r\n\t\t\t * Payload: array of item IDs to delete.\r\n\t\t\t */\r\n\t\t\tthis.$emit('confirm', ids)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of the delete operation. Call this from the parent\r\n\t\t * after the API call completes.\r\n\t\t *\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetResult(resultData) {\r\n\t\t\tthis.loading = false\r\n\t\t\tthis.result = resultData\r\n\t\t\tif (resultData.success) {\r\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\r\n\t\t\t\t\tthis.$emit('close')\r\n\t\t\t\t}, 2000)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-mass-delete__list {\r\n\tmax-height: 300px;\r\n\toverflow-y: auto;\r\n\tmargin-top: 12px;\r\n}\r\n\r\n.cn-mass-delete__item {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\tpadding: 8px 12px;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-mass-delete__item:last-child {\r\n\tborder-bottom: none;\r\n}\r\n\r\n.cn-mass-delete__item-name {\r\n\tfont-weight: 500;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-mass-delete__empty {\r\n\ttext-align: center;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-style: italic;\r\n\tpadding: 20px;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcDialog\r\n\t\t:name=\"dialogTitle\"\r\n\t\tsize=\"normal\"\r\n\t\t:can-close=\"!loading\"\r\n\t\t@closing=\"$emit('close')\">\r\n\t\t<!-- Review phase -->\r\n\t\t<div v-if=\"result === null\" class=\"cn-mass-copy__review\">\r\n\t\t\t<div class=\"cn-mass-copy__pattern\">\r\n\t\t\t\t<label for=\"cn-mass-copy-pattern\">{{ patternLabel }}</label>\r\n\t\t\t\t<NcSelect\r\n\t\t\t\t\tinput-id=\"cn-mass-copy-pattern\"\r\n\t\t\t\t\t:options=\"patternOptions\"\r\n\t\t\t\t\t:value=\"selectedPattern\"\r\n\t\t\t\t\t:clearable=\"false\"\r\n\t\t\t\t\t@input=\"onPatternChange\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"cn-mass-copy__list\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"item in localItems\"\r\n\t\t\t\t\t:key=\"item.id\"\r\n\t\t\t\t\tclass=\"cn-mass-copy__item\">\r\n\t\t\t\t\t<div class=\"cn-mass-copy__item-names\">\r\n\t\t\t\t\t\t<span class=\"cn-mass-copy__item-original\">{{ getItemName(item) }}</span>\r\n\t\t\t\t\t\t<span class=\"cn-mass-copy__item-arrow\">→</span>\r\n\t\t\t\t\t\t<span class=\"cn-mass-copy__item-new\">{{ getNewName(item) }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<NcButton\r\n\t\t\t\t\t\ttype=\"tertiary\"\r\n\t\t\t\t\t\t:aria-label=\"removeLabel\"\r\n\t\t\t\t\t\t@click=\"removeItem(item.id)\">\r\n\t\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t\t<Close :size=\"16\" />\r\n\t\t\t\t\t\t</template>\r\n\t\t\t\t\t</NcButton>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<p v-if=\"localItems.length === 0\" class=\"cn-mass-copy__empty\">\r\n\t\t\t\t{{ emptyText }}\r\n\t\t\t</p>\r\n\t\t</div>\r\n\r\n\t\t<!-- Result phase -->\r\n\t\t<div v-else class=\"cn-mass-copy__result\">\r\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\r\n\t\t\t\t{{ successText }}\r\n\t\t\t</NcNoteCard>\r\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\r\n\t\t\t\t{{ result.error }}\r\n\t\t\t</NcNoteCard>\r\n\t\t</div>\r\n\r\n\t\t<template #actions>\r\n\t\t\t<NcButton @click=\"$emit('close')\">\r\n\t\t\t\t{{ result === null ? cancelLabel : closeLabel }}\r\n\t\t\t</NcButton>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"result === null\"\r\n\t\t\t\ttype=\"primary\"\r\n\t\t\t\t:disabled=\"loading || localItems.length === 0\"\r\n\t\t\t\t@click=\"executeCopy\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\r\n\t\t\t\t\t<ContentCopy v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ confirmLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</template>\r\n\t</NcDialog>\r\n</template>\r\n\r\n<script>\r\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\r\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\r\nimport Close from 'vue-material-design-icons/Close.vue'\r\n\r\n/**\r\n * CnMassCopyDialog — Two-phase mass copy confirmation dialog.\r\n *\r\n * Phase 1 (review): Shows the items to be copied with a naming pattern\r\n * selector and real-time preview of new names. Phase 2 (result): Shows\r\n * success or error.\r\n *\r\n * The dialog does NOT perform the copy itself — it emits a `confirm` event\r\n * with the items and naming function. The parent performs the actual API\r\n * call and calls `setResult()` via a ref.\r\n *\r\n * @example\r\n * <CnMassCopyDialog\r\n * v-if=\"showCopyDialog\"\r\n * ref=\"copyDialog\"\r\n * :items=\"selectedObjects\"\r\n * :name-field=\"'title'\"\r\n * @confirm=\"onCopyConfirm\"\r\n * @close=\"showCopyDialog = false\" />\r\n *\r\n * // In methods:\r\n * async onCopyConfirm({ ids, getName }) {\r\n * try {\r\n * for (const item of this.selectedObjects) {\r\n * await store.copyObject(item.id, { title: getName(item) })\r\n * }\r\n * this.$refs.copyDialog.setResult({ success: true })\r\n * } catch (e) {\r\n * this.$refs.copyDialog.setResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnMassCopyDialog',\r\n\r\n\tcomponents: {\r\n\t\tNcDialog,\r\n\t\tNcButton,\r\n\t\tNcNoteCard,\r\n\t\tNcLoadingIcon,\r\n\t\tNcSelect,\r\n\t\tContentCopy,\r\n\t\tClose,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Items to copy. Each must have an `id` property. */\r\n\t\titems: {\r\n\t\t\ttype: Array,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Property name used for display (e.g., 'title', 'name') */\r\n\t\tnameField: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'title',\r\n\t\t},\r\n\t\t/** Dialog title */\r\n\t\tdialogTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Copy Items',\r\n\t\t},\r\n\t\t/** Label for the naming pattern selector */\r\n\t\tpatternLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Naming pattern',\r\n\t\t},\r\n\t\t/** Text when all items removed from list */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items selected for copying.',\r\n\t\t},\r\n\t\t/** Success message */\r\n\t\tsuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Items successfully copied.',\r\n\t\t},\r\n\t\tcancelLabel: { type: String, default: 'Cancel' },\r\n\t\tcloseLabel: { type: String, default: 'Close' },\r\n\t\tconfirmLabel: { type: String, default: 'Copy' },\r\n\t\tremoveLabel: { type: String, default: 'Remove from list' },\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tlocalItems: [...this.items],\r\n\t\t\tloading: false,\r\n\t\t\tresult: null,\r\n\t\t\tcloseTimeout: null,\r\n\t\t\tselectedPattern: { id: 'copy-of', label: 'Copy of {name}' },\r\n\t\t}\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tpatternOptions() {\r\n\t\t\treturn [\r\n\t\t\t\t{ id: 'copy-of', label: 'Copy of {name}' },\r\n\t\t\t\t{ id: 'name-copy', label: '{name} - Copy' },\r\n\t\t\t\t{ id: 'name-parens', label: '{name} (Copy)' },\r\n\t\t\t]\r\n\t\t},\r\n\t},\r\n\r\n\twatch: {\r\n\t\titems(val) {\r\n\t\t\tthis.localItems = [...val]\r\n\t\t},\r\n\t},\r\n\r\n\tbeforeDestroy() {\r\n\t\tif (this.closeTimeout) clearTimeout(this.closeTimeout)\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tgetItemName(item) {\r\n\t\t\treturn item[this.nameField] || item.name || item.title || item.id\r\n\t\t},\r\n\r\n\t\tgetNewName(item) {\r\n\t\t\tconst name = this.getItemName(item)\r\n\t\t\treturn this.applyPattern(name, this.selectedPattern.id)\r\n\t\t},\r\n\r\n\t\tapplyPattern(name, patternId) {\r\n\t\t\tswitch (patternId) {\r\n\t\t\tcase 'copy-of':\r\n\t\t\t\treturn `Copy of ${name}`\r\n\t\t\tcase 'name-copy':\r\n\t\t\t\treturn `${name} - Copy`\r\n\t\t\tcase 'name-parens':\r\n\t\t\t\treturn `${name} (Copy)`\r\n\t\t\tdefault:\r\n\t\t\t\treturn `Copy of ${name}`\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonPatternChange(option) {\r\n\t\t\tthis.selectedPattern = option\r\n\t\t},\r\n\r\n\t\tremoveItem(id) {\r\n\t\t\tthis.localItems = this.localItems.filter((i) => i.id !== id)\r\n\t\t},\r\n\r\n\t\texecuteCopy() {\r\n\t\t\tthis.loading = true\r\n\t\t\tconst ids = this.localItems.map((i) => i.id)\r\n\t\t\tconst patternId = this.selectedPattern.id\r\n\t\t\t/**\r\n\t\t\t * @event confirm Emitted when the user confirms copying.\r\n\t\t\t * Payload: { ids, getName } where getName(item) returns the new name.\r\n\t\t\t */\r\n\t\t\tthis.$emit('confirm', {\r\n\t\t\t\tids,\r\n\t\t\t\tgetName: (item) => {\r\n\t\t\t\t\tconst name = this.getItemName(item)\r\n\t\t\t\t\treturn this.applyPattern(name, patternId)\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of the copy operation. Call this from the parent\r\n\t\t * after the API call completes.\r\n\t\t *\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetResult(resultData) {\r\n\t\t\tthis.loading = false\r\n\t\t\tthis.result = resultData\r\n\t\t\tif (resultData.success) {\r\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\r\n\t\t\t\t\tthis.$emit('close')\r\n\t\t\t\t}, 2000)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-mass-copy__pattern {\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n.cn-mass-copy__pattern label {\r\n\tdisplay: block;\r\n\tfont-weight: 600;\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.cn-mass-copy__list {\r\n\tmax-height: 300px;\r\n\toverflow-y: auto;\r\n}\r\n\r\n.cn-mass-copy__item {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\tpadding: 8px 12px;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-mass-copy__item:last-child {\r\n\tborder-bottom: none;\r\n}\r\n\r\n.cn-mass-copy__item-names {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: 8px;\r\n\toverflow: hidden;\r\n\tflex: 1;\r\n}\r\n\r\n.cn-mass-copy__item-original {\r\n\tcolor: var(--color-text-maxcontrast);\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-mass-copy__item-arrow {\r\n\tflex-shrink: 0;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-mass-copy__item-new {\r\n\tfont-weight: 500;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-mass-copy__empty {\r\n\ttext-align: center;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-style: italic;\r\n\tpadding: 20px;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcDialog\r\n\t\t:name=\"dialogTitle\"\r\n\t\tsize=\"small\"\r\n\t\t:can-close=\"!loading\"\r\n\t\t@closing=\"$emit('close')\">\r\n\t\t<!-- Result phase -->\r\n\t\t<div v-if=\"result !== null\" class=\"cn-mass-export__result\">\r\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\r\n\t\t\t\t{{ successText }}\r\n\t\t\t</NcNoteCard>\r\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\r\n\t\t\t\t{{ result.error }}\r\n\t\t\t</NcNoteCard>\r\n\t\t</div>\r\n\r\n\t\t<!-- Form phase -->\r\n\t\t<div v-else class=\"cn-mass-export__form\">\r\n\t\t\t<p v-if=\"description\" class=\"cn-mass-export__description\">\r\n\t\t\t\t{{ description }}\r\n\t\t\t</p>\r\n\r\n\t\t\t<div class=\"cn-mass-export__field\">\r\n\t\t\t\t<label for=\"cn-mass-export-format\">{{ formatLabel }}</label>\r\n\t\t\t\t<NcSelect\r\n\t\t\t\t\tinput-id=\"cn-mass-export-format\"\r\n\t\t\t\t\t:options=\"formatOptions\"\r\n\t\t\t\t\t:value=\"selectedFormat\"\r\n\t\t\t\t\t:clearable=\"false\"\r\n\t\t\t\t\t@input=\"selectedFormat = $event\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<template #actions>\r\n\t\t\t<NcButton @click=\"$emit('close')\">\r\n\t\t\t\t{{ result !== null ? closeLabel : cancelLabel }}\r\n\t\t\t</NcButton>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"result === null\"\r\n\t\t\t\ttype=\"primary\"\r\n\t\t\t\t:disabled=\"loading\"\r\n\t\t\t\t@click=\"executeExport\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\r\n\t\t\t\t\t<ExportIcon v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ confirmLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</template>\r\n\t</NcDialog>\r\n</template>\r\n\r\n<script>\r\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\r\nimport ExportIcon from 'vue-material-design-icons/Export.vue'\r\n\r\n/**\r\n * CnMassExportDialog — Export dialog with format selection.\r\n *\r\n * Allows users to select an export format and triggers the export.\r\n * The parent handles the actual download. Based on the OpenRegister\r\n * ExportRegister pattern.\r\n *\r\n * @example\r\n * <CnMassExportDialog\r\n * v-if=\"showExportDialog\"\r\n * ref=\"exportDialog\"\r\n * description=\"Export 42 objects from Cases\"\r\n * @confirm=\"onExportConfirm\"\r\n * @close=\"showExportDialog = false\" />\r\n *\r\n * // In methods:\r\n * async onExportConfirm({ format }) {\r\n * try {\r\n * const response = await axios({\r\n * url: `/api/objects/export`,\r\n * method: 'GET',\r\n * params: { type: format },\r\n * responseType: 'blob',\r\n * })\r\n * // Trigger download...\r\n * this.$refs.exportDialog.setResult({ success: true })\r\n * } catch (e) {\r\n * this.$refs.exportDialog.setResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnMassExportDialog',\r\n\r\n\tcomponents: {\r\n\t\tNcDialog,\r\n\t\tNcButton,\r\n\t\tNcNoteCard,\r\n\t\tNcLoadingIcon,\r\n\t\tNcSelect,\r\n\t\tExportIcon,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Dialog title */\r\n\t\tdialogTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Export Objects',\r\n\t\t},\r\n\t\t/** Description text shown above the format selector */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Available export formats */\r\n\t\tformats: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [\r\n\t\t\t\t{ id: 'excel', label: 'Excel (.xlsx)' },\r\n\t\t\t\t{ id: 'csv', label: 'CSV (.csv)' },\r\n\t\t\t],\r\n\t\t},\r\n\t\t/** Default selected format ID */\r\n\t\tdefaultFormat: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'excel',\r\n\t\t},\r\n\t\t/** Success message */\r\n\t\tsuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Export completed successfully.',\r\n\t\t},\r\n\t\tformatLabel: { type: String, default: 'Export format' },\r\n\t\tcancelLabel: { type: String, default: 'Cancel' },\r\n\t\tcloseLabel: { type: String, default: 'Close' },\r\n\t\tconfirmLabel: { type: String, default: 'Export' },\r\n\t},\r\n\r\n\tdata() {\r\n\t\tconst defaultOption = this.formats.find((f) => f.id === this.defaultFormat) || this.formats[0]\r\n\t\treturn {\r\n\t\t\tselectedFormat: defaultOption,\r\n\t\t\tloading: false,\r\n\t\t\tresult: null,\r\n\t\t\tcloseTimeout: null,\r\n\t\t}\r\n\t},\r\n\r\n\tbeforeDestroy() {\r\n\t\tif (this.closeTimeout) clearTimeout(this.closeTimeout)\r\n\t},\r\n\r\n\tmethods: {\r\n\t\texecuteExport() {\r\n\t\t\tthis.loading = true\r\n\t\t\tthis.$emit('confirm', {\r\n\t\t\t\tformat: this.selectedFormat.id,\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of the export operation.\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetResult(resultData) {\r\n\t\t\tthis.loading = false\r\n\t\t\tthis.result = resultData\r\n\t\t\tif (resultData.success) {\r\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\r\n\t\t\t\t\tthis.$emit('close')\r\n\t\t\t\t}, 2000)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-mass-export__description {\r\n\tmargin-bottom: 16px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-mass-export__field {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 4px;\r\n}\r\n\r\n.cn-mass-export__field label {\r\n\tfont-weight: 600;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcDialog\r\n\t\t:name=\"dialogTitle\"\r\n\t\tsize=\"large\"\r\n\t\t:can-close=\"!loading\"\r\n\t\t@closing=\"$emit('close')\">\r\n\t\t<!-- Success/error messages -->\r\n\t\t<NcNoteCard v-if=\"result && result.success && !hasErrors\" type=\"success\">\r\n\t\t\t{{ successText }}\r\n\t\t</NcNoteCard>\r\n\t\t<NcNoteCard v-if=\"result && result.success && hasErrors\" type=\"warning\">\r\n\t\t\t{{ partialSuccessText }}\r\n\t\t</NcNoteCard>\r\n\t\t<NcNoteCard v-if=\"result && result.error\" type=\"error\">\r\n\t\t\t{{ result.error }}\r\n\t\t</NcNoteCard>\r\n\r\n\t\t<!-- Results summary table -->\r\n\t\t<div v-if=\"result && result.summary\" class=\"cn-mass-import__results\">\r\n\t\t\t<h3>{{ summaryTitle }}</h3>\r\n\t\t\t<table class=\"cn-mass-import__summary-table\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<th>{{ sheetLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ foundLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ createdLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ updatedLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ unchangedLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ errorsLabel }}</th>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<template v-for=\"(sheet, key) in result.summary\">\r\n\t\t\t\t\t\t<tr :key=\"key\">\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__sheet-name\">{{ key }}</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--found\">\r\n\t\t\t\t\t\t\t\t{{ sheet.found || 0 }}\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--created\">\r\n\t\t\t\t\t\t\t\t{{ getCount(sheet.created) }}\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--updated\">\r\n\t\t\t\t\t\t\t\t{{ getCount(sheet.updated) }}\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--unchanged\">\r\n\t\t\t\t\t\t\t\t{{ getCount(sheet.unchanged) }}\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--errors\">\r\n\t\t\t\t\t\t\t\t<span>{{ getCount(sheet.errors) }}</span>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tv-if=\"getCount(sheet.errors) > 0\"\r\n\t\t\t\t\t\t\t\t\tclass=\"cn-mass-import__expand\"\r\n\t\t\t\t\t\t\t\t\t:class=\"{ 'cn-mass-import__expand--open': expandedErrors[key] }\"\r\n\t\t\t\t\t\t\t\t\t@click=\"toggleErrors(key)\">\r\n\t\t\t\t\t\t\t\t\t<ChevronDown :size=\"16\" />\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t<!-- Error details row -->\r\n\t\t\t\t\t\t<tr\r\n\t\t\t\t\t\t\tv-if=\"expandedErrors[key] && sheet.errors && sheet.errors.length\"\r\n\t\t\t\t\t\t\t:key=\"`${key}-errors`\"\r\n\t\t\t\t\t\t\tclass=\"cn-mass-import__error-row\">\r\n\t\t\t\t\t\t\t<td colspan=\"6\">\r\n\t\t\t\t\t\t\t\t<table class=\"cn-mass-import__error-table\">\r\n\t\t\t\t\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t\t\t<th>Row</th>\r\n\t\t\t\t\t\t\t\t\t\t\t<th>Type</th>\r\n\t\t\t\t\t\t\t\t\t\t\t<th>Message</th>\r\n\t\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t</thead>\r\n\t\t\t\t\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t\t\t\t\t<tr v-for=\"(err, idx) in sheet.errors\" :key=\"idx\">\r\n\t\t\t\t\t\t\t\t\t\t\t<td>{{ err.row || '—' }}</td>\r\n\t\t\t\t\t\t\t\t\t\t\t<td>{{ err.type || 'Unknown' }}</td>\r\n\t\t\t\t\t\t\t\t\t\t\t<td>{{ err.error || err.message || '—' }}</td>\r\n\t\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t</tbody>\r\n\t\t\t\t\t\t\t\t</table>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\r\n\t\t<!-- Upload form -->\r\n\t\t<div v-if=\"!result\" class=\"cn-mass-import__form\">\r\n\t\t\t<input\r\n\t\t\t\tref=\"fileInput\"\r\n\t\t\t\ttype=\"file\"\r\n\t\t\t\t:accept=\"acceptedTypes\"\r\n\t\t\t\tstyle=\"display: none\"\r\n\t\t\t\t@change=\"handleFileSelect\">\r\n\r\n\t\t\t<div class=\"cn-mass-import__file-row\">\r\n\t\t\t\t<NcButton @click=\"$refs.fileInput.click()\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<Upload :size=\"20\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t{{ selectFileLabel }}\r\n\t\t\t\t</NcButton>\r\n\t\t\t\t<div v-if=\"selectedFile\" class=\"cn-mass-import__file-info\">\r\n\t\t\t\t\t<span class=\"cn-mass-import__file-name\">{{ selectedFile.name }}</span>\r\n\t\t\t\t\t<span class=\"cn-mass-import__file-size\">({{ formatFileSize(selectedFile.size) }})</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Additional fields slot (e.g., register/schema selectors) -->\r\n\t\t\t<slot name=\"fields\" :file=\"selectedFile\" />\r\n\r\n\t\t\t<!-- File type help text -->\r\n\t\t\t<div v-if=\"fileTypeHelp\" class=\"cn-mass-import__help\">\r\n\t\t\t\t<p><strong>{{ supportedFormatsLabel }}</strong></p>\r\n\t\t\t\t<ul>\r\n\t\t\t\t\t<li v-for=\"(help, idx) in fileTypeHelp\" :key=\"idx\">\r\n\t\t\t\t\t\t<strong>{{ help.label }}</strong> — {{ help.description }}\r\n\t\t\t\t\t</li>\r\n\t\t\t\t</ul>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Import options -->\r\n\t\t\t<div v-if=\"options.length > 0\" class=\"cn-mass-import__options\">\r\n\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\tv-for=\"opt in options\"\r\n\t\t\t\t\t:key=\"opt.key\"\r\n\t\t\t\t\t:checked=\"optionValues[opt.key]\"\r\n\t\t\t\t\ttype=\"switch\"\r\n\t\t\t\t\t@update:checked=\"setOption(opt.key, $event)\">\r\n\t\t\t\t\t{{ opt.label }}\r\n\t\t\t\t\t<template v-if=\"opt.description\" #helper>\r\n\t\t\t\t\t\t{{ opt.description }}\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Loading indicator -->\r\n\t\t<NcNoteCard v-if=\"loading\" type=\"info\">\r\n\t\t\t{{ loadingText }}\r\n\t\t</NcNoteCard>\r\n\r\n\t\t<template #actions>\r\n\t\t\t<NcButton @click=\"$emit('close')\">\r\n\t\t\t\t{{ result ? closeLabel : cancelLabel }}\r\n\t\t\t</NcButton>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"!result\"\r\n\t\t\t\ttype=\"primary\"\r\n\t\t\t\t:disabled=\"loading || !selectedFile || !canSubmit\"\r\n\t\t\t\t@click=\"executeImport\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\r\n\t\t\t\t\t<ImportIcon v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ confirmLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</template>\r\n\t</NcDialog>\r\n</template>\r\n\r\n<script>\r\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon, NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport Upload from 'vue-material-design-icons/Upload.vue'\r\nimport ImportIcon from 'vue-material-design-icons/Import.vue'\r\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\r\n\r\n/**\r\n * CnMassImportDialog — File import dialog with options and results summary.\r\n *\r\n * Supports file upload (JSON, Excel, CSV), configurable import options via\r\n * toggle switches, and a results summary table showing created/updated/error\r\n * counts per sheet. Based on the OpenRegister ImportRegister pattern.\r\n *\r\n * The dialog does NOT perform the import itself — it emits a `confirm` event\r\n * with the file and options. The parent handles the API call and calls\r\n * `setResult()` via a ref.\r\n *\r\n * @example\r\n * <CnMassImportDialog\r\n * v-if=\"showImportDialog\"\r\n * ref=\"importDialog\"\r\n * :options=\"importOptions\"\r\n * @confirm=\"onImportConfirm\"\r\n * @close=\"showImportDialog = false\">\r\n * <template #fields=\"{ file }\">\r\n * <NcSelect v-if=\"file\" :options=\"schemas\" @input=\"selectedSchema = $event\" />\r\n * </template>\r\n * </CnMassImportDialog>\r\n *\r\n * // In data:\r\n * importOptions: [\r\n * { key: 'validation', label: 'Enable validation', description: 'Validate against schema', default: true },\r\n * { key: 'publish', label: 'Auto-publish', description: 'Set published date', default: false },\r\n * ]\r\n *\r\n * // In methods:\r\n * async onImportConfirm({ file, options }) {\r\n * try {\r\n * const formData = new FormData()\r\n * formData.append('file', file)\r\n * const result = await axios.post('/api/import', formData, { params: options })\r\n * this.$refs.importDialog.setResult({ success: true, summary: result.data.summary })\r\n * } catch (e) {\r\n * this.$refs.importDialog.setResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnMassImportDialog',\r\n\r\n\tcomponents: {\r\n\t\tNcDialog,\r\n\t\tNcButton,\r\n\t\tNcNoteCard,\r\n\t\tNcLoadingIcon,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tUpload,\r\n\t\tImportIcon,\r\n\t\tChevronDown,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Dialog title */\r\n\t\tdialogTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Import Data',\r\n\t\t},\r\n\t\t/** Accepted file types (input accept attribute) */\r\n\t\tacceptedTypes: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '.json,.xlsx,.xls,.csv',\r\n\t\t},\r\n\t\t/** Import option definitions */\r\n\t\toptions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** File type help entries */\r\n\t\tfileTypeHelp: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [\r\n\t\t\t\t{ label: 'JSON', description: 'Configuration and objects.' },\r\n\t\t\t\t{ label: 'Excel (.xlsx, .xls)', description: 'Tabular objects data with multiple sheets.' },\r\n\t\t\t\t{ label: 'CSV', description: 'Single table of objects data.' },\r\n\t\t\t],\r\n\t\t},\r\n\t\t/** Whether the form is ready to submit (parent can control via slot logic) */\r\n\t\tcanSubmit: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Success text when all rows imported without errors */\r\n\t\tsuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Import completed successfully!',\r\n\t\t},\r\n\t\t/** Text when import partially succeeded */\r\n\t\tpartialSuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Import completed with errors. Check the details below.',\r\n\t\t},\r\n\t\t/** Text shown while importing */\r\n\t\tloadingText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Importing data — this may take a moment for large files...',\r\n\t\t},\r\n\t\tsummaryTitle: { type: String, default: 'Import Summary' },\r\n\t\tsupportedFormatsLabel: { type: String, default: 'Supported file types:' },\r\n\t\tselectFileLabel: { type: String, default: 'Select File' },\r\n\t\tcancelLabel: { type: String, default: 'Cancel' },\r\n\t\tcloseLabel: { type: String, default: 'Close' },\r\n\t\tconfirmLabel: { type: String, default: 'Import' },\r\n\t\tsheetLabel: { type: String, default: 'Sheet' },\r\n\t\tfoundLabel: { type: String, default: 'Found' },\r\n\t\tcreatedLabel: { type: String, default: 'Created' },\r\n\t\tupdatedLabel: { type: String, default: 'Updated' },\r\n\t\tunchangedLabel: { type: String, default: 'Unchanged' },\r\n\t\terrorsLabel: { type: String, default: 'Errors' },\r\n\t},\r\n\r\n\tdata() {\r\n\t\tconst optionValues = {}\r\n\t\tthis.options.forEach((opt) => {\r\n\t\t\toptionValues[opt.key] = opt.default !== undefined ? opt.default : false\r\n\t\t})\r\n\t\treturn {\r\n\t\t\tselectedFile: null,\r\n\t\t\tloading: false,\r\n\t\t\tresult: null,\r\n\t\t\toptionValues,\r\n\t\t\texpandedErrors: {},\r\n\t\t}\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\thasErrors() {\r\n\t\t\tif (!this.result || !this.result.summary) return false\r\n\t\t\treturn Object.values(this.result.summary).some(\r\n\t\t\t\t(sheet) => sheet.errors && sheet.errors.length > 0,\r\n\t\t\t)\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\thandleFileSelect(event) {\r\n\t\t\tconst file = event.target.files[0]\r\n\t\t\tthis.selectedFile = file || null\r\n\t\t},\r\n\r\n\t\tsetOption(key, value) {\r\n\t\t\tthis.$set(this.optionValues, key, value)\r\n\t\t},\r\n\r\n\t\tformatFileSize(bytes) {\r\n\t\t\tif (bytes === 0) return '0 B'\r\n\t\t\tconst k = 1024\r\n\t\t\tconst sizes = ['B', 'KB', 'MB', 'GB']\r\n\t\t\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\r\n\t\t\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\r\n\t\t},\r\n\r\n\t\tgetCount(val) {\r\n\t\t\tif (Array.isArray(val)) return val.length\r\n\t\t\tif (typeof val === 'number') return val\r\n\t\t\treturn 0\r\n\t\t},\r\n\r\n\t\ttoggleErrors(key) {\r\n\t\t\tthis.$set(this.expandedErrors, key, !this.expandedErrors[key])\r\n\t\t},\r\n\r\n\t\texecuteImport() {\r\n\t\t\tthis.loading = true\r\n\t\t\tthis.$emit('confirm', {\r\n\t\t\t\tfile: this.selectedFile,\r\n\t\t\t\toptions: { ...this.optionValues },\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of the import operation.\r\n\t\t * @param {{ success?: boolean, error?: string, summary?: object }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetResult(resultData) {\r\n\t\t\tthis.loading = false\r\n\t\t\tthis.result = resultData\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-mass-import__form {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-mass-import__file-row {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: 12px;\r\n}\r\n\r\n.cn-mass-import__file-info {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: 6px;\r\n}\r\n\r\n.cn-mass-import__file-name {\r\n\tfont-weight: 500;\r\n}\r\n\r\n.cn-mass-import__file-size {\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-size: 0.9em;\r\n}\r\n\r\n.cn-mass-import__help {\r\n\tpadding: 12px;\r\n\tbackground: var(--color-background-hover);\r\n\tborder-radius: var(--border-radius);\r\n}\r\n\r\n.cn-mass-import__help p {\r\n\tmargin: 0 0 8px;\r\n}\r\n\r\n.cn-mass-import__help ul {\r\n\tmargin: 0;\r\n\tpadding-left: 20px;\r\n}\r\n\r\n.cn-mass-import__options {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 12px;\r\n}\r\n\r\n/* Summary table */\r\n.cn-mass-import__results h3 {\r\n\tmargin: 0 0 12px;\r\n\tfont-size: 1.1rem;\r\n}\r\n\r\n.cn-mass-import__summary-table {\r\n\twidth: 100%;\r\n\tborder-collapse: collapse;\r\n\tborder-radius: var(--border-radius);\r\n\toverflow: hidden;\r\n\tbox-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.cn-mass-import__summary-table th,\r\n.cn-mass-import__summary-table td {\r\n\tpadding: 8px 12px;\r\n\ttext-align: left;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-mass-import__summary-table th {\r\n\tbackground: var(--color-background-dark);\r\n\tfont-weight: 600;\r\n\tfont-size: 0.85rem;\r\n\ttext-transform: uppercase;\r\n}\r\n\r\n.cn-mass-import__sheet-name {\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-mass-import__stat {\r\n\ttext-align: center;\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-mass-import__stat--found { color: var(--color-primary-element); }\r\n.cn-mass-import__stat--created { color: var(--color-success); }\r\n.cn-mass-import__stat--updated { color: var(--color-warning); }\r\n.cn-mass-import__stat--unchanged { color: var(--color-text-maxcontrast); }\r\n.cn-mass-import__stat--errors { color: var(--color-error); }\r\n\r\n.cn-mass-import__expand {\r\n\tbackground: none;\r\n\tborder: none;\r\n\tcursor: pointer;\r\n\tpadding: 2px;\r\n\tborder-radius: var(--border-radius-small, 4px);\r\n\tcolor: var(--color-error);\r\n\ttransition: transform 0.2s ease;\r\n\tvertical-align: middle;\r\n\tmargin-left: 4px;\r\n}\r\n\r\n.cn-mass-import__expand:hover {\r\n\tbackground: var(--color-background-hover);\r\n}\r\n\r\n.cn-mass-import__expand--open {\r\n\ttransform: rotate(180deg);\r\n}\r\n\r\n/* Error details */\r\n.cn-mass-import__error-row td {\r\n\tpadding: 8px 12px;\r\n\tbackground: var(--color-background-hover);\r\n}\r\n\r\n.cn-mass-import__error-table {\r\n\twidth: 100%;\r\n\tborder-collapse: collapse;\r\n\tfont-size: 0.9em;\r\n}\r\n\r\n.cn-mass-import__error-table th,\r\n.cn-mass-import__error-table td {\r\n\tpadding: 6px 10px;\r\n\ttext-align: left;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-mass-import__error-table th {\r\n\tbackground: var(--color-background-dark);\r\n\tfont-weight: 600;\r\n\tfont-size: 0.85rem;\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-index-page\">\r\n\t\t<!-- Header -->\r\n\t\t<div class=\"cn-index-page__header\">\r\n\t\t\t<div class=\"cn-index-page__title-area\">\r\n\t\t\t\t<h2 class=\"cn-index-page__title\">{{ title }}</h2>\r\n\t\t\t\t<span v-if=\"pagination && pagination.total > 0\" class=\"cn-index-page__count\">\r\n\t\t\t\t\t{{ countText }}\r\n\t\t\t\t</span>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"cn-index-page__header-actions\">\r\n\t\t\t\t<!-- Mass actions dropdown (shows when items selected) -->\r\n\t\t\t\t<CnMassActionBar\r\n\t\t\t\t\tv-if=\"selectable\"\r\n\t\t\t\t\t:selected-ids=\"selectedIds\"\r\n\t\t\t\t\t:count=\"selectedIds.length\"\r\n\t\t\t\t\t:show-import=\"showMassImport\"\r\n\t\t\t\t\t:show-export=\"showMassExport\"\r\n\t\t\t\t\t:show-copy=\"showMassCopy\"\r\n\t\t\t\t\t:show-delete=\"showMassDelete\"\r\n\t\t\t\t\t@mass-import=\"showImportDialog = true\"\r\n\t\t\t\t\t@mass-export=\"showExportDialog = true\"\r\n\t\t\t\t\t@mass-copy=\"showCopyDialog = true\"\r\n\t\t\t\t\t@mass-delete=\"showDeleteDialog = true\">\r\n\t\t\t\t\t<template #actions=\"{ count: selCount, selectedIds: selIds }\">\r\n\t\t\t\t\t\t<slot name=\"mass-actions\" :count=\"selCount\" :selected-ids=\"selIds\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</CnMassActionBar>\r\n\r\n\t\t\t\t<CnViewModeToggle\r\n\t\t\t\t\tv-if=\"showViewToggle\"\r\n\t\t\t\t\t:value=\"currentViewMode\"\r\n\t\t\t\t\t@input=\"onViewModeChange\" />\r\n\t\t\t\t<slot name=\"header-actions\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Mass delete dialog -->\r\n\t\t<CnMassDeleteDialog\r\n\t\t\tv-if=\"showDeleteDialog\"\r\n\t\t\tref=\"deleteDialog\"\r\n\t\t\t:items=\"selectedObjects\"\r\n\t\t\t:name-field=\"massActionNameField\"\r\n\t\t\t@confirm=\"onMassDeleteConfirm\"\r\n\t\t\t@close=\"showDeleteDialog = false\" />\r\n\r\n\t\t<!-- Mass copy dialog -->\r\n\t\t<CnMassCopyDialog\r\n\t\t\tv-if=\"showCopyDialog\"\r\n\t\t\tref=\"copyDialog\"\r\n\t\t\t:items=\"selectedObjects\"\r\n\t\t\t:name-field=\"massActionNameField\"\r\n\t\t\t@confirm=\"onMassCopyConfirm\"\r\n\t\t\t@close=\"showCopyDialog = false\" />\r\n\r\n\t\t<!-- Mass export dialog -->\r\n\t\t<CnMassExportDialog\r\n\t\t\tv-if=\"showExportDialog\"\r\n\t\t\tref=\"exportDialog\"\r\n\t\t\t:formats=\"exportFormats\"\r\n\t\t\t@confirm=\"onMassExportConfirm\"\r\n\t\t\t@close=\"showExportDialog = false\" />\r\n\r\n\t\t<!-- Mass import dialog -->\r\n\t\t<CnMassImportDialog\r\n\t\t\tv-if=\"showImportDialog\"\r\n\t\t\tref=\"importDialog\"\r\n\t\t\t:options=\"importOptions\"\r\n\t\t\t@confirm=\"onMassImportConfirm\"\r\n\t\t\t@close=\"showImportDialog = false\">\r\n\t\t\t<template v-if=\"$scopedSlots['import-fields']\" #fields=\"{ file }\">\r\n\t\t\t\t<slot name=\"import-fields\" :file=\"file\" />\r\n\t\t\t</template>\r\n\t\t</CnMassImportDialog>\r\n\r\n\t\t<!-- Body: sidebar + main content -->\r\n\t\t<div class=\"cn-index-page__body\" :class=\"{ 'cn-index-page__body--with-sidebar': showSidebar }\">\r\n\t\t\t<!-- Facet sidebar -->\r\n\t\t\t<aside v-if=\"showSidebar\" class=\"cn-index-page__sidebar\">\r\n\t\t\t\t<slot name=\"sidebar\">\r\n\t\t\t\t\t<CnFacetSidebar\r\n\t\t\t\t\t\tv-if=\"schema\"\r\n\t\t\t\t\t\t:schema=\"schema\"\r\n\t\t\t\t\t\t:facet-data=\"facetData\"\r\n\t\t\t\t\t\t:active-filters=\"activeFilters\"\r\n\t\t\t\t\t\t:loading=\"facetLoading\"\r\n\t\t\t\t\t\t@filter-change=\"$emit('filter-change', $event)\"\r\n\t\t\t\t\t\t@clear-all=\"$emit('clear-filters')\" />\r\n\t\t\t\t</slot>\r\n\t\t\t</aside>\r\n\r\n\t\t\t<!-- Main content area -->\r\n\t\t\t<div class=\"cn-index-page__main\">\r\n\t\t\t\t<!-- Search bar -->\r\n\t\t\t\t<div v-if=\"showSearch\" class=\"cn-index-page__search\">\r\n\t\t\t\t\t<CnFilterBar\r\n\t\t\t\t\t\t:search-value=\"searchValue\"\r\n\t\t\t\t\t\t:search-placeholder=\"searchPlaceholder\"\r\n\t\t\t\t\t\t:filters=\"inlineFilters\"\r\n\t\t\t\t\t\t:show-clear-all=\"false\"\r\n\t\t\t\t\t\t@search=\"$emit('search', $event)\"\r\n\t\t\t\t\t\t@filter-change=\"$emit('filter-change', $event)\" />\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Loading state -->\r\n\t\t\t\t<div v-if=\"loading\" class=\"cn-index-page__loading\">\r\n\t\t\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Empty state -->\r\n\t\t\t\t<div v-else-if=\"objects.length === 0\" class=\"cn-index-page__empty\">\r\n\t\t\t\t\t<slot name=\"empty\">\r\n\t\t\t\t\t\t<NcEmptyContent :name=\"emptyText\">\r\n\t\t\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t\t\t<DatabaseSearch :size=\"64\" />\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t</NcEmptyContent>\r\n\t\t\t\t\t</slot>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Table view -->\r\n\t\t\t\t<CnDataTable\r\n\t\t\t\t\tv-else-if=\"currentViewMode === 'table'\"\r\n\t\t\t\t\t:schema=\"schema\"\r\n\t\t\t\t\t:columns=\"columns\"\r\n\t\t\t\t\t:rows=\"objects\"\r\n\t\t\t\t\t:sort-key=\"sortKey\"\r\n\t\t\t\t\t:sort-order=\"sortOrder\"\r\n\t\t\t\t\t:selectable=\"selectable\"\r\n\t\t\t\t\t:selected-ids=\"selectedIds\"\r\n\t\t\t\t\t:row-key=\"rowKey\"\r\n\t\t\t\t\t:empty-text=\"emptyText\"\r\n\t\t\t\t\t:exclude-columns=\"excludeColumns\"\r\n\t\t\t\t\t:include-columns=\"includeColumns\"\r\n\t\t\t\t\t:column-overrides=\"columnOverrides\"\r\n\t\t\t\t\t:row-class=\"rowClass\"\r\n\t\t\t\t\t@sort=\"$emit('sort', $event)\"\r\n\t\t\t\t\t@select=\"$emit('select', $event)\"\r\n\t\t\t\t\t@row-click=\"$emit('row-click', $event)\">\r\n\t\t\t\t\t<!-- Pass through column slots -->\r\n\t\t\t\t\t<template\r\n\t\t\t\t\t\tv-for=\"col in slotColumns\"\r\n\t\t\t\t\t\t#[`column-${col}`]=\"{ row, value }\">\r\n\t\t\t\t\t\t<slot :name=\"'column-' + col\" :row=\"row\" :value=\"value\" />\r\n\t\t\t\t\t</template>\r\n\r\n\t\t\t\t\t<!-- Row actions -->\r\n\t\t\t\t\t<template v-if=\"hasRowActions\" #row-actions=\"{ row }\">\r\n\t\t\t\t\t\t<slot name=\"row-actions\" :row=\"row\">\r\n\t\t\t\t\t\t\t<CnRowActions\r\n\t\t\t\t\t\t\t\tv-if=\"actions.length > 0\"\r\n\t\t\t\t\t\t\t\t:actions=\"actions\"\r\n\t\t\t\t\t\t\t\t:row=\"row\"\r\n\t\t\t\t\t\t\t\t@action=\"$emit('action', $event)\" />\r\n\t\t\t\t\t\t</slot>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</CnDataTable>\r\n\r\n\t\t\t\t<!-- Card view -->\r\n\t\t\t\t<CnCardGrid\r\n\t\t\t\t\tv-else\r\n\t\t\t\t\t:objects=\"objects\"\r\n\t\t\t\t\t:schema=\"schema\"\r\n\t\t\t\t\t:selectable=\"selectable\"\r\n\t\t\t\t\t:selected-ids=\"selectedIds\"\r\n\t\t\t\t\t:row-key=\"rowKey\"\r\n\t\t\t\t\t:empty-text=\"emptyText\"\r\n\t\t\t\t\t@click=\"$emit('row-click', $event)\"\r\n\t\t\t\t\t@select=\"$emit('select', $event)\">\r\n\t\t\t\t\t<template v-if=\"$scopedSlots.card\" #card=\"{ object, selected }\">\r\n\t\t\t\t\t\t<slot name=\"card\" :object=\"object\" :selected=\"selected\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-if=\"hasRowActions\" #card-actions=\"{ object }\">\r\n\t\t\t\t\t\t<slot name=\"row-actions\" :row=\"object\">\r\n\t\t\t\t\t\t\t<CnRowActions\r\n\t\t\t\t\t\t\t\tv-if=\"actions.length > 0\"\r\n\t\t\t\t\t\t\t\t:actions=\"actions\"\r\n\t\t\t\t\t\t\t\t:row=\"object\"\r\n\t\t\t\t\t\t\t\t@action=\"$emit('action', $event)\" />\r\n\t\t\t\t\t\t</slot>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</CnCardGrid>\r\n\r\n\t\t\t\t<!-- Pagination -->\r\n\t\t\t\t<CnPagination\r\n\t\t\t\t\tv-if=\"pagination && pagination.pages > 1\"\r\n\t\t\t\t\t:current-page=\"pagination.page || 1\"\r\n\t\t\t\t\t:total-pages=\"pagination.pages || 1\"\r\n\t\t\t\t\t:total-items=\"pagination.total || 0\"\r\n\t\t\t\t\t:current-page-size=\"pagination.limit || 20\"\r\n\t\t\t\t\tclass=\"cn-index-page__pagination\"\r\n\t\t\t\t\t@page-changed=\"$emit('page-changed', $event)\"\r\n\t\t\t\t\t@page-size-changed=\"$emit('page-size-changed', $event)\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon, NcEmptyContent } from '@nextcloud/vue'\r\nimport DatabaseSearch from 'vue-material-design-icons/DatabaseSearch.vue'\r\nimport { CnDataTable } from '../CnDataTable/index.js'\r\nimport { CnCardGrid } from '../CnCardGrid/index.js'\r\nimport { CnPagination } from '../CnPagination/index.js'\r\nimport { CnFilterBar } from '../CnFilterBar/index.js'\r\nimport { CnFacetSidebar } from '../CnFacetSidebar/index.js'\r\nimport { CnViewModeToggle } from '../CnViewModeToggle/index.js'\r\nimport { CnRowActions } from '../CnRowActions/index.js'\r\nimport { CnMassActionBar } from '../CnMassActionBar/index.js'\r\nimport { CnMassDeleteDialog } from '../CnMassDeleteDialog/index.js'\r\nimport { CnMassCopyDialog } from '../CnMassCopyDialog/index.js'\r\nimport { CnMassExportDialog } from '../CnMassExportDialog/index.js'\r\nimport { CnMassImportDialog } from '../CnMassImportDialog/index.js'\r\n\r\n/**\r\n * CnIndexPage — Top-level schema-driven index page component.\r\n *\r\n * Assembles all sub-components (table, cards, pagination, search, faceted\r\n * sidebar, view mode toggle) into a single zero-config page. Takes a schema\r\n * and objects array, then auto-generates everything.\r\n *\r\n * @example Minimal usage\r\n * <CnIndexPage\r\n * title=\"Publications\"\r\n * :schema=\"schema\"\r\n * :objects=\"publications\"\r\n * :pagination=\"pagination\"\r\n * :loading=\"loading\"\r\n * :search-value=\"search\"\r\n * @search=\"onSearch\"\r\n * @row-click=\"openPublication\"\r\n * @page-changed=\"onPage\" />\r\n *\r\n * @example Full usage with sidebar, actions, mass actions\r\n * <CnIndexPage\r\n * ref=\"indexPage\"\r\n * title=\"Cases\"\r\n * :schema=\"caseSchema\"\r\n * :objects=\"cases\"\r\n * :pagination=\"pagination\"\r\n * :loading=\"loading\"\r\n * :search-value=\"search\"\r\n * :selected-ids=\"selectedIds\"\r\n * :facet-data=\"facetData\"\r\n * :active-filters=\"filters\"\r\n * :actions=\"[{ label: 'Edit', handler: editCase }]\"\r\n * @search=\"onSearch\"\r\n * @select=\"selectedIds = $event\"\r\n * @row-click=\"openCase\"\r\n * @mass-delete=\"onMassDelete\"\r\n * @mass-copy=\"onMassCopy\">\r\n * <template #header-actions>\r\n * <NcButton type=\"primary\" @click=\"createCase\">New case</NcButton>\r\n * </template>\r\n * <template #mass-actions=\"{ count, selectedIds }\">\r\n * <NcButton @click=\"exportSelected(selectedIds)\">Export {{ count }}</NcButton>\r\n * </template>\r\n * </CnIndexPage>\r\n *\r\n * // In methods:\r\n * async onMassDelete(ids) {\r\n * try {\r\n * await store.massDelete(ids)\r\n * this.$refs.indexPage.setDeleteResult({ success: true })\r\n * } catch (e) {\r\n * this.$refs.indexPage.setDeleteResult({ error: e.message })\r\n * }\r\n * }\r\n * async onMassCopy({ ids, getName }) {\r\n * try {\r\n * for (const obj of this.selectedObjects) {\r\n * await store.copyObject(obj.id, { title: getName(obj) })\r\n * }\r\n * this.$refs.indexPage.setCopyResult({ success: true })\r\n * } catch (e) {\r\n * this.$refs.indexPage.setCopyResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnIndexPage',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t\tNcEmptyContent,\r\n\t\tDatabaseSearch,\r\n\t\tCnDataTable,\r\n\t\tCnCardGrid,\r\n\t\tCnPagination,\r\n\t\tCnFilterBar,\r\n\t\tCnFacetSidebar,\r\n\t\tCnViewModeToggle,\r\n\t\tCnRowActions,\r\n\t\tCnMassActionBar,\r\n\t\tCnMassDeleteDialog,\r\n\t\tCnMassCopyDialog,\r\n\t\tCnMassExportDialog,\r\n\t\tCnMassImportDialog,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Page title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Schema definition */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Manual column definitions (used instead of schema when provided) */\r\n\t\tcolumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Object/row data array */\r\n\t\tobjects: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Pagination state: { page, pages, total, limit } */\r\n\t\tpagination: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Whether data is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Current search term */\r\n\t\tsearchValue: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Search input placeholder */\r\n\t\tsearchPlaceholder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Search...',\r\n\t\t},\r\n\t\t/** Inline filter definitions (shown in the search bar) */\r\n\t\tinlineFilters: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Facet data from API: { fieldName: { values: [{value, count}] } } */\r\n\t\tfacetData: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Current active facet filters: { fieldName: [values] } */\r\n\t\tactiveFilters: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Whether facet data is loading */\r\n\t\tfacetLoading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether rows/cards can be selected */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Currently selected IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** View mode: 'table' or 'cards' */\r\n\t\tviewMode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'table',\r\n\t\t\tvalidator: (v) => ['table', 'cards'].includes(v),\r\n\t\t},\r\n\t\t/** Current sort key */\r\n\t\tsortKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Current sort order */\r\n\t\tsortOrder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'asc',\r\n\t\t},\r\n\t\t/** Unique row identifier property */\r\n\t\trowKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'id',\r\n\t\t},\r\n\t\t/** Columns to exclude in schema mode */\r\n\t\texcludeColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Columns to include in schema mode (whitelist) */\r\n\t\tincludeColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Per-column overrides in schema mode */\r\n\t\tcolumnOverrides: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Row action definitions */\r\n\t\tactions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Text shown when no items found */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items found',\r\n\t\t},\r\n\t\t/** Whether to show the view mode toggle */\r\n\t\tshowViewToggle: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the search bar */\r\n\t\tshowSearch: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Function returning CSS class(es) for a row */\r\n\t\trowClass: {\r\n\t\t\ttype: Function,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Import action */\r\n\t\tshowMassImport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Export action */\r\n\t\tshowMassExport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Copy button */\r\n\t\tshowMassCopy: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Delete button */\r\n\t\tshowMassDelete: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Property name used to display item names in mass action dialogs */\r\n\t\tmassActionNameField: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'title',\r\n\t\t},\r\n\t\t/** Available export formats for the export dialog */\r\n\t\texportFormats: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [\r\n\t\t\t\t{ id: 'excel', label: 'Excel (.xlsx)' },\r\n\t\t\t\t{ id: 'csv', label: 'CSV (.csv)' },\r\n\t\t\t],\r\n\t\t},\r\n\t\t/** Import option definitions for the import dialog */\r\n\t\timportOptions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tcurrentViewMode: this.viewMode,\r\n\t\t\tshowDeleteDialog: false,\r\n\t\t\tshowCopyDialog: false,\r\n\t\t\tshowExportDialog: false,\r\n\t\t\tshowImportDialog: false,\r\n\t\t}\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tcountText() {\r\n\t\t\tif (!this.pagination) return ''\r\n\t\t\treturn `Showing ${this.objects.length} of ${this.pagination.total}`\r\n\t\t},\r\n\r\n\t\tshowSidebar() {\r\n\t\t\treturn this.$scopedSlots.sidebar || this.facetData !== null\r\n\t\t},\r\n\r\n\t\thasRowActions() {\r\n\t\t\treturn this.$scopedSlots['row-actions'] || this.actions.length > 0\r\n\t\t},\r\n\r\n\t\t/** Whether all visible items are selected */\r\n\t\tallSelected() {\r\n\t\t\tif (this.objects.length === 0 || this.selectedIds.length === 0) return false\r\n\t\t\treturn this.objects.every((o) => this.selectedIds.includes(o[this.rowKey]))\r\n\t\t},\r\n\r\n\t\t/** Full objects for the selected IDs (used by mass action dialogs) */\r\n\t\tselectedObjects() {\r\n\t\t\treturn this.objects.filter((o) => this.selectedIds.includes(o[this.rowKey]))\r\n\t\t},\r\n\r\n\t\t/** Column slot names that the parent has provided (for pass-through) */\r\n\t\tslotColumns() {\r\n\t\t\treturn Object.keys(this.$scopedSlots)\r\n\t\t\t\t.filter((name) => name.startsWith('column-'))\r\n\t\t\t\t.map((name) => name.replace('column-', ''))\r\n\t\t},\r\n\t},\r\n\r\n\twatch: {\r\n\t\tviewMode(val) {\r\n\t\t\tthis.currentViewMode = val\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tonViewModeChange(mode) {\r\n\t\t\tthis.currentViewMode = mode\r\n\t\t\tthis.$emit('view-mode-change', mode)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handle mass delete confirm. Emits 'mass-delete' with the IDs.\r\n\t\t * Parent should call `this.$refs.indexPage.setDeleteResult(...)` when done.\r\n\t\t * @param {Array} ids Array of item IDs to delete\r\n\t\t */\r\n\t\tonMassDeleteConfirm(ids) {\r\n\t\t\tthis.$emit('mass-delete', ids)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handle mass copy confirm. Emits 'mass-copy' with the payload.\r\n\t\t * Parent should call `this.$refs.indexPage.setCopyResult(...)` when done.\r\n\t\t * @param {{ ids: Array, getName: Function }} payload\r\n\t\t */\r\n\t\tonMassCopyConfirm(payload) {\r\n\t\t\tthis.$emit('mass-copy', payload)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of a mass delete operation. Call from parent after API call.\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetDeleteResult(resultData) {\r\n\t\t\tif (this.$refs.deleteDialog) {\r\n\t\t\t\tthis.$refs.deleteDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of a mass copy operation. Call from parent after API call.\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetCopyResult(resultData) {\r\n\t\t\tif (this.$refs.copyDialog) {\r\n\t\t\t\tthis.$refs.copyDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handle mass export confirm.\r\n\t\t * @param {{ format: string }} payload\r\n\t\t */\r\n\t\tonMassExportConfirm(payload) {\r\n\t\t\tthis.$emit('mass-export', payload)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handle mass import confirm.\r\n\t\t * @param {{ file: File, options: object }} payload\r\n\t\t */\r\n\t\tonMassImportConfirm(payload) {\r\n\t\t\tthis.$emit('mass-import', payload)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of a mass export operation.\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetExportResult(resultData) {\r\n\t\t\tif (this.$refs.exportDialog) {\r\n\t\t\t\tthis.$refs.exportDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of a mass import operation.\r\n\t\t * @param {{ success?: boolean, error?: string, summary?: object }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetImportResult(resultData) {\r\n\t\t\tif (this.$refs.importDialog) {\r\n\t\t\t\tthis.$refs.importDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-index-page {\r\n\tpadding: 20px;\r\n}\r\n\r\n.cn-index-page__header {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 16px;\r\n\tflex-wrap: wrap;\r\n\tgap: 12px;\r\n}\r\n\r\n.cn-index-page__title-area {\r\n\tdisplay: flex;\r\n\talign-items: baseline;\r\n\tgap: 8px;\r\n}\r\n\r\n.cn-index-page__title {\r\n\tmargin: 0;\r\n\tfont-size: 22px;\r\n\tfont-weight: 700;\r\n}\r\n\r\n.cn-index-page__count {\r\n\tfont-size: 14px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-index-page__header-actions {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: 8px;\r\n}\r\n\r\n.cn-index-page__body {\r\n\tdisplay: flex;\r\n\tgap: 0;\r\n}\r\n\r\n.cn-index-page__body--with-sidebar {\r\n\tgap: 0;\r\n}\r\n\r\n.cn-index-page__sidebar {\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.cn-index-page__main {\r\n\tflex: 1;\r\n\tmin-width: 0;\r\n}\r\n\r\n.cn-index-page__search {\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n.cn-index-page__loading {\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\tpadding: 60px;\r\n}\r\n\r\n.cn-index-page__empty {\r\n\tpadding: 40px 20px;\r\n\ttext-align: center;\r\n}\r\n\r\n.cn-index-page__pagination {\r\n\tmargin-top: 16px;\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-kpi-grid\" :class=\"gridClasses\">\r\n\t\t<slot />\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * CnKpiGrid — Responsive grid layout for KPI/stats cards.\r\n *\r\n * Wraps CnStatsBlock components in a responsive CSS grid. Supports\r\n * 2, 3, or 4 column layouts that adapt to screen size.\r\n *\r\n * @example 4-column dashboard (default)\r\n * <CnKpiGrid>\r\n * <CnStatsBlock title=\"Cases\" :count=\"42\" :icon=\"BriefcaseOutline\" variant=\"primary\" />\r\n * <CnStatsBlock title=\"Contacts\" :count=\"128\" :icon=\"AccountGroup\" variant=\"success\" />\r\n * <CnStatsBlock title=\"Tasks\" :count=\"7\" :icon=\"ClipboardCheck\" variant=\"warning\" />\r\n * <CnStatsBlock title=\"Overdue\" :count=\"3\" :icon=\"AlertCircle\" variant=\"error\" />\r\n * </CnKpiGrid>\r\n *\r\n * @example 2-column layout\r\n * <CnKpiGrid :columns=\"2\">\r\n * <CnStatsBlock title=\"Open\" :count=\"15\" />\r\n * <CnStatsBlock title=\"Closed\" :count=\"42\" />\r\n * </CnKpiGrid>\r\n */\r\nexport default {\r\n\tname: 'CnKpiGrid',\r\n\r\n\tprops: {\r\n\t\t/** Number of columns at max width: 2, 3, or 4 */\r\n\t\tcolumns: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 4,\r\n\t\t\tvalidator: (v) => [2, 3, 4].includes(v),\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tgridClasses() {\r\n\t\t\treturn {\r\n\t\t\t\t[`cn-kpi-grid--cols-${this.columns}`]: true,\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-kpi-grid {\r\n\tdisplay: grid;\r\n\tgap: 16px;\r\n\tmargin-bottom: 24px;\r\n}\r\n\r\n.cn-kpi-grid--cols-2 {\r\n\tgrid-template-columns: repeat(2, 1fr);\r\n}\r\n\r\n.cn-kpi-grid--cols-3 {\r\n\tgrid-template-columns: repeat(3, 1fr);\r\n}\r\n\r\n.cn-kpi-grid--cols-4 {\r\n\tgrid-template-columns: repeat(4, 1fr);\r\n}\r\n\r\n/* Responsive breakpoints */\r\n@media (max-width: 1200px) {\r\n\t.cn-kpi-grid--cols-4 {\r\n\t\tgrid-template-columns: repeat(2, 1fr);\r\n\t}\r\n}\r\n\r\n@media (max-width: 900px) {\r\n\t.cn-kpi-grid--cols-3 {\r\n\t\tgrid-template-columns: repeat(2, 1fr);\r\n\t}\r\n}\r\n\r\n@media (max-width: 600px) {\r\n\t.cn-kpi-grid--cols-2,\r\n\t.cn-kpi-grid--cols-3,\r\n\t.cn-kpi-grid--cols-4 {\r\n\t\tgrid-template-columns: 1fr;\r\n\t}\r\n}\r\n</style>\r\n","/**\r\n * Build standard Nextcloud request headers for API calls.\r\n *\r\n * Includes the CSRF request token and OCS API request header\r\n * required by Nextcloud's API layer.\r\n *\r\n * @param {string} [contentType='application/json'] Content-Type header value\r\n * @return {object} Headers object for use with fetch()\r\n */\r\nexport function buildHeaders(contentType = 'application/json') {\r\n\tconst headers = {\r\n\t\trequesttoken: OC.requestToken,\r\n\t\t'OCS-APIREQUEST': 'true',\r\n\t}\r\n\tif (contentType) {\r\n\t\theaders['Content-Type'] = contentType\r\n\t}\r\n\treturn headers\r\n}\r\n\r\n/**\r\n * Build a query string from a params object.\r\n *\r\n * Handles _order serialization (JSON.stringify for objects) and skips\r\n * null/undefined/empty values.\r\n *\r\n * @param {object} params Key-value pairs for query parameters\r\n * @return {string} Query string including leading '?' or empty string\r\n */\r\nexport function buildQueryString(params = {}) {\r\n\tconst queryParams = new URLSearchParams()\r\n\r\n\tfor (const [key, value] of Object.entries(params)) {\r\n\t\tif (value === undefined || value === null || value === '') continue\r\n\t\tif (key === '_order' && typeof value === 'object') {\r\n\t\t\tqueryParams.set(key, JSON.stringify(value))\r\n\t\t} else {\r\n\t\t\tqueryParams.set(key, String(value))\r\n\t\t}\r\n\t}\r\n\r\n\tconst str = queryParams.toString()\r\n\treturn str ? '?' + str : ''\r\n}\r\n","/**\r\n * Unified error shape returned by all store actions.\r\n *\r\n * @typedef {object} ApiError\r\n * @property {number} status HTTP status code (0 for network errors)\r\n * @property {string} message Human-readable error message\r\n * @property {object|null} details Validation errors or additional details\r\n * @property {boolean} isValidation Whether this is a validation error (400/422)\r\n * @property {object|null} fields Per-field validation errors\r\n */\r\n\r\n/**\r\n * Parse an HTTP error response into a unified ApiError shape.\r\n *\r\n * Merges the best of Pipelinq's _parseResponseError (field extraction)\r\n * and Procest's _parseError (status-specific messages, isValidation flag).\r\n *\r\n * @param {Response} response The fetch Response object\r\n * @param {string} type The object type slug (used in error messages)\r\n * @return {Promise<ApiError>} Parsed error object\r\n */\r\nexport async function parseResponseError(response, type) {\r\n\tconst status = response.status\r\n\tlet details = null\r\n\tlet fields = null\r\n\tlet message = ''\r\n\r\n\ttry {\r\n\t\tconst body = await response.json()\r\n\t\tdetails = body.errors || body.error || body.message || null\r\n\t\tfields = body.validationErrors || body.errors || null\r\n\t} catch {\r\n\t\t// Response body is not JSON\r\n\t}\r\n\r\n\tswitch (true) {\r\n\tcase status === 400 || status === 422:\r\n\t\tmessage = details && typeof details === 'string'\r\n\t\t\t? details\r\n\t\t\t: `Validation failed for ${type}`\r\n\t\treturn { status, message, details, isValidation: true, fields, toString() { return this.message } }\r\n\tcase status === 401:\r\n\t\tmessage = 'Session expired, please log in again'\r\n\t\tbreak\r\n\tcase status === 403:\r\n\t\tmessage = 'You do not have permission to perform this action'\r\n\t\tbreak\r\n\tcase status === 404:\r\n\t\tmessage = `The requested ${type} could not be found`\r\n\t\tbreak\r\n\tcase status === 409:\r\n\t\tmessage = `This ${type} was modified by another user. Please reload.`\r\n\t\tbreak\r\n\tcase status >= 500:\r\n\t\tmessage = 'An unexpected server error occurred. Please try again.'\r\n\t\tbreak\r\n\tdefault:\r\n\t\tmessage = response.statusText || 'An unexpected error occurred'\r\n\t}\r\n\r\n\treturn { status, message, details, isValidation: false, fields, toString() { return this.message } }\r\n}\r\n\r\n/**\r\n * Create a network error object for fetch failures (no response).\r\n *\r\n * @param {Error} error The caught error\r\n * @return {ApiError} Network error object\r\n */\r\nexport function networkError(error) {\r\n\treturn {\r\n\t\tstatus: 0,\r\n\t\tmessage: error.message || 'A network error occurred. Check your connection and try again.',\r\n\t\tdetails: null,\r\n\t\tisValidation: false,\r\n\t\tfields: null,\r\n\t\ttoString() { return this.message },\r\n\t}\r\n}\r\n\r\n/**\r\n * Create a generic error object from a caught exception.\r\n *\r\n * @param {Error} error The caught error\r\n * @return {ApiError} Generic error object\r\n */\r\nexport function genericError(error) {\r\n\treturn {\r\n\t\tstatus: null,\r\n\t\tmessage: error.message,\r\n\t\tdetails: null,\r\n\t\tisValidation: false,\r\n\t\tfields: null,\r\n\t\ttoString() { return this.message },\r\n\t}\r\n}\r\n","import { defineStore } from 'pinia'\r\nimport { buildHeaders, buildQueryString } from '../utils/headers.js'\r\nimport { parseResponseError, networkError, genericError } from '../utils/errors.js'\r\n\r\n/**\r\n * Generic Pinia store for OpenRegister object CRUD operations.\r\n *\r\n * Provides a unified interface for managing objects across registers and schemas.\r\n * Apps register their object types with schema/register IDs, then use type slugs\r\n * for all operations. Supports plugins for sub-resources (files, audit trails, etc.).\r\n *\r\n * @example\r\n * // Basic usage (CRUD only)\r\n * import { useObjectStore } from '@conduction/nextcloud-vue'\r\n * const store = useObjectStore()\r\n *\r\n * @example\r\n * // With plugins\r\n * import { createObjectStore, filesPlugin, auditTrailsPlugin } from '@conduction/nextcloud-vue'\r\n * const useMyStore = createObjectStore('object', {\r\n * plugins: [filesPlugin(), auditTrailsPlugin()],\r\n * })\r\n */\r\n\r\nconst DEFAULT_STORE_ID = 'conduction-objects'\r\nconst DEFAULT_BASE_URL = '/apps/openregister/api/objects'\r\n\r\n/**\r\n * Capitalize the first letter of a string.\r\n *\r\n * @param {string} str Input string\r\n * @return {string} Capitalized string\r\n */\r\nfunction capitalize(str) {\r\n\treturn str.charAt(0).toUpperCase() + str.slice(1)\r\n}\r\n\r\n/**\r\n * Merge plugin state factories into a single state object.\r\n *\r\n * @param {Array} plugins Array of plugin definitions\r\n * @return {object} Merged state object\r\n */\r\nfunction mergePluginState(plugins) {\r\n\tconst merged = {}\r\n\tfor (const plugin of plugins) {\r\n\t\tif (plugin.state) {\r\n\t\t\tObject.assign(merged, plugin.state())\r\n\t\t}\r\n\t}\r\n\treturn merged\r\n}\r\n\r\n/**\r\n * Merge plugin getters into a single getters object.\r\n *\r\n * @param {Array} plugins Array of plugin definitions\r\n * @return {object} Merged getters object\r\n */\r\nfunction mergePluginGetters(plugins) {\r\n\tconst merged = {}\r\n\tfor (const plugin of plugins) {\r\n\t\tif (plugin.getters) {\r\n\t\t\tObject.assign(merged, plugin.getters)\r\n\t\t}\r\n\t}\r\n\treturn merged\r\n}\r\n\r\n/**\r\n * Merge plugin actions into a single actions object.\r\n *\r\n * @param {Array} plugins Array of plugin definitions\r\n * @return {object} Merged actions object\r\n */\r\nfunction mergePluginActions(plugins) {\r\n\tconst merged = {}\r\n\tfor (const plugin of plugins) {\r\n\t\tif (plugin.actions) {\r\n\t\t\tObject.assign(merged, plugin.actions)\r\n\t\t}\r\n\t}\r\n\treturn merged\r\n}\r\n\r\n// ── Base state ──────────────────────────────────────────────────────────\r\n\r\nfunction baseState() {\r\n\treturn {\r\n\t\t/** @type {Object<string, {schema: string, register: string}>} */\r\n\t\tobjectTypeRegistry: {},\r\n\t\t/** @type {Object<string, Array>} */\r\n\t\tcollections: {},\r\n\t\t/** @type {Object<string, Object<string, object>>} */\r\n\t\tobjects: {},\r\n\t\t/** @type {Object<string, boolean>} */\r\n\t\tloading: {},\r\n\t\t/** @type {Object<string, import('../utils/errors.js').ApiError|null>} */\r\n\t\terrors: {},\r\n\t\t/** @type {Object<string, {total: number, page: number, pages: number, limit: number}>} */\r\n\t\tpagination: {},\r\n\t\t/** @type {Object<string, string>} */\r\n\t\tsearchTerms: {},\r\n\t\t/** @type {Object<string, object|null>} */\r\n\t\tschemas: {},\r\n\t\t/** @type {{baseUrl: string}} */\r\n\t\t_options: {\r\n\t\t\tbaseUrl: DEFAULT_BASE_URL,\r\n\t\t},\r\n\t}\r\n}\r\n\r\n// ── Base getters ────────────────────────────────────────────────────────\r\n\r\nconst baseGetters = {\r\n\t/**\r\n\t * Get all registered object type slugs.\r\n\t * @return {string[]}\r\n\t */\r\n\tobjectTypes: (state) => Object.keys(state.objectTypeRegistry),\r\n\r\n\t/**\r\n\t * Get the collection array for a type.\r\n\t * @return {Function} (type: string) => Array\r\n\t */\r\n\tgetCollection: (state) => (type) => state.collections[type] || [],\r\n\r\n\t/**\r\n\t * Get a single cached object by type and ID.\r\n\t * @return {Function} (type: string, id: string) => object|null\r\n\t */\r\n\tgetObject: (state) => (type, id) => state.objects[type]?.[id] || null,\r\n\r\n\t/**\r\n\t * Alias for getObject — check cache without fetching.\r\n\t * @return {Function} (type: string, id: string) => object|null\r\n\t */\r\n\tgetCachedObject: (state) => (type, id) => state.objects[type]?.[id] || null,\r\n\r\n\t/**\r\n\t * Check if a type is currently loading.\r\n\t * @return {Function} (type: string) => boolean\r\n\t */\r\n\tisLoading: (state) => (type) => state.loading[type] || false,\r\n\r\n\t/**\r\n\t * Get the current error for a type.\r\n\t * @return {Function} (type: string) => ApiError|null\r\n\t */\r\n\tgetError: (state) => (type) => state.errors[type] || null,\r\n\r\n\t/**\r\n\t * Get pagination state for a type.\r\n\t * @return {Function} (type: string) => {total, page, pages, limit}\r\n\t */\r\n\tgetPagination: (state) => (type) =>\r\n\t\tstate.pagination[type] || { total: 0, page: 1, pages: 1, limit: 20 },\r\n\r\n\t/**\r\n\t * Get the current search term for a type.\r\n\t * @return {Function} (type: string) => string\r\n\t */\r\n\tgetSearchTerm: (state) => (type) => state.searchTerms[type] || '',\r\n\r\n\t/**\r\n\t * Get a cached schema for a type.\r\n\t * @return {Function} (type: string) => object|null\r\n\t */\r\n\tgetSchema: (state) => (type) => state.schemas[type] || null,\r\n}\r\n\r\n// ── Base actions ────────────────────────────────────────────────────────\r\n\r\nconst baseActions = {\r\n\t/**\r\n\t * Configure the store with custom options.\r\n\t * Call once before using the store if you need a custom base URL.\r\n\t *\r\n\t * @param {object} options Configuration options\r\n\t * @param {string} [options.baseUrl] Custom base URL for API calls\r\n\t */\r\n\tconfigure(options) {\r\n\t\tObject.assign(this._options, options)\r\n\t},\r\n\r\n\t/**\r\n\t * Register an object type for CRUD operations.\r\n\t *\r\n\t * @param {string} slug Short name for the type (e.g. 'client', 'case')\r\n\t * @param {string} schemaId OpenRegister schema ID\r\n\t * @param {string} registerId OpenRegister register ID\r\n\t */\r\n\tregisterObjectType(slug, schemaId, registerId) {\r\n\t\tthis.objectTypeRegistry[slug] = { schema: schemaId, register: registerId }\r\n\t\tthis.collections[slug] = []\r\n\t\tthis.objects[slug] = {}\r\n\t\tthis.loading[slug] = false\r\n\t\tthis.errors[slug] = null\r\n\t\tthis.pagination[slug] = { total: 0, page: 1, pages: 1, limit: 20 }\r\n\t\tthis.searchTerms[slug] = ''\r\n\t\tthis.schemas[slug] = null\r\n\t},\r\n\r\n\t/**\r\n\t * Unregister an object type and clean up all its state.\r\n\t *\r\n\t * @param {string} slug The type slug to unregister\r\n\t */\r\n\tunregisterObjectType(slug) {\r\n\t\tdelete this.objectTypeRegistry[slug]\r\n\t\tdelete this.collections[slug]\r\n\t\tdelete this.objects[slug]\r\n\t\tdelete this.loading[slug]\r\n\t\tdelete this.errors[slug]\r\n\t\tdelete this.pagination[slug]\r\n\t\tdelete this.searchTerms[slug]\r\n\t\tdelete this.schemas[slug]\r\n\t},\r\n\r\n\t/**\r\n\t * Get the type config or throw if not registered.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t * @return {{schema: string, register: string}} Type configuration\r\n\t * @throws {Error} If the type is not registered\r\n\t */\r\n\t_getTypeConfig(type) {\r\n\t\tconst config = this.objectTypeRegistry[type]\r\n\t\tif (!config) {\r\n\t\t\tthrow new Error(`Object type \"${type}\" is not registered in the store. Call registerObjectType('${type}', schemaId, registerId) first.`)\r\n\t\t}\r\n\t\treturn config\r\n\t},\r\n\r\n\t/**\r\n\t * Build the API URL for a type and optional object ID.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t * @param {string|null} [id=null] Optional object ID\r\n\t * @return {string} Full API URL path\r\n\t */\r\n\t_buildUrl(type, id = null) {\r\n\t\tconst config = this._getTypeConfig(type)\r\n\t\tlet url = `${this._options.baseUrl}/${config.register}/${config.schema}`\r\n\t\tif (id) {\r\n\t\t\turl += `/${id}`\r\n\t\t}\r\n\t\treturn url\r\n\t},\r\n\r\n\t/**\r\n\t * Clear the error state for a type.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t */\r\n\tclearError(type) {\r\n\t\tthis.errors[type] = null\r\n\t},\r\n\r\n\t/**\r\n\t * Set the search term for a type.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t * @param {string} term The search term\r\n\t */\r\n\tsetSearchTerm(type, term) {\r\n\t\tthis.searchTerms[type] = term\r\n\t},\r\n\r\n\t/**\r\n\t * Clear the search term for a type.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t */\r\n\tclearSearchTerm(type) {\r\n\t\tthis.searchTerms[type] = ''\r\n\t},\r\n\r\n\t/**\r\n\t * Fetch the schema definition for a registered type.\r\n\t * Uses cache — only fetches once per type per session.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @return {Promise<object|null>} The schema object or null on error\r\n\t */\r\n\tasync fetchSchema(type) {\r\n\t\tconst config = this._getTypeConfig(type)\r\n\r\n\t\tif (this.schemas[type]) {\r\n\t\t\treturn this.schemas[type]\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await fetch(\r\n\t\t\t\t`/apps/openregister/api/schemas/${config.schema}`,\r\n\t\t\t\t{ method: 'GET', headers: buildHeaders() },\r\n\t\t\t)\r\n\r\n\t\t\tif (!response.ok) return null\r\n\r\n\t\t\tconst schema = await response.json()\r\n\t\t\tthis.schemas[type] = schema\r\n\t\t\treturn schema\r\n\t\t} catch {\r\n\t\t\treturn null\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Fetch a collection of objects for a registered type.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {object} [params={}] Query parameters (_limit, _page, _search, _order, filters)\r\n\t * @return {Promise<Array>} The fetched collection (also stored in state)\r\n\t */\r\n\tasync fetchCollection(type, params = {}) {\r\n\t\tthis.loading[type] = true\r\n\t\tthis.errors[type] = null\r\n\r\n\t\ttry {\r\n\t\t\tconst url = this._buildUrl(type) + buildQueryString(params)\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthis.errors[type] = await parseResponseError(response, type)\r\n\t\t\t\tconsole.error(`Error fetching ${type} collection:`, this.errors[type])\r\n\t\t\t\treturn []\r\n\t\t\t}\r\n\r\n\t\t\tconst data = await response.json()\r\n\r\n\t\t\tthis.collections[type] = data.results || data\r\n\t\t\tthis.pagination[type] = {\r\n\t\t\t\ttotal: data.total || (data.results || data).length,\r\n\t\t\t\tpage: data.page || 1,\r\n\t\t\t\tpages: data.pages || 1,\r\n\t\t\t\tlimit: params._limit || 20,\r\n\t\t\t}\r\n\r\n\t\t\treturn this.collections[type]\r\n\t\t} catch (error) {\r\n\t\t\tthis.errors[type] = error.name === 'TypeError'\r\n\t\t\t\t? networkError(error)\r\n\t\t\t\t: genericError(error)\r\n\t\t\tconsole.error(`Error fetching ${type} collection:`, error)\r\n\t\t\treturn []\r\n\t\t} finally {\r\n\t\t\tthis.loading[type] = false\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Fetch a single object by type and ID.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {string} id The object ID or UUID\r\n\t * @return {Promise<object|null>} The fetched object (also cached in state)\r\n\t */\r\n\tasync fetchObject(type, id) {\r\n\t\tthis.loading[type] = true\r\n\t\tthis.errors[type] = null\r\n\r\n\t\ttry {\r\n\t\t\tconst url = this._buildUrl(type, id)\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthis.errors[type] = await parseResponseError(response, type)\r\n\t\t\t\tconsole.error(`Error fetching ${type}/${id}:`, this.errors[type])\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\tconst data = await response.json()\r\n\r\n\t\t\tif (!this.objects[type]) {\r\n\t\t\t\tthis.objects[type] = {}\r\n\t\t\t}\r\n\t\t\tthis.objects[type][id] = data\r\n\r\n\t\t\treturn data\r\n\t\t} catch (error) {\r\n\t\t\tthis.errors[type] = error.name === 'TypeError'\r\n\t\t\t\t? networkError(error)\r\n\t\t\t\t: genericError(error)\r\n\t\t\tconsole.error(`Error fetching ${type}/${id}:`, error)\r\n\t\t\treturn null\r\n\t\t} finally {\r\n\t\t\tthis.loading[type] = false\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Create or update an object. Uses POST for new objects, PUT for updates.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {object} objectData The object data (include `id` for updates)\r\n\t * @return {Promise<object|null>} The saved object or null on error\r\n\t */\r\n\tasync saveObject(type, objectData) {\r\n\t\tthis.loading[type] = true\r\n\t\tthis.errors[type] = null\r\n\r\n\t\ttry {\r\n\t\t\tconst isUpdate = !!objectData.id\r\n\t\t\tconst url = isUpdate\r\n\t\t\t\t? this._buildUrl(type, objectData.id)\r\n\t\t\t\t: this._buildUrl(type)\r\n\t\t\tconst method = isUpdate ? 'PUT' : 'POST'\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod,\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\tbody: JSON.stringify(objectData),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthis.errors[type] = await parseResponseError(response, type)\r\n\t\t\t\tconsole.error(`Error saving ${type}:`, this.errors[type])\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\tconst data = await response.json()\r\n\r\n\t\t\tif (!this.objects[type]) {\r\n\t\t\t\tthis.objects[type] = {}\r\n\t\t\t}\r\n\t\t\tconst savedId = data.id || objectData.id\r\n\t\t\tthis.objects[type][savedId] = data\r\n\r\n\t\t\treturn data\r\n\t\t} catch (error) {\r\n\t\t\tthis.errors[type] = error.name === 'TypeError'\r\n\t\t\t\t? networkError(error)\r\n\t\t\t\t: genericError(error)\r\n\t\t\tconsole.error(`Error saving ${type}:`, error)\r\n\t\t\treturn null\r\n\t\t} finally {\r\n\t\t\tthis.loading[type] = false\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Delete an object by type and ID.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {string} id The object ID\r\n\t * @return {Promise<boolean>} True if deleted successfully\r\n\t */\r\n\tasync deleteObject(type, id) {\r\n\t\tthis.loading[type] = true\r\n\t\tthis.errors[type] = null\r\n\r\n\t\ttry {\r\n\t\t\tconst url = this._buildUrl(type, id)\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod: 'DELETE',\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthis.errors[type] = await parseResponseError(response, type)\r\n\t\t\t\tconsole.error(`Error deleting ${type}/${id}:`, this.errors[type])\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\tif (this.objects[type]) {\r\n\t\t\t\tdelete this.objects[type][id]\r\n\t\t\t}\r\n\t\t\tif (this.collections[type]) {\r\n\t\t\t\tthis.collections[type] = this.collections[type].filter(\r\n\t\t\t\t\t(obj) => obj.id !== id,\r\n\t\t\t\t)\r\n\t\t\t}\r\n\r\n\t\t\treturn true\r\n\t\t} catch (error) {\r\n\t\t\tthis.errors[type] = error.name === 'TypeError'\r\n\t\t\t\t? networkError(error)\r\n\t\t\t\t: genericError(error)\r\n\t\t\tconsole.error(`Error deleting ${type}/${id}:`, error)\r\n\t\t\treturn false\r\n\t\t} finally {\r\n\t\t\tthis.loading[type] = false\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Batch-resolve references by fetching multiple objects by their IDs.\r\n\t * Uses the cache first, only fetches uncached objects.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {string[]} ids Array of object IDs to resolve\r\n\t * @return {Promise<Object<string, object>>} Map of id -> object\r\n\t */\r\n\tasync resolveReferences(type, ids) {\r\n\t\tif (!ids || ids.length === 0) return {}\r\n\r\n\t\tconst uniqueIds = [...new Set(ids.filter(Boolean))]\r\n\t\tconst result = {}\r\n\t\tconst toFetch = []\r\n\r\n\t\tfor (const id of uniqueIds) {\r\n\t\t\tconst cached = this.objects[type]?.[id]\r\n\t\t\tif (cached) {\r\n\t\t\t\tresult[id] = cached\r\n\t\t\t} else {\r\n\t\t\t\ttoFetch.push(id)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (toFetch.length > 0) {\r\n\t\t\tconst fetches = toFetch.map(async (id) => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, id)\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'GET',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\t\t\t\t\tif (response.ok) {\r\n\t\t\t\t\t\tconst data = await response.json()\r\n\t\t\t\t\t\tif (!this.objects[type]) this.objects[type] = {}\r\n\t\t\t\t\t\tthis.objects[type][id] = data\r\n\t\t\t\t\t\tresult[id] = data\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch {\r\n\t\t\t\t\t// Non-blocking — leave unresolved\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\tawait Promise.all(fetches)\r\n\t\t}\r\n\r\n\t\treturn result\r\n\t},\r\n}\r\n\r\n// ── Store factory ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Create the object store definition with a given store ID and optional plugins.\r\n *\r\n * Plugins are merged into the store at definition time. Each plugin provides\r\n * additional state, getters, and actions (e.g. for sub-resources like files,\r\n * audit trails, relations).\r\n *\r\n * @param {string} storeId Pinia store identifier\r\n * @param {Array} [plugins=[]] Array of plugin definitions\r\n * @return {Function} Pinia store composable\r\n */\r\nfunction defineObjectStore(storeId, plugins = []) {\r\n\tconst pluginState = mergePluginState(plugins)\r\n\tconst pluginGetters = mergePluginGetters(plugins)\r\n\tconst pluginActions = mergePluginActions(plugins)\r\n\r\n\treturn defineStore(storeId, {\r\n\t\tstate: () => ({\r\n\t\t\t...baseState(),\r\n\t\t\t...pluginState,\r\n\t\t}),\r\n\r\n\t\tgetters: {\r\n\t\t\t...baseGetters,\r\n\t\t\t...pluginGetters,\r\n\t\t},\r\n\r\n\t\tactions: {\r\n\t\t\t...baseActions,\r\n\t\t\t...pluginActions,\r\n\r\n\t\t\t/**\r\n\t\t\t * Clear all sub-resource data from active plugins.\r\n\t\t\t * Calls each plugin's clear method (e.g. clearFiles, clearAuditTrails).\r\n\t\t\t */\r\n\t\t\tclearAllSubResources() {\r\n\t\t\t\tfor (const plugin of plugins) {\r\n\t\t\t\t\tconst clearFn = `clear${capitalize(plugin.name)}`\r\n\t\t\t\t\tif (typeof this[clearFn] === 'function') {\r\n\t\t\t\t\t\tthis[clearFn]()\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t})\r\n}\r\n\r\n/**\r\n * Default object store instance with ID 'conduction-objects'.\r\n *\r\n * @example\r\n * import { useObjectStore } from '@conduction/nextcloud-vue'\r\n * const store = useObjectStore()\r\n */\r\nexport const useObjectStore = defineObjectStore(DEFAULT_STORE_ID)\r\n\r\n/**\r\n * Factory function to create an object store with a custom Pinia store ID\r\n * and optional plugins for sub-resources.\r\n *\r\n * @param {string} storeId Custom Pinia store identifier\r\n * @param {object} [options={}] Configuration options\r\n * @param {Array} [options.plugins=[]] Array of sub-resource plugins\r\n * @return {Function} Pinia store composable\r\n *\r\n * @example\r\n * // Basic (backwards compatible)\r\n * const useMyStore = createObjectStore('object')\r\n *\r\n * @example\r\n * // With plugins\r\n * import { filesPlugin, auditTrailsPlugin } from '@conduction/nextcloud-vue'\r\n * const useMyStore = createObjectStore('object', {\r\n * plugins: [filesPlugin(), auditTrailsPlugin()],\r\n * })\r\n */\r\nexport function createObjectStore(storeId, options = {}) {\r\n\treturn defineObjectStore(storeId, options.plugins || [])\r\n}\r\n","import { buildHeaders, buildQueryString } from '../utils/headers.js'\r\nimport { parseResponseError, networkError } from '../utils/errors.js'\r\n\r\n/**\r\n * Standard empty paginated response shape used by all sub-resource plugins.\r\n *\r\n * @param {number} [limit=20] Default page size\r\n * @return {object} Empty paginated state\r\n */\r\nexport function emptyPaginated(limit = 20) {\r\n\treturn { results: [], total: 0, page: 1, pages: 0, limit, offset: 0 }\r\n}\r\n\r\n/**\r\n * Capitalize the first letter of a string.\r\n *\r\n * @param {string} str Input string\r\n * @return {string} Capitalized string\r\n */\r\nfunction capitalize(str) {\r\n\treturn str.charAt(0).toUpperCase() + str.slice(1)\r\n}\r\n\r\n/**\r\n * Create a sub-resource plugin for the object store.\r\n *\r\n * Generates state, getters, and actions for a standard OpenRegister sub-resource\r\n * endpoint that returns paginated results. The generated plugin follows the\r\n * naming convention: fetch{Name}, clear{Name}, get{Name}, is{Name}Loading, etc.\r\n *\r\n * @param {string} name Camel-case name for the sub-resource (e.g. 'auditTrails')\r\n * @param {string} endpoint URL path segment appended to the object URL (e.g. 'audit-trails')\r\n * @param {object} [options={}] Plugin options\r\n * @param {number} [options.limit=20] Default page size\r\n * @return {Function} Plugin factory that returns the plugin definition\r\n *\r\n * @example\r\n * // Simple read-only sub-resource\r\n * export const auditTrailsPlugin = createSubResourcePlugin('auditTrails', 'audit-trails')\r\n *\r\n * @example\r\n * // With custom limit\r\n * export const contractsPlugin = createSubResourcePlugin('contracts', 'contracts', { limit: 50 })\r\n *\r\n * @example\r\n * // Usage in store creation\r\n * const useStore = createObjectStore('object', {\r\n * plugins: [auditTrailsPlugin()],\r\n * })\r\n * const store = useStore()\r\n * await store.fetchAuditTrails('case', caseId)\r\n * console.log(store.auditTrails.results)\r\n */\r\nexport function createSubResourcePlugin(name, endpoint, options = {}) {\r\n\tconst cap = capitalize(name)\r\n\tconst limit = options.limit || 20\r\n\r\n\treturn () => ({\r\n\t\tname,\r\n\r\n\t\tstate: () => ({\r\n\t\t\t[name]: emptyPaginated(limit),\r\n\t\t\t[`${name}Loading`]: false,\r\n\t\t\t[`${name}Error`]: null,\r\n\t\t}),\r\n\r\n\t\tgetters: {\r\n\t\t\t[`get${cap}`]: (state) => state[name],\r\n\t\t\t[`is${cap}Loading`]: (state) => state[`${name}Loading`],\r\n\t\t\t[`get${cap}Error`]: (state) => state[`${name}Error`],\r\n\t\t},\r\n\r\n\t\tactions: {\r\n\t\t\t/**\r\n\t\t\t * Fetch the sub-resource collection for an object.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {object} [params={}] Query parameters (_search, _limit, _page)\r\n\t\t\t * @return {Promise<Array>} The fetched results\r\n\t\t\t */\r\n\t\t\tasync [`fetch${cap}`](type, objectId, params = {}) {\r\n\t\t\t\tthis[`${name}Loading`] = true\r\n\t\t\t\tthis[`${name}Error`] = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId)\r\n\t\t\t\t\t\t+ '/' + endpoint\r\n\t\t\t\t\t\t+ buildQueryString(params)\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'GET',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis[`${name}Error`] = await parseResponseError(response, name)\r\n\t\t\t\t\t\tconsole.error(`Error fetching ${name} for ${type}/${objectId}:`, this[`${name}Error`])\r\n\t\t\t\t\t\treturn []\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst data = await response.json()\r\n\r\n\t\t\t\t\tthis[name] = {\r\n\t\t\t\t\t\tresults: data.results || data,\r\n\t\t\t\t\t\ttotal: data.total || (data.results || data).length,\r\n\t\t\t\t\t\tpage: data.page || 1,\r\n\t\t\t\t\t\tpages: data.pages || 0,\r\n\t\t\t\t\t\tlimit: params._limit || limit,\r\n\t\t\t\t\t\toffset: data.offset || 0,\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn this[name].results\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis[`${name}Error`] = error.name === 'TypeError'\r\n\t\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t\t: { status: null, message: error.message, details: null, isValidation: false, fields: null, toString() { return this.message } }\r\n\t\t\t\t\tconsole.error(`Error fetching ${name} for ${type}/${objectId}:`, error)\r\n\t\t\t\t\treturn []\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis[`${name}Loading`] = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Clear all sub-resource state back to empty defaults.\r\n\t\t\t */\r\n\t\t\t[`clear${cap}`]() {\r\n\t\t\t\tthis[name] = emptyPaginated(limit)\r\n\t\t\t\tthis[`${name}Loading`] = false\r\n\t\t\t\tthis[`${name}Error`] = null\r\n\t\t\t},\r\n\t\t},\r\n\t})\r\n}\r\n","import { createSubResourcePlugin } from '../createSubResourcePlugin.js'\r\n\r\n/**\r\n * Audit trails plugin for the object store.\r\n *\r\n * Adds state, getters, and actions for fetching audit trail records\r\n * for an object. Read-only — no create/update/delete.\r\n *\r\n * State: auditTrails, auditTrailsLoading, auditTrailsError\r\n * Actions: fetchAuditTrails(type, objectId, params), clearAuditTrails()\r\n * Getters: getAuditTrails, isAuditTrailsLoading, getAuditTrailsError\r\n *\r\n * @param {object} [options={}] Plugin options\r\n * @param {number} [options.limit=20] Default page size\r\n * @return {Function} Plugin factory\r\n */\r\nexport const auditTrailsPlugin = createSubResourcePlugin('auditTrails', 'audit-trails')\r\n","import { createSubResourcePlugin } from '../createSubResourcePlugin.js'\r\n\r\n/**\r\n * Relations plugin for the object store.\r\n *\r\n * Adds three sub-resources for object relations:\r\n * - contracts: contractual relations between objects\r\n * - uses: outgoing references (this object uses other objects)\r\n * - used: incoming references (other objects use this object)\r\n *\r\n * Each sub-resource gets its own state, loading, error, fetch, and clear.\r\n */\r\n\r\nconst contractsBase = createSubResourcePlugin('contracts', 'contracts')\r\nconst usesBase = createSubResourcePlugin('uses', 'uses')\r\nconst usedBase = createSubResourcePlugin('used', 'used')\r\n\r\n/**\r\n * Combined relations plugin that registers contracts, uses, and used sub-resources.\r\n *\r\n * @param {object} [options={}] Plugin options\r\n * @return {Function} Plugin factory\r\n *\r\n * @example\r\n * const useStore = createObjectStore('object', {\r\n * plugins: [relationsPlugin()],\r\n * })\r\n * const store = useStore()\r\n * await store.fetchContracts('case', caseId)\r\n * await store.fetchUses('case', caseId)\r\n * await store.fetchUsed('case', caseId)\r\n */\r\nexport function relationsPlugin(options = {}) {\r\n\tconst contracts = contractsBase(options)\r\n\tconst uses = usesBase(options)\r\n\tconst used = usedBase(options)\r\n\r\n\treturn {\r\n\t\tname: 'Relations',\r\n\r\n\t\tstate: () => ({\r\n\t\t\t...contracts.state(),\r\n\t\t\t...uses.state(),\r\n\t\t\t...used.state(),\r\n\t\t}),\r\n\r\n\t\tgetters: {\r\n\t\t\t...contracts.getters,\r\n\t\t\t...uses.getters,\r\n\t\t\t...used.getters,\r\n\t\t},\r\n\r\n\t\tactions: {\r\n\t\t\t...contracts.actions,\r\n\t\t\t...uses.actions,\r\n\t\t\t...used.actions,\r\n\r\n\t\t\t/**\r\n\t\t\t * Clear all relation sub-resources.\r\n\t\t\t */\r\n\t\t\tclearRelations() {\r\n\t\t\t\tthis.clearContracts()\r\n\t\t\t\tthis.clearUses()\r\n\t\t\t\tthis.clearUsed()\r\n\t\t\t},\r\n\t\t},\r\n\t}\r\n}\r\n","import { createSubResourcePlugin } from '../createSubResourcePlugin.js'\r\nimport { buildHeaders } from '../../utils/headers.js'\r\nimport { parseResponseError, networkError } from '../../utils/errors.js'\r\n\r\n/**\r\n * Files plugin for the object store.\r\n *\r\n * Extends the generic sub-resource with file-specific actions:\r\n * upload (multipart), publish, unpublish, and delete.\r\n *\r\n * State: files, filesLoading, filesError\r\n * Actions: fetchFiles, uploadFiles, publishFile, unpublishFile, deleteFile, clearFiles\r\n * Getters: getFiles, isFilesLoading, getFilesError\r\n *\r\n * @param {object} [options={}] Plugin options\r\n * @param {number} [options.limit=20] Default page size\r\n * @return {Function} Plugin factory\r\n *\r\n * @example\r\n * const useStore = createObjectStore('object', {\r\n * plugins: [filesPlugin()],\r\n * })\r\n * const store = useStore()\r\n * await store.fetchFiles('case', caseId)\r\n * await store.uploadFiles('case', caseId, formData)\r\n * await store.publishFile('case', caseId, fileId)\r\n */\r\nexport function filesPlugin(options = {}) {\r\n\tconst base = createSubResourcePlugin('files', 'files', options)()\r\n\r\n\treturn {\r\n\t\t...base,\r\n\r\n\t\tactions: {\r\n\t\t\t...base.actions,\r\n\r\n\t\t\t/**\r\n\t\t\t * Upload files to an object via multipart form data.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {FormData} formData FormData with files[] and optional tags/share fields\r\n\t\t\t * @return {Promise<object|null>} Upload response or null on error\r\n\t\t\t */\r\n\t\t\tasync uploadFiles(type, objectId, formData) {\r\n\t\t\t\tthis.filesLoading = true\r\n\t\t\t\tthis.filesError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + '/filesMultipart'\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\t\theaders: buildHeaders(null),\r\n\t\t\t\t\t\tbody: formData,\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.filesError = await parseResponseError(response, 'files')\r\n\t\t\t\t\t\tconsole.error(`Error uploading files for ${type}/${objectId}:`, this.filesError)\r\n\t\t\t\t\t\treturn null\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst data = await response.json()\r\n\r\n\t\t\t\t\tawait this.fetchFiles(type, objectId)\r\n\r\n\t\t\t\t\treturn data\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.filesError = error.name === 'TypeError'\r\n\t\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t\t: { status: null, message: error.message, details: null, isValidation: false, fields: null, toString() { return this.message } }\r\n\t\t\t\t\tconsole.error(`Error uploading files for ${type}/${objectId}:`, error)\r\n\t\t\t\t\treturn null\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.filesLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Publish a file (make it publicly accessible).\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {string} fileId The file ID to publish\r\n\t\t\t * @return {Promise<boolean>} True if published successfully\r\n\t\t\t */\r\n\t\t\tasync publishFile(type, objectId, fileId) {\r\n\t\t\t\tthis.filesLoading = true\r\n\t\t\t\tthis.filesError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + `/files/${fileId}/publish`\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.filesError = await parseResponseError(response, 'files')\r\n\t\t\t\t\t\treturn false\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tawait this.fetchFiles(type, objectId)\r\n\t\t\t\t\treturn true\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.filesError = networkError(error)\r\n\t\t\t\t\treturn false\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.filesLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unpublish a file (revoke public access).\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {string} fileId The file ID to unpublish\r\n\t\t\t * @return {Promise<boolean>} True if unpublished successfully\r\n\t\t\t */\r\n\t\t\tasync unpublishFile(type, objectId, fileId) {\r\n\t\t\t\tthis.filesLoading = true\r\n\t\t\t\tthis.filesError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + `/files/${fileId}/depublish`\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.filesError = await parseResponseError(response, 'files')\r\n\t\t\t\t\t\treturn false\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tawait this.fetchFiles(type, objectId)\r\n\t\t\t\t\treturn true\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.filesError = networkError(error)\r\n\t\t\t\t\treturn false\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.filesLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delete a file from an object.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {string} fileId The file ID to delete\r\n\t\t\t * @return {Promise<boolean>} True if deleted successfully\r\n\t\t\t */\r\n\t\t\tasync deleteFile(type, objectId, fileId) {\r\n\t\t\t\tthis.filesLoading = true\r\n\t\t\t\tthis.filesError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + `/files/${fileId}`\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'DELETE',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.filesError = await parseResponseError(response, 'files')\r\n\t\t\t\t\t\treturn false\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tawait this.fetchFiles(type, objectId)\r\n\t\t\t\t\treturn true\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.filesError = networkError(error)\r\n\t\t\t\t\treturn false\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.filesLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t}\r\n}\r\n","import { buildHeaders } from '../../utils/headers.js'\r\nimport { parseResponseError, networkError } from '../../utils/errors.js'\r\n\r\n/**\r\n * Lifecycle plugin for the object store.\r\n *\r\n * Adds object lifecycle actions: lock, unlock, publish, depublish, revert, merge.\r\n * These operate on the object itself (not sub-resources) but share the same\r\n * URL pattern: POST /{register}/{schema}/{objectId}/{action}\r\n *\r\n * State: lifecycleLoading, lifecycleError\r\n * Actions: lockObject, unlockObject, publishObject, depublishObject, revertObject, mergeObjects\r\n *\r\n * @return {Function} Plugin factory\r\n *\r\n * @example\r\n * const useStore = createObjectStore('object', {\r\n * plugins: [lifecyclePlugin()],\r\n * })\r\n * const store = useStore()\r\n * await store.lockObject('case', caseId, { process: 'review', duration: 3600 })\r\n * await store.publishObject('case', caseId, { date: '2025-01-01' })\r\n */\r\nexport function lifecyclePlugin() {\r\n\treturn {\r\n\t\tname: 'Lifecycle',\r\n\r\n\t\tstate: () => ({\r\n\t\t\tlifecycleLoading: false,\r\n\t\t\tlifecycleError: null,\r\n\t\t}),\r\n\r\n\t\tgetters: {\r\n\t\t\tisLifecycleLoading: (state) => state.lifecycleLoading,\r\n\t\t\tgetLifecycleError: (state) => state.lifecycleError,\r\n\t\t},\r\n\r\n\t\tactions: {\r\n\t\t\t/**\r\n\t\t\t * Perform a lifecycle action on an object.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {string} action The lifecycle action endpoint (e.g. 'lock', 'publish')\r\n\t\t\t * @param {object} [body=null] Optional request body\r\n\t\t\t * @return {Promise<object|null>} Response data or null on error\r\n\t\t\t */\r\n\t\t\tasync _lifecycleAction(type, objectId, action, body = null) {\r\n\t\t\t\tthis.lifecycleLoading = true\r\n\t\t\t\tthis.lifecycleError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + '/' + action\r\n\t\t\t\t\tconst options = {\r\n\t\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (body) {\r\n\t\t\t\t\t\toptions.body = JSON.stringify(body)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst response = await fetch(url, options)\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.lifecycleError = await parseResponseError(response, action)\r\n\t\t\t\t\t\tconsole.error(`Error performing ${action} on ${type}/${objectId}:`, this.lifecycleError)\r\n\t\t\t\t\t\treturn null\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst data = await response.json()\r\n\r\n\t\t\t\t\tif (this.objects[type] && data.id) {\r\n\t\t\t\t\t\tthis.objects[type][data.id] = data\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn data\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.lifecycleError = error.name === 'TypeError'\r\n\t\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t\t: { status: null, message: error.message, details: null, isValidation: false, fields: null, toString() { return this.message } }\r\n\t\t\t\t\tconsole.error(`Error performing ${action} on ${type}/${objectId}:`, error)\r\n\t\t\t\t\treturn null\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.lifecycleLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Lock an object to prevent concurrent edits.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {object} options Lock options\r\n\t\t\t * @param {string} [options.process] Lock reason/process name\r\n\t\t\t * @param {number} [options.duration] Lock duration in seconds\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync lockObject(type, objectId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'lock', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unlock an object.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync unlockObject(type, objectId) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'unlock')\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Publish an object (make it publicly accessible).\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {object} [options={}] Publish options\r\n\t\t\t * @param {string} [options.date] Publish date (ISO 8601)\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync publishObject(type, objectId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'publish', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Depublish an object (revoke public access).\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {object} [options={}] Depublish options\r\n\t\t\t * @param {string} [options.date] Depublish date (ISO 8601)\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync depublishObject(type, objectId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'depublish', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Revert an object to a previous version.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {object} options Revert options\r\n\t\t\t * @param {string} [options.datetime] Target datetime\r\n\t\t\t * @param {string} [options.auditTrailId] Audit trail entry ID to revert to\r\n\t\t\t * @param {number} [options.version] Target version number\r\n\t\t\t * @param {boolean} [options.overwriteVersion] Overwrite current version\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync revertObject(type, objectId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'revert', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Merge two objects together.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} sourceId The source object ID (will be merged into target)\r\n\t\t\t * @param {object} options Merge options\r\n\t\t\t * @param {string} options.target Target object ID\r\n\t\t\t * @param {string} [options.fileAction] How to handle files ('move'|'copy'|'skip')\r\n\t\t\t * @param {string} [options.relationAction] How to handle relations\r\n\t\t\t * @param {string} [options.referenceAction] How to handle references\r\n\t\t\t * @return {Promise<object|null>} Merge result or null on error\r\n\t\t\t */\r\n\t\t\tasync mergeObjects(type, sourceId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, sourceId, 'merge', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Clear lifecycle state.\r\n\t\t\t */\r\n\t\t\tclearLifecycle() {\r\n\t\t\t\tthis.lifecycleLoading = false\r\n\t\t\t\tthis.lifecycleError = null\r\n\t\t\t},\r\n\t\t},\r\n\t}\r\n}\r\n","import { ref, onBeforeUnmount } from 'vue'\r\n\r\n/**\r\n * Composable for managing list view state: search, filters, sorting, pagination.\r\n *\r\n * Extracts the search-debounce + filter + sort + pagination pattern\r\n * found in every list view across Pipelinq and Procest.\r\n *\r\n * @param {object} options Configuration options\r\n * @param {string} options.objectType The registered object type slug\r\n * @param {Function} options.fetchFn Function to call: (type, params) => Promise<Array>\r\n * @param {number} [options.debounceMs=300] Search debounce in milliseconds\r\n * @param {number} [options.pageSize=20] Default page size\r\n * @param {object} [options.defaultSort] Default sort: { key: string, order: 'asc'|'desc' }\r\n * @return {object} Reactive state and methods\r\n *\r\n * @example\r\n * import { useListView } from '@conduction/nextcloud-vue'\r\n *\r\n * const { searchTerm, sortKey, sortOrder, currentPage, onSearchInput, toggleSort, fetch } = useListView({\r\n * objectType: 'client',\r\n * fetchFn: (type, params) => objectStore.fetchCollection(type, params),\r\n * defaultSort: { key: 'name', order: 'asc' },\r\n * })\r\n */\r\nexport function useListView(options) {\r\n\tconst searchTerm = ref('')\r\n\tconst filters = ref({})\r\n\tconst sortKey = ref(options.defaultSort?.key || null)\r\n\tconst sortOrder = ref(options.defaultSort?.order || 'asc')\r\n\tconst currentPage = ref(1)\r\n\tconst pageSize = ref(options.pageSize || 20)\r\n\r\n\tlet searchTimeout = null\r\n\r\n\t/**\r\n\t * Build fetch parameters from current state.\r\n\t * @return {object} Parameters for the fetch function\r\n\t */\r\n\tfunction buildFetchParams() {\r\n\t\tconst params = {\r\n\t\t\t_limit: pageSize.value,\r\n\t\t\t_page: currentPage.value,\r\n\t\t}\r\n\r\n\t\tif (searchTerm.value) {\r\n\t\t\tparams._search = searchTerm.value\r\n\t\t}\r\n\r\n\t\tif (sortKey.value) {\r\n\t\t\tparams._order = { [sortKey.value]: sortOrder.value }\r\n\t\t}\r\n\r\n\t\t// Merge active filters\r\n\t\tfor (const [key, value] of Object.entries(filters.value)) {\r\n\t\t\tif (value !== null && value !== '' && value !== false) {\r\n\t\t\t\tparams[key] = value\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn params\r\n\t}\r\n\r\n\t/**\r\n\t * Execute a fetch with current state.\r\n\t * @param {number} [page] Optional page override\r\n\t * @return {Promise<Array>} Fetched results\r\n\t */\r\n\tasync function fetchData(page) {\r\n\t\tif (page !== undefined) {\r\n\t\t\tcurrentPage.value = page\r\n\t\t}\r\n\t\tconst params = buildFetchParams()\r\n\t\treturn options.fetchFn(options.objectType, params)\r\n\t}\r\n\r\n\t/**\r\n\t * Handle search input with debouncing.\r\n\t * @param {string} value New search value\r\n\t */\r\n\tfunction onSearchInput(value) {\r\n\t\tsearchTerm.value = value\r\n\t\tclearTimeout(searchTimeout)\r\n\t\tsearchTimeout = setTimeout(() => fetchData(1), options.debounceMs || 300)\r\n\t}\r\n\r\n\t/**\r\n\t * Toggle sort on a column. Cycles: asc -> desc -> null.\r\n\t * @param {string} key Column key\r\n\t */\r\n\tfunction toggleSort(key) {\r\n\t\tif (sortKey.value === key) {\r\n\t\t\tif (sortOrder.value === 'asc') {\r\n\t\t\t\tsortOrder.value = 'desc'\r\n\t\t\t} else {\r\n\t\t\t\tsortKey.value = null\r\n\t\t\t\tsortOrder.value = 'asc'\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tsortKey.value = key\r\n\t\t\tsortOrder.value = 'asc'\r\n\t\t}\r\n\t\tfetchData(1)\r\n\t}\r\n\r\n\t/**\r\n\t * Set a filter value and re-fetch.\r\n\t * @param {string} key Filter key\r\n\t * @param {*} value Filter value\r\n\t */\r\n\tfunction setFilter(key, value) {\r\n\t\tfilters.value = { ...filters.value, [key]: value }\r\n\t\tfetchData(1)\r\n\t}\r\n\r\n\t/**\r\n\t * Clear all filters and search, then re-fetch.\r\n\t */\r\n\tfunction clearAllFilters() {\r\n\t\tsearchTerm.value = ''\r\n\t\tfilters.value = {}\r\n\t\tsortKey.value = options.defaultSort?.key || null\r\n\t\tsortOrder.value = options.defaultSort?.order || 'asc'\r\n\t\tfetchData(1)\r\n\t}\r\n\r\n\t/**\r\n\t * Navigate to a specific page.\r\n\t * @param {number} page Page number\r\n\t */\r\n\tfunction goToPage(page) {\r\n\t\tcurrentPage.value = page\r\n\t\tfetchData()\r\n\t}\r\n\r\n\tonBeforeUnmount(() => clearTimeout(searchTimeout))\r\n\r\n\treturn {\r\n\t\tsearchTerm,\r\n\t\tfilters,\r\n\t\tsortKey,\r\n\t\tsortOrder,\r\n\t\tcurrentPage,\r\n\t\tpageSize,\r\n\t\tonSearchInput,\r\n\t\ttoggleSort,\r\n\t\tsetFilter,\r\n\t\tclearAllFilters,\r\n\t\tgoToPage,\r\n\t\tfetch: fetchData,\r\n\t\tbuildFetchParams,\r\n\t}\r\n}\r\n","import { ref } from 'vue'\r\n\r\n/**\r\n * Composable for managing detail view state: loading, editing, deleting.\r\n *\r\n * Extracts the load/edit/delete pattern found in every detail view\r\n * across Pipelinq and Procest.\r\n *\r\n * @param {object} options Configuration options\r\n * @param {string} options.objectType The registered object type slug\r\n * @param {Function} options.fetchFn (type, id) => Promise<object>\r\n * @param {Function} options.saveFn (type, data) => Promise<object>\r\n * @param {Function} options.deleteFn (type, id) => Promise<boolean>\r\n * @param {Function} [options.onSaved] Callback after successful save\r\n * @param {Function} [options.onDeleted] Callback after successful delete\r\n * @return {object} Reactive state and methods\r\n *\r\n * @example\r\n * import { useDetailView } from '@conduction/nextcloud-vue'\r\n *\r\n * const { objectData, editing, loading, showDeleteDialog, load, save, confirmDelete, executeDelete } = useDetailView({\r\n * objectType: 'client',\r\n * fetchFn: (type, id) => objectStore.fetchObject(type, id),\r\n * saveFn: (type, data) => objectStore.saveObject(type, data),\r\n * deleteFn: (type, id) => objectStore.deleteObject(type, id),\r\n * onSaved: (result) => router.push(`/clients/${result.id}`),\r\n * onDeleted: () => router.push('/clients'),\r\n * })\r\n */\r\nexport function useDetailView(options) {\r\n\tconst objectData = ref({})\r\n\tconst editing = ref(false)\r\n\tconst loading = ref(false)\r\n\tconst saving = ref(false)\r\n\tconst showDeleteDialog = ref(false)\r\n\tconst error = ref(null)\r\n\r\n\t/**\r\n\t * Load an object by ID.\r\n\t * @param {string} id Object ID\r\n\t * @return {Promise<object|null>}\r\n\t */\r\n\tasync function load(id) {\r\n\t\tloading.value = true\r\n\t\terror.value = null\r\n\t\ttry {\r\n\t\t\tconst result = await options.fetchFn(options.objectType, id)\r\n\t\t\tif (result) {\r\n\t\t\t\tobjectData.value = { ...result }\r\n\t\t\t}\r\n\t\t\treturn result\r\n\t\t} catch (err) {\r\n\t\t\terror.value = err.message || 'Failed to load'\r\n\t\t\treturn null\r\n\t\t} finally {\r\n\t\t\tloading.value = false\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Save the current object data (create or update).\r\n\t * @param {object} [formData] Optional form data override (defaults to objectData)\r\n\t * @return {Promise<object|null>}\r\n\t */\r\n\tasync function save(formData) {\r\n\t\tsaving.value = true\r\n\t\terror.value = null\r\n\t\ttry {\r\n\t\t\tconst data = formData || objectData.value\r\n\t\t\tconst result = await options.saveFn(options.objectType, data)\r\n\t\t\tif (result) {\r\n\t\t\t\tobjectData.value = { ...result }\r\n\t\t\t\tediting.value = false\r\n\t\t\t\tif (options.onSaved) {\r\n\t\t\t\t\toptions.onSaved(result)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result\r\n\t\t} catch (err) {\r\n\t\t\terror.value = err.message || 'Failed to save'\r\n\t\t\treturn null\r\n\t\t} finally {\r\n\t\t\tsaving.value = false\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Show the delete confirmation dialog.\r\n\t */\r\n\tfunction confirmDelete() {\r\n\t\tshowDeleteDialog.value = true\r\n\t}\r\n\r\n\t/**\r\n\t * Execute the delete operation.\r\n\t * @param {string} [id] Object ID (defaults to objectData.id)\r\n\t * @return {Promise<boolean>}\r\n\t */\r\n\tasync function executeDelete(id) {\r\n\t\tconst deleteId = id || objectData.value.id\r\n\t\tloading.value = true\r\n\t\terror.value = null\r\n\t\ttry {\r\n\t\t\tconst success = await options.deleteFn(options.objectType, deleteId)\r\n\t\t\tif (success) {\r\n\t\t\t\tshowDeleteDialog.value = false\r\n\t\t\t\tif (options.onDeleted) {\r\n\t\t\t\t\toptions.onDeleted()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn success\r\n\t\t} catch (err) {\r\n\t\t\terror.value = err.message || 'Failed to delete'\r\n\t\t\treturn false\r\n\t\t} finally {\r\n\t\t\tloading.value = false\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tobjectData,\r\n\t\tediting,\r\n\t\tloading,\r\n\t\tsaving,\r\n\t\tshowDeleteDialog,\r\n\t\terror,\r\n\t\tload,\r\n\t\tsave,\r\n\t\tconfirmDelete,\r\n\t\texecuteDelete,\r\n\t}\r\n}\r\n","import { ref, reactive } from 'vue'\r\nimport { buildHeaders, buildQueryString } from '../utils/headers.js'\r\nimport { parseResponseError, networkError } from '../utils/errors.js'\r\n\r\n/**\r\n * Standalone composable for fetching sub-resources outside the Pinia store.\r\n *\r\n * Use this for app-specific sub-resources that don't follow the standard\r\n * OpenRegister pattern or don't need shared state (e.g. CalDAV tasks,\r\n * ICommentsManager notes). State is scoped to the component lifecycle.\r\n *\r\n * For sub-resources that need shared state across components, use store\r\n * plugins (filesPlugin, auditTrailsPlugin, etc.) instead.\r\n *\r\n * @param {object} store The object store instance (must have objectTypeRegistry and _options)\r\n * @param {string} endpoint URL path segment appended to the object URL (e.g. 'tasks')\r\n * @param {object} [options={}] Composable options\r\n * @param {Function} [options.transform] Transform function applied to each result item\r\n * @param {number} [options.limit=20] Default page size\r\n * @return {object} Reactive state and methods\r\n *\r\n * @example\r\n * // Basic usage\r\n * const tasks = useSubResource(store, 'tasks')\r\n * await tasks.fetch('case', caseId)\r\n * console.log(tasks.data.results)\r\n *\r\n * @example\r\n * // With transform function (e.g. CalDAV task normalization)\r\n * const tasks = useSubResource(store, 'tasks', {\r\n * transform: (task) => ({\r\n * id: task.uid || task.id,\r\n * title: task.summary,\r\n * deadline: task.due,\r\n * status: task.status,\r\n * }),\r\n * })\r\n */\r\nexport function useSubResource(store, endpoint, options = {}) {\r\n\tconst limit = options.limit || 20\r\n\tconst transform = options.transform || null\r\n\r\n\tconst data = reactive({\r\n\t\tresults: [],\r\n\t\ttotal: 0,\r\n\t\tpage: 1,\r\n\t\tpages: 0,\r\n\t\tlimit,\r\n\t\toffset: 0,\r\n\t})\r\n\tconst loading = ref(false)\r\n\tconst error = ref(null)\r\n\r\n\t/**\r\n\t * Build the sub-resource URL for a given object type and ID.\r\n\t *\r\n\t * @param {string} type The registered object type slug\r\n\t * @param {string} objectId The parent object ID\r\n\t * @return {string} Full URL path\r\n\t */\r\n\tfunction buildUrl(type, objectId) {\r\n\t\tconst config = store.objectTypeRegistry[type]\r\n\t\tif (!config) {\r\n\t\t\tthrow new Error(`Object type \"${type}\" is not registered in the store.`)\r\n\t\t}\r\n\t\treturn `${store._options.baseUrl}/${config.register}/${config.schema}/${objectId}/${endpoint}`\r\n\t}\r\n\r\n\t/**\r\n\t * Fetch the sub-resource collection for an object.\r\n\t *\r\n\t * @param {string} type The registered object type slug\r\n\t * @param {string} objectId The parent object ID\r\n\t * @param {object} [params={}] Query parameters (_search, _limit, _page)\r\n\t * @return {Promise<Array>} The fetched results\r\n\t */\r\n\tasync function fetchData(type, objectId, params = {}) {\r\n\t\tloading.value = true\r\n\t\terror.value = null\r\n\r\n\t\ttry {\r\n\t\t\tconst url = buildUrl(type, objectId) + buildQueryString(params)\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\terror.value = await parseResponseError(response, endpoint)\r\n\t\t\t\tconsole.error(`Error fetching ${endpoint} for ${type}/${objectId}:`, error.value)\r\n\t\t\t\treturn []\r\n\t\t\t}\r\n\r\n\t\t\tconst responseData = await response.json()\r\n\t\t\tlet results = responseData.results || responseData\r\n\r\n\t\t\tif (Array.isArray(results) && transform) {\r\n\t\t\t\tresults = results.map(transform)\r\n\t\t\t}\r\n\r\n\t\t\tdata.results = results\r\n\t\t\tdata.total = responseData.total || results.length\r\n\t\t\tdata.page = responseData.page || 1\r\n\t\t\tdata.pages = responseData.pages || 0\r\n\t\t\tdata.limit = params._limit || limit\r\n\t\t\tdata.offset = responseData.offset || 0\r\n\r\n\t\t\treturn data.results\r\n\t\t} catch (err) {\r\n\t\t\terror.value = err.name === 'TypeError'\r\n\t\t\t\t? networkError(err)\r\n\t\t\t\t: { status: null, message: err.message, details: null, isValidation: false, fields: null, toString() { return this.message } }\r\n\t\t\tconsole.error(`Error fetching ${endpoint} for ${type}/${objectId}:`, err)\r\n\t\t\treturn []\r\n\t\t} finally {\r\n\t\t\tloading.value = false\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Clear all state back to defaults.\r\n\t */\r\n\tfunction clear() {\r\n\t\tdata.results = []\r\n\t\tdata.total = 0\r\n\t\tdata.page = 1\r\n\t\tdata.pages = 0\r\n\t\tdata.limit = limit\r\n\t\tdata.offset = 0\r\n\t\tloading.value = false\r\n\t\terror.value = null\r\n\t}\r\n\r\n\treturn {\r\n\t\tdata,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tfetch: fetchData,\r\n\t\tclear,\r\n\t}\r\n}\r\n"],"names":["__vue_script__","script","NcLoadingIcon","NcCheckboxRadioSwitch","NcTextField","NcSelect","NcButton","NcEmptyContent","NcSettingsSection","NcActions","NcActionButton","NcDialog","NcNoteCard","ExportIcon","ImportIcon","capitalize","defineStore","ref","onBeforeUnmount","reactive"],"mappings":"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","x_google_ignoreList":[2]}
|
|
1
|
+
{"version":3,"file":"nextcloud-vue.cjs.js","sources":["../src/utils/schema.js","../src/components/CnStatusBadge/CnStatusBadge.vue","../node_modules/vue-runtime-helpers/dist/normalize-component.mjs","../src/components/CnCellRenderer/CnCellRenderer.vue","../src/components/CnDataTable/CnDataTable.vue","../src/components/CnFilterBar/CnFilterBar.vue","../src/components/CnPagination/CnPagination.vue","../src/components/CnSettingsCard/CnSettingsCard.vue","../src/components/CnSettingsSection/CnSettingsSection.vue","../src/components/CnStatsBlock/CnStatsBlock.vue","../src/components/CnConfigurationCard/CnConfigurationCard.vue","../src/components/CnVersionInfoCard/CnVersionInfoCard.vue","../src/components/CnObjectCard/CnObjectCard.vue","../src/components/CnCardGrid/CnCardGrid.vue","../src/components/CnFacetSidebar/CnFacetSidebar.vue","../src/components/CnRowActions/CnRowActions.vue","../src/components/CnIcon/CnIcon.vue","../src/components/CnPageHeader/CnPageHeader.vue","../src/components/CnActionsBar/CnActionsBar.vue","../src/components/CnMassDeleteDialog/CnMassDeleteDialog.vue","../src/components/CnMassCopyDialog/CnMassCopyDialog.vue","../src/components/CnMassExportDialog/CnMassExportDialog.vue","../src/components/CnMassImportDialog/CnMassImportDialog.vue","../src/components/CnDeleteDialog/CnDeleteDialog.vue","../src/components/CnCopyDialog/CnCopyDialog.vue","../src/components/CnFormDialog/CnFormDialog.vue","../src/components/CnIndexPage/CnIndexPage.vue","../src/components/CnMassActionBar/CnMassActionBar.vue","../src/components/CnKpiGrid/CnKpiGrid.vue","../src/constants/metadata.js","../src/components/CnIndexSidebar/CnIndexSidebar.vue","../src/utils/headers.js","../src/components/CnRegisterMapping/CnRegisterMapping.vue","../src/utils/errors.js","../src/store/useObjectStore.js","../src/store/createSubResourcePlugin.js","../src/store/plugins/auditTrails.js","../src/store/plugins/relations.js","../src/store/plugins/files.js","../src/store/plugins/lifecycle.js","../src/store/plugins/registerMapping.js","../src/composables/useListView.js","../src/composables/useDetailView.js","../src/composables/useSubResource.js"],"sourcesContent":["/**\r\n * Schema utility functions for auto-generating table columns, cell formatting,\r\n * form field definitions, and faceted filter definitions from OpenRegister\r\n * schema property definitions.\r\n *\r\n * @module utils/schema\r\n */\r\n\r\n/**\r\n * Default column widths per property type/format.\r\n */\r\nconst DEFAULT_WIDTHS = {\r\n\tboolean: '80px',\r\n\tinteger: '100px',\r\n\tnumber: '100px',\r\n\t'string:uuid': '140px',\r\n\t'string:date-time': '180px',\r\n\t'string:email': '200px',\r\n}\r\n\r\n/**\r\n * Get default width for a property type + format combination.\r\n *\r\n * @param {string} type Property type\r\n * @param {string} [format] Property format\r\n * @return {string|undefined} CSS width or undefined\r\n */\r\nfunction getDefaultWidth(type, format) {\r\n\tif (format) {\r\n\t\treturn DEFAULT_WIDTHS[`${type}:${format}`]\r\n\t}\r\n\treturn DEFAULT_WIDTHS[type]\r\n}\r\n\r\n/**\r\n * Generate CnDataTable column definitions from a schema's properties.\r\n *\r\n * Reads `schema.properties` and creates column objects sorted by the `order`\r\n * hint (if present) then alphabetically. Filters out properties marked\r\n * `visible: false`. Supports include/exclude lists and per-column overrides.\r\n *\r\n * @param {object} schema The schema object with a `properties` field\r\n * @param {object} [options] Configuration options\r\n * @param {string[]} [options.exclude] Property keys to exclude\r\n * @param {string[]} [options.include] Property keys to include (whitelist mode)\r\n * @param {object} [options.overrides] Per-key column overrides, e.g. `{ status: { width: '200px' } }`\r\n * @return {Array<{key: string, label: string, sortable: boolean, type: string, format: string, width: string}>}\r\n */\r\nexport function columnsFromSchema(schema, options = {}) {\r\n\tconst { exclude = [], include = null, overrides = {} } = options\r\n\r\n\tif (!schema || !schema.properties) {\r\n\t\treturn []\r\n\t}\r\n\r\n\tconst entries = Object.entries(schema.properties)\r\n\t\t.filter(([key, prop]) => {\r\n\t\t\t// Skip properties marked as not visible\r\n\t\t\tif (prop.visible === false) return false\r\n\t\t\t// Apply exclude list\r\n\t\t\tif (exclude.includes(key)) return false\r\n\t\t\t// Apply include whitelist\r\n\t\t\tif (include && !include.includes(key)) return false\r\n\t\t\t// Skip complex object types by default (they don't render well in tables)\r\n\t\t\tif (prop.type === 'object') return false\r\n\t\t\treturn true\r\n\t\t})\r\n\t\t.sort(([keyA, propA], [keyB, propB]) => {\r\n\t\t\t// Sort by order hint first, then alphabetically\r\n\t\t\tconst orderA = typeof propA.order === 'number' ? propA.order : Infinity\r\n\t\t\tconst orderB = typeof propB.order === 'number' ? propB.order : Infinity\r\n\t\t\tif (orderA !== orderB) return orderA - orderB\r\n\t\t\treturn keyA.localeCompare(keyB)\r\n\t\t})\r\n\r\n\treturn entries.map(([key, prop]) => {\r\n\t\tconst column = {\r\n\t\t\tkey,\r\n\t\t\tlabel: prop.title || key,\r\n\t\t\tsortable: true,\r\n\t\t\ttype: prop.type || 'string',\r\n\t\t\tformat: prop.format || null,\r\n\t\t}\r\n\r\n\t\t// Apply default width\r\n\t\tconst defaultWidth = getDefaultWidth(column.type, column.format)\r\n\t\tif (defaultWidth) {\r\n\t\t\tcolumn.width = defaultWidth\r\n\t\t}\r\n\r\n\t\t// Store enum values for cell renderer\r\n\t\tif (prop.enum) {\r\n\t\t\tcolumn.enum = prop.enum\r\n\t\t}\r\n\r\n\t\t// Store items type for arrays\r\n\t\tif (prop.items) {\r\n\t\t\tcolumn.items = prop.items\r\n\t\t}\r\n\r\n\t\t// Apply per-column overrides\r\n\t\tif (overrides[key]) {\r\n\t\t\tObject.assign(column, overrides[key])\r\n\t\t}\r\n\r\n\t\treturn column\r\n\t})\r\n}\r\n\r\n/**\r\n * Format a cell value based on its schema property definition.\r\n *\r\n * Handles dates, booleans, arrays, numbers, UUIDs, emails, and markdown.\r\n * Returns a plain string suitable for display in a table cell.\r\n *\r\n * @param {*} value The raw value\r\n * @param {object} [property] The schema property definition `{ type, format, enum, items }`\r\n * @param {object} [options] Formatting options\r\n * @param {number} [options.truncate=100] Maximum string length before truncation\r\n * @return {string} Formatted display string\r\n */\r\nexport function formatValue(value, property = {}, options = {}) {\r\n\tconst { truncate = 100 } = options\r\n\r\n\t// Null/undefined/empty\r\n\tif (value === null || value === undefined || value === '') {\r\n\t\treturn '—'\r\n\t}\r\n\r\n\tconst { type = 'string', format } = property\r\n\r\n\t// Boolean\r\n\tif (type === 'boolean' || typeof value === 'boolean') {\r\n\t\treturn value ? '✓' : '—'\r\n\t}\r\n\r\n\t// Number/Integer\r\n\tif (type === 'integer' || type === 'number') {\r\n\t\tconst num = Number(value)\r\n\t\tif (Number.isNaN(num)) return String(value)\r\n\t\treturn num.toLocaleString()\r\n\t}\r\n\r\n\t// Array\r\n\tif (type === 'array' || Array.isArray(value)) {\r\n\t\tif (!Array.isArray(value)) return String(value)\r\n\t\tif (value.length === 0) return '—'\r\n\t\t// For short arrays, join values\r\n\t\tif (value.length <= 3) {\r\n\t\t\treturn value.join(', ')\r\n\t\t}\r\n\t\treturn `${value.slice(0, 3).join(', ')} +${value.length - 3}`\r\n\t}\r\n\r\n\t// Object (shouldn't normally appear in tables)\r\n\tif (type === 'object' || (typeof value === 'object' && value !== null)) {\r\n\t\treturn '[Object]'\r\n\t}\r\n\r\n\t// String types\r\n\tconst str = String(value)\r\n\r\n\t// Date-time\r\n\tif (format === 'date-time' || format === 'date') {\r\n\t\ttry {\r\n\t\t\tconst date = new Date(str)\r\n\t\t\tif (Number.isNaN(date.getTime())) return str\r\n\t\t\tif (format === 'date') {\r\n\t\t\t\treturn date.toLocaleDateString(undefined, {\r\n\t\t\t\t\tday: '2-digit',\r\n\t\t\t\t\tmonth: '2-digit',\r\n\t\t\t\t\tyear: 'numeric',\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\treturn date.toLocaleDateString(undefined, {\r\n\t\t\t\tday: '2-digit',\r\n\t\t\t\tmonth: '2-digit',\r\n\t\t\t\tyear: 'numeric',\r\n\t\t\t}) + ', ' + date.toLocaleTimeString(undefined, {\r\n\t\t\t\thour: '2-digit',\r\n\t\t\t\tminute: '2-digit',\r\n\t\t\t\tsecond: '2-digit',\r\n\t\t\t})\r\n\t\t} catch {\r\n\t\t\treturn str\r\n\t\t}\r\n\t}\r\n\r\n\t// UUID — truncate to first 8 chars\r\n\tif (format === 'uuid') {\r\n\t\tif (str.length > 8) {\r\n\t\t\treturn str.substring(0, 8) + '...'\r\n\t\t}\r\n\t\treturn str\r\n\t}\r\n\r\n\t// URI — show truncated\r\n\tif (format === 'uri' || format === 'url') {\r\n\t\ttry {\r\n\t\t\tconst url = new URL(str)\r\n\t\t\treturn url.hostname + url.pathname.substring(0, 20)\r\n\t\t} catch {\r\n\t\t\treturn truncateString(str, truncate)\r\n\t\t}\r\n\t}\r\n\r\n\t// Markdown — strip formatting\r\n\tif (format === 'markdown') {\r\n\t\tconst stripped = str\r\n\t\t\t.replace(/#{1,6}\\s+/g, '') // headings\r\n\t\t\t.replace(/[*_]{1,3}([^*_]+)[*_]{1,3}/g, '$1') // bold/italic\r\n\t\t\t.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // links\r\n\t\t\t.replace(/`{1,3}[^`]*`{1,3}/g, '') // code\r\n\t\t\t.replace(/\\n+/g, ' ') // newlines\r\n\t\t\t.trim()\r\n\t\treturn truncateString(stripped, truncate)\r\n\t}\r\n\r\n\t// Email — display as-is (no truncation)\r\n\tif (format === 'email') {\r\n\t\treturn str\r\n\t}\r\n\r\n\t// Plain string — truncate if needed\r\n\treturn truncateString(str, truncate)\r\n}\r\n\r\n/**\r\n * Truncate a string to the given length, adding ellipsis if needed.\r\n *\r\n * @param {string} str The string to truncate\r\n * @param {number} maxLength Maximum length\r\n * @return {string} Truncated string\r\n */\r\nfunction truncateString(str, maxLength) {\r\n\tif (str.length <= maxLength) return str\r\n\treturn str.substring(0, maxLength) + '...'\r\n}\r\n\r\n/**\r\n * Resolve the form widget type for a JSON Schema property.\r\n *\r\n * Resolution priority (first match wins):\r\n * 1. Explicit `prop.widget` — pass-through custom widget name\r\n * 2. `prop.enum` → `'select'`\r\n * 3. Type-based: `boolean` → `'checkbox'`, `integer`/`number` → `'number'`,\r\n * `array` + `items.enum` → `'multiselect'`, `array` → `'tags'`\r\n * 4. Format-based: `date-time` → `'datetime'`, `date` → `'date'`,\r\n * `email` → `'email'`, `uri`/`url` → `'url'`,\r\n * `markdown`/`textarea` → `'textarea'`\r\n * 5. Long text: `maxLength > 255` → `'textarea'`\r\n * 6. Fallback → `'text'`\r\n *\r\n * @param {object} prop The schema property definition (type, format, enum, widget, items, maxLength)\r\n * @return {string} Widget identifier: 'text'|'email'|'url'|'number'|'checkbox'|'select'|'multiselect'|'tags'|'textarea'|'date'|'datetime' or a custom string\r\n */\r\nfunction resolveWidget(prop) {\r\n\t// Explicit widget hint takes priority\r\n\tif (prop.widget) return prop.widget\r\n\r\n\t// Enum → select\r\n\tif (prop.enum) return 'select'\r\n\r\n\tconst type = prop.type || 'string'\r\n\tconst format = prop.format || ''\r\n\r\n\t// Boolean → switch/checkbox\r\n\tif (type === 'boolean') return 'checkbox'\r\n\r\n\t// Number types\r\n\tif (type === 'integer' || type === 'number') return 'number'\r\n\r\n\t// Array types\r\n\tif (type === 'array') {\r\n\t\tif (prop.items && prop.items.enum) return 'multiselect'\r\n\t\treturn 'tags'\r\n\t}\r\n\r\n\t// Format-based widgets\r\n\tif (format === 'date-time') return 'datetime'\r\n\tif (format === 'date') return 'date'\r\n\tif (format === 'email') return 'email'\r\n\tif (format === 'uri' || format === 'url') return 'url'\r\n\tif (format === 'markdown' || format === 'textarea') return 'textarea'\r\n\r\n\t// Long text → textarea\r\n\tif (prop.maxLength && prop.maxLength > 255) return 'textarea'\r\n\r\n\treturn 'text'\r\n}\r\n\r\n/**\r\n * Generate form field definitions from a schema's properties.\r\n *\r\n * Reads `schema.properties` and creates field descriptor objects suitable\r\n * for auto-generating form UIs. Follows the same pattern as\r\n * `columnsFromSchema()` — filters, sorts, and supports overrides.\r\n *\r\n * @param {object} schema The schema object with a `properties` field\r\n * @param {object} [options] Configuration options\r\n * @param {string[]} [options.exclude] Property keys to exclude\r\n * @param {string[]} [options.include] Property keys to include (whitelist mode)\r\n * @param {object} [options.overrides] Per-key field overrides, e.g. `{ status: { widget: 'select' } }`\r\n * @param {boolean} [options.includeReadOnly=false] Whether to include readOnly properties\r\n * @return {Array<{key: string, label: string, description: string, type: string, format: string|null, widget: string, required: boolean, readOnly: boolean, default: *, enum: Array|null, items: object|null, validation: object, order: number}>}\r\n */\r\nexport function fieldsFromSchema(schema, options = {}) {\r\n\tconst { exclude = [], include = null, overrides = {}, includeReadOnly = false } = options\r\n\r\n\tif (!schema || !schema.properties) {\r\n\t\treturn []\r\n\t}\r\n\r\n\tconst requiredKeys = Array.isArray(schema.required) ? schema.required : []\r\n\r\n\tconst entries = Object.entries(schema.properties)\r\n\t\t.filter(([key, prop]) => {\r\n\t\t\t// Skip properties marked as not visible\r\n\t\t\tif (prop.visible === false) return false\r\n\t\t\t// Skip readOnly properties by default\r\n\t\t\tif (prop.readOnly === true && !includeReadOnly) return false\r\n\t\t\t// Apply exclude list\r\n\t\t\tif (exclude.includes(key)) return false\r\n\t\t\t// Apply include whitelist\r\n\t\t\tif (include && !include.includes(key)) return false\r\n\t\t\t// Skip complex object types (not supported in auto-form)\r\n\t\t\tif (prop.type === 'object') return false\r\n\t\t\treturn true\r\n\t\t})\r\n\t\t.sort(([keyA, propA], [keyB, propB]) => {\r\n\t\t\t// Sort by order hint first, then alphabetically\r\n\t\t\tconst orderA = typeof propA.order === 'number' ? propA.order : Infinity\r\n\t\t\tconst orderB = typeof propB.order === 'number' ? propB.order : Infinity\r\n\t\t\tif (orderA !== orderB) return orderA - orderB\r\n\t\t\treturn keyA.localeCompare(keyB)\r\n\t\t})\r\n\r\n\treturn entries.map(([key, prop]) => {\r\n\t\tconst field = {\r\n\t\t\tkey,\r\n\t\t\tlabel: prop.title || key,\r\n\t\t\tdescription: prop.description || '',\r\n\t\t\ttype: prop.type || 'string',\r\n\t\t\tformat: prop.format || null,\r\n\t\t\twidget: resolveWidget(prop),\r\n\t\t\trequired: requiredKeys.includes(key),\r\n\t\t\treadOnly: prop.readOnly || false,\r\n\t\t\tdefault: prop.default !== undefined ? prop.default : null,\r\n\t\t\tenum: prop.enum || null,\r\n\t\t\titems: prop.items || null,\r\n\t\t\tvalidation: {\r\n\t\t\t\tminLength: prop.minLength,\r\n\t\t\t\tmaxLength: prop.maxLength,\r\n\t\t\t\tminimum: prop.minimum,\r\n\t\t\t\tmaximum: prop.maximum,\r\n\t\t\t\tpattern: prop.pattern,\r\n\t\t\t},\r\n\t\t\torder: typeof prop.order === 'number' ? prop.order : Infinity,\r\n\t\t}\r\n\r\n\t\t// Apply per-field overrides\r\n\t\tif (overrides[key]) {\r\n\t\t\tObject.assign(field, overrides[key])\r\n\t\t}\r\n\r\n\t\treturn field\r\n\t})\r\n}\r\n\r\n/**\r\n * Generate faceted filter definitions from a schema's facetable properties.\r\n *\r\n * Reads `schema.properties` and creates filter definitions for properties\r\n * marked with `facetable: true`. Maps property types to appropriate filter\r\n * widget types (select, checkbox, text).\r\n *\r\n * @param {object} schema The schema object with a `properties` field\r\n * @return {Array<{key: string, label: string, type: string, propertyType: string, options: Array}>}\r\n */\r\nexport function filtersFromSchema(schema) {\r\n\tif (!schema || !schema.properties) {\r\n\t\treturn []\r\n\t}\r\n\r\n\treturn Object.entries(schema.properties)\r\n\t\t.filter(([, prop]) => prop.facetable === true)\r\n\t\t.sort(([keyA, propA], [keyB, propB]) => {\r\n\t\t\tconst orderA = typeof propA.order === 'number' ? propA.order : Infinity\r\n\t\t\tconst orderB = typeof propB.order === 'number' ? propB.order : Infinity\r\n\t\t\tif (orderA !== orderB) return orderA - orderB\r\n\t\t\treturn keyA.localeCompare(keyB)\r\n\t\t})\r\n\t\t.map(([key, prop]) => {\r\n\t\t\tconst filter = {\r\n\t\t\t\tkey,\r\n\t\t\t\tlabel: prop.title || key,\r\n\t\t\t\tdescription: prop.description || '',\r\n\t\t\t\tpropertyType: prop.type || 'string',\r\n\t\t\t\toptions: [],\r\n\t\t\t\tvalue: null,\r\n\t\t\t}\r\n\r\n\t\t\t// Map property type to filter widget type\r\n\t\t\tif (prop.type === 'boolean') {\r\n\t\t\t\tfilter.type = 'checkbox'\r\n\t\t\t} else if (prop.enum) {\r\n\t\t\t\tfilter.type = 'select'\r\n\t\t\t\tfilter.options = prop.enum.map((val) => ({\r\n\t\t\t\t\tid: val,\r\n\t\t\t\t\tlabel: val,\r\n\t\t\t\t}))\r\n\t\t\t} else {\r\n\t\t\t\t// Default to select — options loaded dynamically from facet API\r\n\t\t\t\tfilter.type = 'select'\r\n\t\t\t}\r\n\r\n\t\t\treturn filter\r\n\t\t})\r\n}\r\n","<template>\r\n\t<span\r\n\t\tclass=\"cn-status-badge\"\r\n\t\t:class=\"badgeClasses\">\r\n\t\t<slot>{{ label }}</slot>\r\n\t</span>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * CnStatusBadge — Color-coded pill badge for status, priority, or category display.\r\n *\r\n * Replaces the various .status-badge / .priority-badge CSS patterns duplicated\r\n * across Pipelinq and Procest. Supports a colorMap for automatic variant lookup.\r\n *\r\n * @example\r\n * <CnStatusBadge label=\"Open\" variant=\"success\" />\r\n * <CnStatusBadge label=\"Urgent\" variant=\"error\" size=\"small\" />\r\n *\r\n * @example\r\n * <!-- With colorMap: variant auto-resolved from label -->\r\n * <CnStatusBadge\r\n * label=\"overdue\"\r\n * :color-map=\"{ open: 'success', closed: 'default', overdue: 'error' }\" />\r\n */\r\nexport default {\r\n\tname: 'CnStatusBadge',\r\n\r\n\tprops: {\r\n\t\t/** Badge label text */\r\n\t\tlabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/**\r\n\t\t * Color variant: 'default', 'primary', 'success', 'warning', 'error', 'info'\r\n\t\t */\r\n\t\tvariant: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'default',\r\n\t\t\tvalidator: (v) => ['default', 'primary', 'success', 'warning', 'error', 'info'].includes(v),\r\n\t\t},\r\n\t\t/** Size: 'small' or 'medium' */\r\n\t\tsize: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'medium',\r\n\t\t\tvalidator: (v) => ['small', 'medium'].includes(v),\r\n\t\t},\r\n\t\t/**\r\n\t\t * Map of label values to variants. When provided, the variant is resolved\r\n\t\t * from this map using the label (case-insensitive). Falls back to the variant prop.\r\n\t\t * @example { open: 'success', closed: 'default', overdue: 'error' }\r\n\t\t */\r\n\t\tcolorMap: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tresolvedVariant() {\r\n\t\t\tif (this.colorMap && this.label) {\r\n\t\t\t\tconst key = this.label.toLowerCase()\r\n\t\t\t\treturn this.colorMap[key] || this.variant\r\n\t\t\t}\r\n\t\t\treturn this.variant\r\n\t\t},\r\n\r\n\t\tbadgeClasses() {\r\n\t\t\treturn {\r\n\t\t\t\t['cn-status-badge--' + this.resolvedVariant]: true,\r\n\t\t\t\t'cn-status-badge--small': this.size === 'small',\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {\r\n if (typeof shadowMode !== 'boolean') {\r\n createInjectorSSR = createInjector;\r\n createInjector = shadowMode;\r\n shadowMode = false;\r\n }\r\n // Vue.extend constructor export interop.\r\n const options = typeof script === 'function' ? script.options : script;\r\n // render functions\r\n if (template && template.render) {\r\n options.render = template.render;\r\n options.staticRenderFns = template.staticRenderFns;\r\n options._compiled = true;\r\n // functional template\r\n if (isFunctionalTemplate) {\r\n options.functional = true;\r\n }\r\n }\r\n // scopedId\r\n if (scopeId) {\r\n options._scopeId = scopeId;\r\n }\r\n let hook;\r\n if (moduleIdentifier) {\r\n // server build\r\n hook = function (context) {\r\n // 2.3 injection\r\n context =\r\n context || // cached call\r\n (this.$vnode && this.$vnode.ssrContext) || // stateful\r\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional\r\n // 2.2 with runInNewContext: true\r\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\r\n context = __VUE_SSR_CONTEXT__;\r\n }\r\n // inject component styles\r\n if (style) {\r\n style.call(this, createInjectorSSR(context));\r\n }\r\n // register component module identifier for async chunk inference\r\n if (context && context._registeredComponents) {\r\n context._registeredComponents.add(moduleIdentifier);\r\n }\r\n };\r\n // used by ssr in case component is cached and beforeCreate\r\n // never gets called\r\n options._ssrRegister = hook;\r\n }\r\n else if (style) {\r\n hook = shadowMode\r\n ? function (context) {\r\n style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));\r\n }\r\n : function (context) {\r\n style.call(this, createInjector(context));\r\n };\r\n }\r\n if (hook) {\r\n if (options.functional) {\r\n // register for functional component in vue file\r\n const originalRender = options.render;\r\n options.render = function renderWithStyleInjection(h, context) {\r\n hook.call(context);\r\n return originalRender(h, context);\r\n };\r\n }\r\n else {\r\n // inject component registration as beforeCreate hook\r\n const existing = options.beforeCreate;\r\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook];\r\n }\r\n }\r\n return script;\r\n}\n\nexport default normalizeComponent;\n//# sourceMappingURL=normalize-component.mjs.map\n","<template>\r\n\t<span class=\"cn-cell-renderer\" :class=\"cellClass\">\r\n\t\t<!-- Boolean: icon -->\r\n\t\t<template v-if=\"propertyType === 'boolean'\">\r\n\t\t\t<CheckBold v-if=\"value\" :size=\"16\" class=\"cn-cell-renderer__icon cn-cell-renderer__icon--success\" />\r\n\t\t\t<span v-else class=\"cn-cell-renderer__dash\">—</span>\r\n\t\t</template>\r\n\r\n\t\t<!-- Enum: status badge -->\r\n\t\t<template v-else-if=\"isEnum\">\r\n\t\t\t<CnStatusBadge v-if=\"value\" :label=\"String(value)\" />\r\n\t\t\t<span v-else class=\"cn-cell-renderer__dash\">—</span>\r\n\t\t</template>\r\n\r\n\t\t<!-- Array: comma-joined or count -->\r\n\t\t<template v-else-if=\"propertyType === 'array'\">\r\n\t\t\t<span v-if=\"!value || !value.length\" class=\"cn-cell-renderer__dash\">—</span>\r\n\t\t\t<span v-else :title=\"Array.isArray(value) ? value.join(', ') : ''\">\r\n\t\t\t\t{{ formattedValue }}\r\n\t\t\t</span>\r\n\t\t</template>\r\n\r\n\t\t<!-- Default: formatted text -->\r\n\t\t<template v-else>\r\n\t\t\t<span :title=\"rawTitle\">{{ formattedValue }}</span>\r\n\t\t</template>\r\n\t</span>\r\n</template>\r\n\r\n<script>\r\nimport { formatValue } from '../../utils/schema.js'\r\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\r\nimport CheckBold from 'vue-material-design-icons/CheckBold.vue'\r\n\r\n/**\r\n * CnCellRenderer — Type-aware cell renderer for schema-driven tables.\r\n *\r\n * Renders a single cell value based on its schema property definition.\r\n * Booleans render as icons, enums as status badges, dates as formatted strings,\r\n * and everything else as truncated text via `formatValue()`.\r\n *\r\n * @example\r\n * <CnCellRenderer :value=\"row.status\" :property=\"schema.properties.status\" />\r\n */\r\nexport default {\r\n\tname: 'CnCellRenderer',\r\n\r\n\tcomponents: {\r\n\t\tCnStatusBadge,\r\n\t\tCheckBold,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** The raw cell value */\r\n\t\tvalue: {\r\n\t\t\ttype: [String, Number, Boolean, Array, Object],\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Schema property definition: { type, format, enum, items, title } */\r\n\t\tproperty: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Maximum string length before truncation */\r\n\t\ttruncate: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 100,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tpropertyType() {\r\n\t\t\treturn this.property?.type || (typeof this.value)\r\n\t\t},\r\n\r\n\t\tisEnum() {\r\n\t\t\treturn !!(this.property?.enum && this.property.enum.length > 0)\r\n\t\t},\r\n\r\n\t\tformattedValue() {\r\n\t\t\treturn formatValue(this.value, this.property, { truncate: this.truncate })\r\n\t\t},\r\n\r\n\t\trawTitle() {\r\n\t\t\t// Show full value on hover if it was truncated\r\n\t\t\tconst raw = this.value\r\n\t\t\tif (typeof raw === 'string' && raw.length > this.truncate) {\r\n\t\t\t\treturn raw\r\n\t\t\t}\r\n\t\t\treturn undefined\r\n\t\t},\r\n\r\n\t\tcellClass() {\r\n\t\t\tconst classes = []\r\n\t\t\tif (this.propertyType === 'boolean') classes.push('cn-cell-renderer--boolean')\r\n\t\t\tif (this.isEnum) classes.push('cn-cell-renderer--enum')\r\n\t\t\tif (this.property?.format === 'date-time' || this.property?.format === 'date') {\r\n\t\t\t\tclasses.push('cn-cell-renderer--date')\r\n\t\t\t}\r\n\t\t\tif (this.property?.format === 'uuid') classes.push('cn-cell-renderer--uuid')\r\n\t\t\tif (this.propertyType === 'integer' || this.propertyType === 'number') {\r\n\t\t\t\tclasses.push('cn-cell-renderer--number')\r\n\t\t\t}\r\n\t\t\treturn classes\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-cell-renderer--uuid {\r\n\tfont-family: monospace;\r\n\tfont-size: 13px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-cell-renderer--number {\r\n\tfont-variant-numeric: tabular-nums;\r\n}\r\n\r\n.cn-cell-renderer--date {\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-cell-renderer__dash {\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-cell-renderer__icon--success {\r\n\tcolor: var(--color-success);\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-table-container\" :class=\"{ 'cn-table-container--scrollable': scrollable }\">\r\n\t\t<!-- Loading State -->\r\n\t\t<div v-if=\"loading\" class=\"cn-table-loading\">\r\n\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t\t<p>{{ loadingText }}</p>\r\n\t\t</div>\r\n\r\n\t\t<!-- Table -->\r\n\t\t<table v-else class=\"cn-data-table\">\r\n\t\t\t<thead>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<!-- Checkbox column -->\r\n\t\t\t\t\t<th v-if=\"selectable\" class=\"cn-table-col--checkbox\">\r\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t\t\t:checked=\"allSelected\"\r\n\t\t\t\t\t\t\t:indeterminate=\"someSelected && !allSelected\"\r\n\t\t\t\t\t\t\t@update:checked=\"toggleSelectAll\" />\r\n\t\t\t\t\t</th>\r\n\r\n\t\t\t\t\t<!-- Data columns -->\r\n\t\t\t\t\t<th\r\n\t\t\t\t\t\tv-for=\"col in effectiveColumns\"\r\n\t\t\t\t\t\t:key=\"col.key\"\r\n\t\t\t\t\t\t:class=\"[\r\n\t\t\t\t\t\t\tcol.sortable ? 'cn-table-header--sortable' : '',\r\n\t\t\t\t\t\t\tcol.class || '',\r\n\t\t\t\t\t\t]\"\r\n\t\t\t\t\t\t:style=\"col.width ? { width: col.width } : {}\"\r\n\t\t\t\t\t\t@click=\"col.sortable ? onSort(col.key) : null\">\r\n\t\t\t\t\t\t{{ col.label }}\r\n\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\tv-if=\"col.sortable && sortKey === col.key\"\r\n\t\t\t\t\t\t\tclass=\"cn-table-sort-indicator\">\r\n\t\t\t\t\t\t\t{{ sortOrder === 'asc' ? '▲' : '▼' }}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</th>\r\n\r\n\t\t\t\t\t<!-- Actions column -->\r\n\t\t\t\t\t<th v-if=\"$scopedSlots['row-actions']\" class=\"cn-table-col--actions\">\r\n\t\t\t\t\t\t<!-- Actions header intentionally empty -->\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\r\n\t\t\t<tbody>\r\n\t\t\t\t<!-- Empty state -->\r\n\t\t\t\t<tr v-if=\"rows.length === 0\" class=\"cn-table-empty\">\r\n\t\t\t\t\t<td :colspan=\"totalColumns\">\r\n\t\t\t\t\t\t<slot name=\"empty\">\r\n\t\t\t\t\t\t\t{{ emptyText }}\r\n\t\t\t\t\t\t</slot>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\r\n\t\t\t\t<!-- Data rows -->\r\n\t\t\t\t<tr\r\n\t\t\t\t\tv-for=\"row in rows\"\r\n\t\t\t\t\tv-else\r\n\t\t\t\t\t:key=\"row[rowKey]\"\r\n\t\t\t\t\tclass=\"cn-table-row\"\r\n\t\t\t\t\t:class=\"[\r\n\t\t\t\t\t\tisSelected(row) ? 'cn-table-row--selected' : '',\r\n\t\t\t\t\t\trowClass ? rowClass(row) : '',\r\n\t\t\t\t\t]\"\r\n\t\t\t\t\t@click=\"$emit('row-click', row)\">\r\n\t\t\t\t\t<!-- Checkbox -->\r\n\t\t\t\t\t<td v-if=\"selectable\" class=\"cn-table-col--checkbox\" @click.stop>\r\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t\t\t:checked=\"isSelected(row)\"\r\n\t\t\t\t\t\t\t@update:checked=\"toggleSelect(row)\" />\r\n\t\t\t\t\t</td>\r\n\r\n\t\t\t\t\t<!-- Data cells -->\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tv-for=\"col in effectiveColumns\"\r\n\t\t\t\t\t\t:key=\"col.key\"\r\n\t\t\t\t\t\t:class=\"col.cellClass || ''\"\r\n\t\t\t\t\t\t:style=\"col.width ? { maxWidth: col.width } : {}\">\r\n\t\t\t\t\t\t<slot :name=\"'column-' + col.key\" :row=\"row\" :value=\"getCellValue(row, col.key)\">\r\n\t\t\t\t\t\t\t<!-- Schema-driven: use CnCellRenderer -->\r\n\t\t\t\t\t\t\t<CnCellRenderer\r\n\t\t\t\t\t\t\t\tv-if=\"isSchemaColumn(col)\"\r\n\t\t\t\t\t\t\t\t:value=\"getCellValue(row, col.key)\"\r\n\t\t\t\t\t\t\t\t:property=\"getSchemaProperty(col.key)\" />\r\n\t\t\t\t\t\t\t<!-- Manual: plain text -->\r\n\t\t\t\t\t\t\t<template v-else>\r\n\t\t\t\t\t\t\t\t{{ getCellValue(row, col.key) }}\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t</slot>\r\n\t\t\t\t\t</td>\r\n\r\n\t\t\t\t\t<!-- Row actions -->\r\n\t\t\t\t\t<td v-if=\"$scopedSlots['row-actions']\" class=\"cn-table-col--actions\" @click.stop>\r\n\t\t\t\t\t\t<slot name=\"row-actions\" :row=\"row\" />\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon, NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport { CnCellRenderer } from '../CnCellRenderer/index.js'\r\nimport { columnsFromSchema } from '../../utils/schema.js'\r\n\r\n/**\r\n * CnDataTable — Generic sortable data table for list views.\r\n *\r\n * Replaces the copy-pasted `<table class=\"viewTable\">` HTML pattern found in\r\n * every list view across OpenRegister, Pipelinq, and Procest. Supports sorting,\r\n * row selection, custom cell rendering via scoped slots, loading states,\r\n * and empty states.\r\n *\r\n * When a `schema` prop is provided, columns are auto-generated from schema\r\n * properties and cells render through CnCellRenderer for type-aware formatting\r\n * (dates, booleans, UUIDs, enums, etc.). Scoped slots still override individual\r\n * columns when needed.\r\n *\r\n * @example Manual columns (backwards compatible)\r\n * <CnDataTable\r\n * :columns=\"[\r\n * { key: 'name', label: 'Name', sortable: true },\r\n * { key: 'email', label: 'Email' },\r\n * ]\"\r\n * :rows=\"clients\"\r\n * @row-click=\"openClient\" />\r\n *\r\n * @example Schema-driven (auto columns)\r\n * <CnDataTable :schema=\"schema\" :rows=\"objects\" />\r\n *\r\n * @example Schema with overrides and custom cell\r\n * <CnDataTable\r\n * :schema=\"schema\"\r\n * :exclude-columns=\"['description']\"\r\n * :column-overrides=\"{ status: { width: '200px' } }\"\r\n * :rows=\"objects\">\r\n * <template #column-status=\"{ row, value }\">\r\n * <QuickStatusDropdown :case-obj=\"row\" />\r\n * </template>\r\n * </CnDataTable>\r\n */\r\nexport default {\r\n\tname: 'CnDataTable',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tCnCellRenderer,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/**\r\n\t\t * Column definitions (manual mode).\r\n\t\t * Not required when `schema` is provided.\r\n\t\t * @type {Array<{key: string, label: string, sortable?: boolean, width?: string, class?: string, cellClass?: string}>}\r\n\t\t */\r\n\t\tcolumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/**\r\n\t\t * Schema object with `properties` field (schema-driven mode).\r\n\t\t * When provided, columns are auto-generated from schema properties.\r\n\t\t */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Per-column overrides when using schema mode: { key: { width, label, sortable, ... } } */\r\n\t\tcolumnOverrides: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Column keys to exclude when using schema mode */\r\n\t\texcludeColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Column keys to include when using schema mode (whitelist) */\r\n\t\tincludeColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Row data array. Each row should have a unique identifier (see rowKey). */\r\n\t\trows: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Whether data is loading (shows loading spinner) */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Current sort column key */\r\n\t\tsortKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Current sort order: 'asc' or 'desc' */\r\n\t\tsortOrder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'asc',\r\n\t\t\tvalidator: (v) => ['asc', 'desc'].includes(v),\r\n\t\t},\r\n\t\t/** Whether rows can be selected with checkboxes */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Array of currently selected row IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Property name used as unique row identifier */\r\n\t\trowKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'id',\r\n\t\t},\r\n\t\t/** Text shown when there are no rows */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items found',\r\n\t\t},\r\n\t\t/** Function returning CSS class(es) for a row: (row) => string|object */\r\n\t\trowClass: {\r\n\t\t\ttype: Function,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Whether to constrain table height and make it scrollable */\r\n\t\tscrollable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Text shown while loading */\r\n\t\tloadingText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Loading...',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\t/**\r\n\t\t * Effective columns: schema-generated or manually provided.\r\n\t\t * Schema columns take precedence when schema is provided and no manual columns given.\r\n\t\t */\r\n\t\teffectiveColumns() {\r\n\t\t\tif (this.schema && this.columns.length === 0) {\r\n\t\t\t\treturn columnsFromSchema(this.schema, {\r\n\t\t\t\t\texclude: this.excludeColumns,\r\n\t\t\t\t\tinclude: this.includeColumns,\r\n\t\t\t\t\toverrides: this.columnOverrides,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\treturn this.columns\r\n\t\t},\r\n\r\n\t\ttotalColumns() {\r\n\t\t\tlet count = this.effectiveColumns.length\r\n\t\t\tif (this.selectable) count++\r\n\t\t\tif (this.$scopedSlots['row-actions']) count++\r\n\t\t\treturn count\r\n\t\t},\r\n\r\n\t\tallSelected() {\r\n\t\t\treturn this.rows.length > 0\r\n\t\t\t\t&& this.rows.every((row) => this.selectedIds.includes(row[this.rowKey]))\r\n\t\t},\r\n\r\n\t\tsomeSelected() {\r\n\t\t\treturn this.rows.some((row) => this.selectedIds.includes(row[this.rowKey]))\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Get a cell value from a row using dot-notation key.\r\n\t\t * @param {object} row The row data\r\n\t\t * @param {string} key The column key (supports dot notation: 'address.city')\r\n\t\t * @return {*} The cell value\r\n\t\t */\r\n\t\tgetCellValue(row, key) {\r\n\t\t\tif (key.includes('.')) {\r\n\t\t\t\treturn key.split('.').reduce((obj, k) => obj?.[k], row)\r\n\t\t\t}\r\n\t\t\treturn row[key]\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Check if a column was generated from schema (has type info).\r\n\t\t * @param {object} col Column definition\r\n\t\t * @return {boolean}\r\n\t\t */\r\n\t\tisSchemaColumn(col) {\r\n\t\t\treturn !!(this.schema && col.type)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Get the schema property definition for a column key.\r\n\t\t * @param {string} key Column key\r\n\t\t * @return {object} Property definition\r\n\t\t */\r\n\t\tgetSchemaProperty(key) {\r\n\t\t\treturn this.schema?.properties?.[key] || {}\r\n\t\t},\r\n\r\n\t\tisSelected(row) {\r\n\t\t\treturn this.selectedIds.includes(row[this.rowKey])\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handle sort column click.\r\n\t\t * @param {string} key Column key\r\n\t\t */\r\n\t\tonSort(key) {\r\n\t\t\tlet order = 'asc'\r\n\t\t\tif (this.sortKey === key) {\r\n\t\t\t\torder = this.sortOrder === 'asc' ? 'desc' : 'asc'\r\n\t\t\t}\r\n\t\t\t/**\r\n\t\t\t * @event sort Emitted when a sortable column header is clicked.\r\n\t\t\t * @type {{ key: string, order: 'asc'|'desc' }}\r\n\t\t\t */\r\n\t\t\tthis.$emit('sort', { key, order })\r\n\t\t},\r\n\r\n\t\ttoggleSelect(row) {\r\n\t\t\tconst id = row[this.rowKey]\r\n\t\t\tconst newIds = this.isSelected(row)\r\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\r\n\t\t\t\t: [...this.selectedIds, id]\r\n\t\t\t/** @event select Emitted when row selection changes. Payload: array of selected IDs. */\r\n\t\t\tthis.$emit('select', newIds)\r\n\t\t},\r\n\r\n\t\ttoggleSelectAll() {\r\n\t\t\tif (this.allSelected) {\r\n\t\t\t\tthis.$emit('select', [])\r\n\t\t\t} else {\r\n\t\t\t\tthis.$emit('select', this.rows.map((row) => row[this.rowKey]))\r\n\t\t\t}\r\n\t\t\t/** @event select-all Emitted when select-all checkbox is toggled. */\r\n\t\t\tthis.$emit('select-all', !this.allSelected)\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div class=\"cn-filter-bar\">\r\n\t\t<!-- Search input -->\r\n\t\t<div class=\"cn-filter-bar__search\">\r\n\t\t\t<NcTextField\r\n\t\t\t\t:value=\"searchValue\"\r\n\t\t\t\t:placeholder=\"searchPlaceholder\"\r\n\t\t\t\t:label=\"searchPlaceholder\"\r\n\t\t\t\ttrailing-button-icon=\"close\"\r\n\t\t\t\t:show-trailing-button=\"searchValue !== ''\"\r\n\t\t\t\t@update:value=\"$emit('search', $event)\"\r\n\t\t\t\t@trailing-button-click=\"$emit('search', '')\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<Magnify :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t</NcTextField>\r\n\t\t</div>\r\n\r\n\t\t<!-- Filter controls -->\r\n\t\t<div class=\"cn-filter-bar__filters\">\r\n\t\t\t<template v-for=\"filter in filters\">\r\n\t\t\t\t<!-- Select filter -->\r\n\t\t\t\t<NcSelect\r\n\t\t\t\t\tv-if=\"filter.type === 'select'\"\r\n\t\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\t\tclass=\"cn-filter-bar__filter\"\r\n\t\t\t\t\t:value=\"filter.value\"\r\n\t\t\t\t\t:options=\"filter.options || []\"\r\n\t\t\t\t\t:placeholder=\"filter.label\"\r\n\t\t\t\t\t:input-label=\"filter.label\"\r\n\t\t\t\t\t:clearable=\"true\"\r\n\t\t\t\t\t@input=\"onFilterChange(filter.key, $event)\" />\r\n\r\n\t\t\t\t<!-- Text filter -->\r\n\t\t\t\t<NcTextField\r\n\t\t\t\t\tv-else-if=\"filter.type === 'text'\"\r\n\t\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\t\tclass=\"cn-filter-bar__filter\"\r\n\t\t\t\t\t:value=\"filter.value || ''\"\r\n\t\t\t\t\t:placeholder=\"filter.label\"\r\n\t\t\t\t\t:label=\"filter.label\"\r\n\t\t\t\t\t@update:value=\"onFilterChange(filter.key, $event)\" />\r\n\r\n\t\t\t\t<!-- Checkbox filter -->\r\n\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\tv-else-if=\"filter.type === 'checkbox'\"\r\n\t\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\t\t:checked=\"!!filter.value\"\r\n\t\t\t\t\t@update:checked=\"onFilterChange(filter.key, $event)\">\r\n\t\t\t\t\t{{ filter.label }}\r\n\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t</template>\r\n\t\t</div>\r\n\r\n\t\t<!-- Clear all -->\r\n\t\t<NcButton\r\n\t\t\tv-if=\"showClearAll && hasActiveFilters\"\r\n\t\t\tclass=\"cn-filter-bar__clear\"\r\n\t\t\t@click=\"$emit('clear-all')\">\r\n\t\t\t{{ clearAllLabel }}\r\n\t\t</NcButton>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcTextField, NcSelect, NcButton, NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\r\n\r\n/**\r\n * CnFilterBar — Search and filter controls row for list views.\r\n *\r\n * Extracted from the repeated search + filter pattern in CaseList, ClientList,\r\n * LeadList, RequestList across Pipelinq and Procest. Supports text search,\r\n * select dropdowns, text inputs, and checkbox filters.\r\n *\r\n * @example\r\n * <CnFilterBar\r\n * :search-value=\"searchTerm\"\r\n * search-placeholder=\"Search clients...\"\r\n * :filters=\"[\r\n * { key: 'type', label: 'All types', type: 'select', options: typeOptions, value: selectedType },\r\n * { key: 'active', label: 'Active only', type: 'checkbox', value: showActiveOnly },\r\n * ]\"\r\n * @search=\"onSearch\"\r\n * @filter-change=\"onFilterChange\"\r\n * @clear-all=\"clearFilters\" />\r\n */\r\nexport default {\r\n\tname: 'CnFilterBar',\r\n\r\n\tcomponents: {\r\n\t\tNcTextField,\r\n\t\tNcSelect,\r\n\t\tNcButton,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tMagnify,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/**\r\n\t\t * Filter definitions.\r\n\t\t * @type {Array<{key: string, label: string, type: 'select'|'text'|'checkbox', options?: Array, value?: *}>}\r\n\t\t */\r\n\t\tfilters: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Current search text */\r\n\t\tsearchValue: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Search input placeholder text */\r\n\t\tsearchPlaceholder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Search...',\r\n\t\t},\r\n\t\t/** Whether to show the \"Clear all\" button */\r\n\t\tshowClearAll: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Clear all button label */\r\n\t\tclearAllLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Clear filters',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\thasActiveFilters() {\r\n\t\t\treturn this.searchValue !== ''\r\n\t\t\t\t|| this.filters.some((f) => f.value !== null && f.value !== '' && f.value !== false)\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Emit filter change event.\r\n\t\t * @param {string} key Filter key\r\n\t\t * @param {*} value New filter value\r\n\t\t */\r\n\t\tonFilterChange(key, value) {\r\n\t\t\t/**\r\n\t\t\t * @event filter-change Emitted when any filter changes.\r\n\t\t\t * @type {{ key: string, value: * }}\r\n\t\t\t */\r\n\t\t\tthis.$emit('filter-change', { key, value })\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div v-if=\"totalPages > 1 || totalItems > minItemsToShow\" class=\"cn-pagination\">\r\n\t\t<!-- Page info -->\r\n\t\t<div class=\"cn-pagination__info\">\r\n\t\t\t<span class=\"cn-pagination__page-info\">\r\n\t\t\t\t{{ pageInfoText }}\r\n\t\t\t</span>\r\n\t\t</div>\r\n\r\n\t\t<!-- Page navigation -->\r\n\t\t<div v-if=\"totalPages > 1\" class=\"cn-pagination__nav\">\r\n\t\t\t<NcButton\r\n\t\t\t\t:disabled=\"currentPage === 1\"\r\n\t\t\t\t@click=\"changePage(1)\">\r\n\t\t\t\t{{ firstLabel }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<NcButton\r\n\t\t\t\t:disabled=\"currentPage === 1\"\r\n\t\t\t\t@click=\"changePage(currentPage - 1)\">\r\n\t\t\t\t{{ previousLabel }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<div class=\"cn-pagination__numbers\">\r\n\t\t\t\t<template v-for=\"page in visiblePages\">\r\n\t\t\t\t\t<span v-if=\"page === '...'\" :key=\"'ellipsis-' + page\" class=\"cn-pagination__ellipsis\">...</span>\r\n\t\t\t\t\t<NcButton\r\n\t\t\t\t\t\tv-else\r\n\t\t\t\t\t\t:key=\"page\"\r\n\t\t\t\t\t\t:type=\"page === currentPage ? 'primary' : 'secondary'\"\r\n\t\t\t\t\t\t:disabled=\"page === currentPage\"\r\n\t\t\t\t\t\t@click=\"changePage(page)\">\r\n\t\t\t\t\t\t{{ page }}\r\n\t\t\t\t\t</NcButton>\r\n\t\t\t\t</template>\r\n\t\t\t</div>\r\n\r\n\t\t\t<NcButton\r\n\t\t\t\t:disabled=\"currentPage === totalPages\"\r\n\t\t\t\t@click=\"changePage(currentPage + 1)\">\r\n\t\t\t\t{{ nextLabel }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<NcButton\r\n\t\t\t\t:disabled=\"currentPage === totalPages\"\r\n\t\t\t\t@click=\"changePage(totalPages)\">\r\n\t\t\t\t{{ lastLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</div>\r\n\r\n\t\t<!-- Page size selector -->\r\n\t\t<div class=\"cn-pagination__page-size\">\r\n\t\t\t<label :for=\"pageSizeId\">{{ itemsPerPageLabel }}</label>\r\n\t\t\t<NcSelect\r\n\t\t\t\t:input-id=\"pageSizeId\"\r\n\t\t\t\tclass=\"cn-pagination__page-size-select\"\r\n\t\t\t\t:value=\"currentPageSizeOption\"\r\n\t\t\t\t:options=\"pageSizeOptions\"\r\n\t\t\t\t:clearable=\"false\"\r\n\t\t\t\t:input-label=\"itemsPerPageLabel\"\r\n\t\t\t\t@option:selected=\"changePageSize\" />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcButton, NcSelect } from '@nextcloud/vue'\r\n\r\n/**\r\n * CnPagination — Full pagination with page numbers, navigation, and page size selector.\r\n *\r\n * Extracted from OpenRegister's PaginationComponent. Zero store dependencies.\r\n * Supports First/Previous/Next/Last buttons, smart page number display with\r\n * ellipsis, and configurable page size.\r\n *\r\n * NL Design tokens used:\r\n * - Inherits from cn-pagination CSS class (see css/pagination.css)\r\n *\r\n * @example\r\n * <CnPagination\r\n * :current-page=\"page\"\r\n * :total-pages=\"totalPages\"\r\n * :total-items=\"totalItems\"\r\n * :current-page-size=\"limit\"\r\n * @page-changed=\"onPageChange\"\r\n * @page-size-changed=\"onPageSizeChange\" />\r\n */\r\nexport default {\r\n\tname: 'CnPagination',\r\n\r\n\tcomponents: {\r\n\t\tNcButton,\r\n\t\tNcSelect,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Current page number (1-based) */\r\n\t\tcurrentPage: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 1,\r\n\t\t},\r\n\t\t/** Total number of pages */\r\n\t\ttotalPages: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 1,\r\n\t\t},\r\n\t\t/** Total number of items across all pages */\r\n\t\ttotalItems: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t},\r\n\t\t/** Current items per page */\r\n\t\tcurrentPageSize: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 20,\r\n\t\t},\r\n\t\t/** Available page size options */\r\n\t\tpageSizeOptions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [\r\n\t\t\t\t{ value: 10, label: '10' },\r\n\t\t\t\t{ value: 20, label: '20' },\r\n\t\t\t\t{ value: 50, label: '50' },\r\n\t\t\t\t{ value: 100, label: '100' },\r\n\t\t\t\t{ value: 250, label: '250' },\r\n\t\t\t\t{ value: 500, label: '500' },\r\n\t\t\t\t{ value: 1000, label: '1000' },\r\n\t\t\t],\r\n\t\t},\r\n\t\t/** Minimum items before pagination is shown */\r\n\t\tminItemsToShow: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 10,\r\n\t\t},\r\n\t\t/** Label for \"First\" button */\r\n\t\tfirstLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'First',\r\n\t\t},\r\n\t\t/** Label for \"Previous\" button */\r\n\t\tpreviousLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Previous',\r\n\t\t},\r\n\t\t/** Label for \"Next\" button */\r\n\t\tnextLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Next',\r\n\t\t},\r\n\t\t/** Label for \"Last\" button */\r\n\t\tlastLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Last',\r\n\t\t},\r\n\t\t/** Label for \"Items per page:\" */\r\n\t\titemsPerPageLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Items per page:',\r\n\t\t},\r\n\t\t/**\r\n\t\t * Page info format string. Use {current} and {total} as placeholders.\r\n\t\t * @example \"Page {current} of {total}\"\r\n\t\t */\r\n\t\tpageInfoFormat: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Page {current} of {total}',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tpageSizeId() {\r\n\t\t\treturn 'cn-page-size-' + this._uid\r\n\t\t},\r\n\r\n\t\tcurrentPageSizeOption() {\r\n\t\t\treturn this.pageSizeOptions.find(\r\n\t\t\t\t(option) => option.value === this.currentPageSize,\r\n\t\t\t) || this.pageSizeOptions[1]\r\n\t\t},\r\n\r\n\t\tpageInfoText() {\r\n\t\t\treturn this.pageInfoFormat\r\n\t\t\t\t.replace('{current}', this.currentPage)\r\n\t\t\t\t.replace('{total}', this.totalPages)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Calculate visible page numbers with ellipsis for large page counts.\r\n\t\t * Shows up to 7 page numbers at a time.\r\n\t\t */\r\n\t\tvisiblePages() {\r\n\t\t\tconst current = this.currentPage\r\n\t\t\tconst total = this.totalPages\r\n\t\t\tconst pages = []\r\n\r\n\t\t\tif (total <= 7) {\r\n\t\t\t\tfor (let i = 1; i <= total; i++) {\r\n\t\t\t\t\tpages.push(i)\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tpages.push(1)\r\n\r\n\t\t\t\tif (current <= 4) {\r\n\t\t\t\t\tfor (let i = 2; i <= 5; i++) {\r\n\t\t\t\t\t\tpages.push(i)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpages.push('...')\r\n\t\t\t\t\tpages.push(total)\r\n\t\t\t\t} else if (current >= total - 3) {\r\n\t\t\t\t\tpages.push('...')\r\n\t\t\t\t\tfor (let i = total - 4; i <= total; i++) {\r\n\t\t\t\t\t\tpages.push(i)\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpages.push('...')\r\n\t\t\t\t\tfor (let i = current - 1; i <= current + 1; i++) {\r\n\t\t\t\t\t\tpages.push(i)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpages.push('...')\r\n\t\t\t\t\tpages.push(total)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn pages\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Navigate to a specific page.\r\n\t\t * @param {number} page Target page number\r\n\t\t */\r\n\t\tchangePage(page) {\r\n\t\t\tif (page !== this.currentPage && page >= 1 && page <= this.totalPages) {\r\n\t\t\t\t/** @event page-changed Emitted when page changes. Payload: new page number. */\r\n\t\t\t\tthis.$emit('page-changed', page)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Change the page size.\r\n\t\t * @param {object} option Selected page size option { value, label }\r\n\t\t */\r\n\t\tchangePageSize(option) {\r\n\t\t\tif (option.value !== this.currentPageSize) {\r\n\t\t\t\t/** @event page-size-changed Emitted when page size changes. Payload: new page size. */\r\n\t\t\t\tthis.$emit('page-size-changed', option.value)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div class=\"cn-settings-card\" :class=\"{ 'cn-settings-card--collapsible': collapsible }\">\r\n\t\t<h4\r\n\t\t\tv-if=\"title\"\r\n\t\t\t:class=\"{ 'cn-settings-card__header--clickable': collapsible }\"\r\n\t\t\t@click=\"collapsible ? toggleCollapsed() : null\">\r\n\t\t\t<span>{{ icon }} {{ title }}</span>\r\n\t\t\t<ChevronDown\r\n\t\t\t\tv-if=\"collapsible && !isCollapsed\"\r\n\t\t\t\t:size=\"20\"\r\n\t\t\t\tclass=\"cn-settings-card__chevron\" />\r\n\t\t\t<ChevronUp\r\n\t\t\t\tv-if=\"collapsible && isCollapsed\"\r\n\t\t\t\t:size=\"20\"\r\n\t\t\t\tclass=\"cn-settings-card__chevron\" />\r\n\t\t</h4>\r\n\r\n\t\t<transition v-if=\"collapsible\" name=\"cn-slide-fade\">\r\n\t\t\t<div v-show=\"!isCollapsed\" class=\"cn-settings-card__content\">\r\n\t\t\t\t<slot />\r\n\t\t\t</div>\r\n\t\t</transition>\r\n\r\n\t\t<div v-else>\r\n\t\t\t<slot />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\r\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\r\n\r\n/**\r\n * CnSettingsCard — Collapsible card for settings and configuration sections.\r\n *\r\n * Extracted from OpenRegister's SettingsCard. Provides a titled card with\r\n * optional collapse/expand animation.\r\n *\r\n * @example\r\n * <CnSettingsCard title=\"Database Settings\" icon=\"🗄️\" collapsible>\r\n * <p>Content here</p>\r\n * </CnSettingsCard>\r\n */\r\nexport default {\r\n\tname: 'CnSettingsCard',\r\n\r\n\tcomponents: {\r\n\t\tChevronDown,\r\n\t\tChevronUp,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Card title text */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Icon emoji or text displayed before the title */\r\n\t\ticon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Whether the card can be collapsed */\r\n\t\tcollapsible: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether the card starts collapsed (only applies when collapsible) */\r\n\t\tdefaultCollapsed: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tisCollapsed: this.defaultCollapsed,\r\n\t\t}\r\n\t},\r\n\r\n\tmethods: {\r\n\t\ttoggleCollapsed() {\r\n\t\t\tif (this.collapsible) {\r\n\t\t\t\tthis.isCollapsed = !this.isCollapsed\r\n\t\t\t\t/** @event toggle Emitted when collapse state changes. Payload: isCollapsed boolean. */\r\n\t\t\t\tthis.$emit('toggle', this.isCollapsed)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<NcSettingsSection\r\n\t\t:name=\"name\"\r\n\t\t:description=\"description\"\r\n\t\t:doc-url=\"docUrl\"\r\n\t\tv-bind=\"$attrs\">\r\n\t\t<!-- Action buttons positioned top-right -->\r\n\t\t<div v-if=\"$slots.actions\" class=\"cn-settings-section__actions\">\r\n\t\t\t<slot name=\"actions\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Section Description (optional detailed description box) -->\r\n\t\t<div v-if=\"$slots.description || detailedDescription\" class=\"cn-settings-section__description\">\r\n\t\t\t<slot name=\"description\">\r\n\t\t\t\t<p v-if=\"detailedDescription\" class=\"cn-settings-section__description-text\">\r\n\t\t\t\t\t{{ detailedDescription }}\r\n\t\t\t\t</p>\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- Main Content -->\r\n\t\t<div class=\"cn-settings-section__content\">\r\n\t\t\t<slot />\r\n\t\t</div>\r\n\r\n\t\t<!-- Loading State -->\r\n\t\t<div v-if=\"loading\" class=\"cn-settings-section__loading\">\r\n\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t\t<p>{{ loadingMessage }}</p>\r\n\t\t</div>\r\n\r\n\t\t<!-- Error State -->\r\n\t\t<div v-if=\"error && !loading\" class=\"cn-settings-section__error\">\r\n\t\t\t<p class=\"cn-settings-section__error-message\">\r\n\t\t\t\t{{ errorMessage }}\r\n\t\t\t</p>\r\n\t\t\t<NcButton v-if=\"onRetry\" type=\"primary\" @click=\"onRetry\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<Refresh :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ retryButtonText }}\r\n\t\t\t</NcButton>\r\n\t\t</div>\r\n\r\n\t\t<!-- Empty State -->\r\n\t\t<div v-if=\"empty && !loading && !error\" class=\"cn-settings-section__empty\">\r\n\t\t\t<slot name=\"empty\">\r\n\t\t\t\t<div class=\"cn-settings-section__empty-content\">\r\n\t\t\t\t\t<InformationOutline :size=\"48\" />\r\n\t\t\t\t\t<p>{{ emptyMessage }}</p>\r\n\t\t\t\t</div>\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- Footer Actions -->\r\n\t\t<div v-if=\"$slots.footer\" class=\"cn-settings-section__footer\">\r\n\t\t\t<slot name=\"footer\" />\r\n\t\t</div>\r\n\t</NcSettingsSection>\r\n</template>\r\n\r\n<script>\r\nimport { NcSettingsSection, NcLoadingIcon, NcButton } from '@nextcloud/vue'\r\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\r\nimport InformationOutline from 'vue-material-design-icons/InformationOutline.vue'\r\n\r\n/**\r\n * CnSettingsSection - Admin settings section wrapper with consistent layout.\r\n *\r\n * Wraps NcSettingsSection with action buttons (top-right), loading/error/empty\r\n * states, and a footer slot. Use this as the container for each section on an\r\n * admin settings page.\r\n *\r\n * Extracted from OpenRegister's SettingsSection. Designed for reuse across all\r\n * Conduction Nextcloud apps.\r\n *\r\n * @example Basic usage\r\n * <CnSettingsSection name=\"Cache Management\" description=\"Manage application caches\">\r\n * <template #actions>\r\n * <NcButton @click=\"clearCache\">Clear Cache</NcButton>\r\n * </template>\r\n * <p>Cache hit rate: 94%</p>\r\n * </CnSettingsSection>\r\n *\r\n * @example With loading and error states\r\n * <CnSettingsSection\r\n * name=\"Statistics\"\r\n * :loading=\"isLoading\"\r\n * loading-message=\"Loading statistics...\"\r\n * :error=\"hasError\"\r\n * error-message=\"Failed to load statistics\"\r\n * :on-retry=\"loadStats\">\r\n * <StatsTable :data=\"stats\" />\r\n * </CnSettingsSection>\r\n *\r\n * @example With empty state\r\n * <CnSettingsSection name=\"API Tokens\" :empty=\"tokens.length === 0\" empty-message=\"No tokens configured\">\r\n * <TokenList :tokens=\"tokens\" />\r\n * </CnSettingsSection>\r\n */\r\nexport default {\r\n\tname: 'CnSettingsSection',\r\n\r\n\tcomponents: {\r\n\t\tNcSettingsSection,\r\n\t\tNcLoadingIcon,\r\n\t\tNcButton,\r\n\t\tRefresh,\r\n\t\tInformationOutline,\r\n\t},\r\n\r\n\tinheritAttrs: false,\r\n\r\n\tprops: {\r\n\t\t/** Section name/title */\r\n\t\tname: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Brief section description (shown under title by NcSettingsSection) */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Detailed description shown in a separate block below the title */\r\n\t\tdetailedDescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Documentation URL (shows info icon next to title) */\r\n\t\tdocUrl: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Whether the section is in a loading state */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Message shown during loading */\r\n\t\tloadingMessage: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Loading...',\r\n\t\t},\r\n\t\t/** Whether the section is in an error state */\r\n\t\terror: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Message shown when in error state */\r\n\t\terrorMessage: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'An error occurred',\r\n\t\t},\r\n\t\t/** Callback function for retry button (shown in error state). If null, no retry button is shown. */\r\n\t\tonRetry: {\r\n\t\t\ttype: Function,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Text for the retry button */\r\n\t\tretryButtonText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Retry',\r\n\t\t},\r\n\t\t/** Whether the section has no data to show */\r\n\t\tempty: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Message shown when section is empty */\r\n\t\temptyMessage: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No data available',\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-settings-section__actions {\r\n\tdisplay: flex;\r\n\tgap: 0.5rem;\r\n\talign-items: center;\r\n\tjustify-content: flex-end;\r\n\tfloat: right;\r\n\tmargin-top: -66px;\r\n\tmargin-bottom: 26px;\r\n\tposition: relative;\r\n\tz-index: 10;\r\n}\r\n\r\n.cn-settings-section__content {\r\n\tclear: both;\r\n}\r\n\r\n.cn-settings-section__description-text {\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n.cn-settings-section__loading {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tpadding: 40px 20px;\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-settings-section__loading p {\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-size: 14px;\r\n}\r\n\r\n.cn-settings-section__error {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tpadding: 32px 20px;\r\n\tgap: 16px;\r\n\tbackground: var(--color-error-light);\r\n\tborder: 1px solid var(--color-error);\r\n\tborder-radius: var(--border-radius-large);\r\n}\r\n\r\n.cn-settings-section__error-message {\r\n\tcolor: var(--color-error);\r\n\tfont-weight: 500;\r\n\tmargin: 0;\r\n}\r\n\r\n.cn-settings-section__empty {\r\n\tpadding: 40px 20px;\r\n}\r\n\r\n.cn-settings-section__empty-content {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tgap: 16px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-settings-section__empty-content p {\r\n\tmargin: 0;\r\n\tfont-size: 14px;\r\n}\r\n\r\n.cn-settings-section__footer {\r\n\tmargin-top: 24px;\r\n\tpadding-top: 24px;\r\n\tborder-top: 1px solid var(--color-border);\r\n}\r\n\r\n@media (max-width: 768px) {\r\n\t.cn-settings-section__actions {\r\n\t\tposition: static;\r\n\t\tmargin-top: 0;\r\n\t\tmargin-bottom: 1rem;\r\n\t\tfloat: none;\r\n\t\tflex-direction: column;\r\n\t\talign-items: stretch;\r\n\t}\r\n}\r\n</style>\r\n","<template>\r\n\t<component\r\n\t\t:is=\"clickable ? 'a' : 'div'\"\r\n\t\tclass=\"cn-stats-block\"\r\n\t\t:class=\"rootClasses\"\r\n\t\tv-bind=\"clickable ? { href: '#', role: 'button', tabindex: '0' } : {}\"\r\n\t\t@click=\"onClick\">\r\n\t\t<!-- Icon -->\r\n\t\t<div v-if=\"hasIcon\" class=\"cn-stats-block__icon\" :class=\"iconClasses\">\r\n\t\t\t<slot name=\"icon\">\r\n\t\t\t\t<component :is=\"icon\" v-if=\"icon\" :size=\"iconSize\" />\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- Content -->\r\n\t\t<div class=\"cn-stats-block__content\">\r\n\t\t\t<div class=\"cn-stats-block__header\">\r\n\t\t\t\t<h4>{{ title || 'Objects' }}</h4>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div v-if=\"count > 0\" class=\"cn-stats-block__count\">\r\n\t\t\t\t<span class=\"cn-stats-block__count-value\">{{ formattedCount }}</span>\r\n\t\t\t\t<span class=\"cn-stats-block__count-label\">{{ countLabel }}</span>\r\n\t\t\t</div>\r\n\t\t\t<div v-else-if=\"loading\" class=\"cn-stats-block__loading\">\r\n\t\t\t\t<NcLoadingIcon :size=\"16\" />\r\n\t\t\t\t{{ loadingLabel }}\r\n\t\t\t</div>\r\n\t\t\t<div v-else class=\"cn-stats-block__empty\">\r\n\t\t\t\t{{ emptyLabel }}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Breakdown details -->\r\n\t\t\t<div v-if=\"breakdown && count > 0\" class=\"cn-stats-block__breakdown\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"(value, key) in breakdown\"\r\n\t\t\t\t\t:key=\"key\"\r\n\t\t\t\t\tclass=\"cn-stats-block__breakdown-item\">\r\n\t\t\t\t\t<span class=\"cn-stats-block__breakdown-label\">{{ formatBreakdownLabel(key) }}</span>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\tclass=\"cn-stats-block__breakdown-value\"\r\n\t\t\t\t\t\t:class=\"'cn-stats-block__breakdown-value--' + key\">\r\n\t\t\t\t\t\t{{ value }}\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</component>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon } from '@nextcloud/vue'\r\n\r\n/**\r\n * CnStatsBlock — Statistics display card with icon, count, and optional breakdown.\r\n *\r\n * Supports vertical (default) and horizontal layouts, color variants, icons,\r\n * and clickable state. Use in a CnKpiGrid for responsive dashboard layouts.\r\n *\r\n * @example Basic vertical (default)\r\n * <CnStatsBlock title=\"Cases\" :count=\"42\" count-label=\"open cases\" />\r\n *\r\n * @example Horizontal with icon and variant\r\n * <CnStatsBlock\r\n * title=\"Open Cases\"\r\n * :count=\"42\"\r\n * :icon=\"BriefcaseOutline\"\r\n * variant=\"primary\"\r\n * horizontal\r\n * clickable\r\n * @click=\"goToCases\" />\r\n *\r\n * @example With breakdown\r\n * <CnStatsBlock\r\n * title=\"Cases\"\r\n * :count=\"42\"\r\n * :breakdown=\"{ total: 100, invalid: 3, deleted: 5, published: 92 }\" />\r\n *\r\n * @example Custom icon slot\r\n * <CnStatsBlock title=\"Files\" :count=\"128\">\r\n * <template #icon>\r\n * <FileDocumentOutline :size=\"24\" />\r\n * </template>\r\n * </CnStatsBlock>\r\n */\r\nexport default {\r\n\tname: 'CnStatsBlock',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Block title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** The main count number to display prominently */\r\n\t\tcount: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t},\r\n\t\t/** Label displayed next to the count */\r\n\t\tcountLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'objects',\r\n\t\t},\r\n\t\t/** Detailed breakdown object (key-value pairs) */\r\n\t\tbreakdown: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Whether data is currently loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Text shown while loading */\r\n\t\tloadingLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Loading...',\r\n\t\t},\r\n\t\t/** Text shown when count is 0 */\r\n\t\temptyLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items found',\r\n\t\t},\r\n\t\t/** Icon component (e.g., imported MDI icon) */\r\n\t\ticon: {\r\n\t\t\ttype: [Object, Function],\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Icon size in pixels */\r\n\t\ticonSize: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 24,\r\n\t\t},\r\n\t\t/** Color variant: 'default', 'primary', 'success', 'warning', 'error' */\r\n\t\tvariant: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'default',\r\n\t\t\tvalidator: (v) => ['default', 'primary', 'success', 'warning', 'error'].includes(v),\r\n\t\t},\r\n\t\t/** Use horizontal layout (icon left, content right) */\r\n\t\thorizontal: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether the card is clickable */\r\n\t\tclickable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\thasIcon() {\r\n\t\t\treturn this.icon !== null || this.$scopedSlots.icon || this.$slots.icon\r\n\t\t},\r\n\r\n\t\tformattedCount() {\r\n\t\t\treturn this.count.toLocaleString()\r\n\t\t},\r\n\r\n\t\trootClasses() {\r\n\t\t\treturn {\r\n\t\t\t\t'cn-stats-block--horizontal': this.horizontal,\r\n\t\t\t\t'cn-stats-block--clickable': this.clickable,\r\n\t\t\t\t[`cn-stats-block--${this.variant}`]: this.variant !== 'default',\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ticonClasses() {\r\n\t\t\treturn {\r\n\t\t\t\t[`cn-stats-block__icon--${this.variant}`]: this.variant !== 'default',\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tformatBreakdownLabel(key) {\r\n\t\t\treturn key.charAt(0).toUpperCase() + key.slice(1) + ':'\r\n\t\t},\r\n\r\n\t\tonClick(event) {\r\n\t\t\tif (this.clickable) {\r\n\t\t\t\tevent.preventDefault()\r\n\t\t\t\tthis.$emit('click', event)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-stats-block {\r\n\tbackground: var(--color-background-hover);\r\n\tborder-radius: var(--border-radius-large, 10px);\r\n\tpadding: 1rem;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\ttext-decoration: none;\r\n\tcolor: inherit;\r\n\tborder: 2px solid transparent;\r\n\ttransition: border-color 0.15s ease, box-shadow 0.15s ease;\r\n}\r\n\r\n.cn-stats-block--horizontal {\r\n\tflex-direction: row;\r\n\talign-items: flex-start;\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-stats-block--horizontal .cn-stats-block__content {\r\n\ttext-align: left;\r\n}\r\n\r\n.cn-stats-block--horizontal .cn-stats-block__count {\r\n\tjustify-content: flex-start;\r\n}\r\n\r\n.cn-stats-block--clickable {\r\n\tcursor: pointer;\r\n}\r\n\r\n.cn-stats-block--clickable:hover {\r\n\tborder-color: var(--color-primary-element);\r\n\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.cn-stats-block--clickable:focus-visible {\r\n\toutline: 2px solid var(--color-primary-element);\r\n\toutline-offset: 2px;\r\n}\r\n\r\n/* Icon */\r\n.cn-stats-block__icon {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\twidth: 44px;\r\n\theight: 44px;\r\n\tborder-radius: 50%;\r\n\tbackground: var(--color-primary-element-light, rgba(0, 130, 201, 0.1));\r\n\tcolor: var(--color-primary-element);\r\n\tflex-shrink: 0;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.cn-stats-block--horizontal .cn-stats-block__icon {\r\n\tmargin-bottom: 0;\r\n}\r\n\r\n.cn-stats-block__icon--primary {\r\n\tbackground: var(--color-primary-element-light, rgba(0, 130, 201, 0.1));\r\n\tcolor: var(--color-primary-element);\r\n}\r\n\r\n.cn-stats-block__icon--success {\r\n\tbackground: rgba(70, 186, 97, 0.1);\r\n\tcolor: var(--color-success);\r\n}\r\n\r\n.cn-stats-block__icon--warning {\r\n\tbackground: rgba(232, 163, 24, 0.1);\r\n\tcolor: var(--color-warning);\r\n}\r\n\r\n.cn-stats-block__icon--error {\r\n\tbackground: rgba(224, 36, 36, 0.1);\r\n\tcolor: var(--color-error);\r\n}\r\n\r\n/* Content */\r\n.cn-stats-block__content {\r\n\tflex: 1;\r\n\tmin-width: 0;\r\n\ttext-align: center;\r\n}\r\n\r\n.cn-stats-block__header h4 {\r\n\tmargin-top: 0;\r\n\tmargin-bottom: 0.5rem;\r\n\tcolor: var(--color-main-text);\r\n\tfont-size: 14px;\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-stats-block__count {\r\n\tdisplay: flex;\r\n\talign-items: baseline;\r\n\tjustify-content: center;\r\n\tgap: 0.5rem;\r\n\tfont-size: 1.2rem;\r\n\tmargin-bottom: 0.5rem;\r\n}\r\n\r\n.cn-stats-block__count-value {\r\n\tfont-size: 2rem;\r\n\tfont-weight: bold;\r\n\tcolor: var(--color-primary-element);\r\n}\r\n\r\n.cn-stats-block--primary .cn-stats-block__count-value { color: var(--color-primary-element); }\r\n.cn-stats-block--success .cn-stats-block__count-value { color: var(--color-success); }\r\n.cn-stats-block--warning .cn-stats-block__count-value { color: var(--color-warning); }\r\n.cn-stats-block--error .cn-stats-block__count-value { color: var(--color-error); }\r\n\r\n.cn-stats-block__count-label {\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-stats-block__loading {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 0.5rem;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tmargin-bottom: 0.5rem;\r\n}\r\n\r\n.cn-stats-block__empty {\r\n\ttext-align: center;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-style: italic;\r\n\tmargin-bottom: 0.5rem;\r\n}\r\n\r\n.cn-stats-block__breakdown {\r\n\tmargin-top: 0.5rem;\r\n\tpadding: 0.75rem;\r\n\tbackground: var(--color-background-hover);\r\n\tborder-radius: var(--border-radius);\r\n\tborder: 1px solid var(--color-border);\r\n\twidth: 100%;\r\n}\r\n\r\n.cn-stats-block__breakdown-item {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 0.5rem;\r\n}\r\n\r\n.cn-stats-block__breakdown-item:last-child {\r\n\tmargin-bottom: 0;\r\n}\r\n\r\n.cn-stats-block__breakdown-label {\r\n\tfont-weight: 500;\r\n\tcolor: var(--color-main-text);\r\n}\r\n\r\n.cn-stats-block__breakdown-value {\r\n\tfont-weight: 600;\r\n\tpadding: 0.25rem 0.5rem;\r\n\tborder-radius: var(--border-radius);\r\n\tbackground: var(--color-background-hover);\r\n}\r\n\r\n.cn-stats-block__breakdown-value--invalid { color: var(--color-warning); }\r\n.cn-stats-block__breakdown-value--deleted { color: var(--color-error); }\r\n.cn-stats-block__breakdown-value--published { color: var(--color-success); }\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-card\">\r\n\t\t<div class=\"cn-card-header\">\r\n\t\t\t<h3>\r\n\t\t\t\t<slot name=\"icon\" />\r\n\t\t\t\t{{ title }}\r\n\t\t\t</h3>\r\n\t\t\t<div class=\"cn-card-header__actions\">\r\n\t\t\t\t<slot name=\"actions\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Status badges -->\r\n\t\t<div v-if=\"$slots.status\" class=\"cn-config-card__status\">\r\n\t\t\t<slot name=\"status\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Main content -->\r\n\t\t<div class=\"cn-config-card__content\">\r\n\t\t\t<slot />\r\n\t\t</div>\r\n\r\n\t\t<!-- Footer -->\r\n\t\t<div v-if=\"$slots.footer\" class=\"cn-config-card__footer\">\r\n\t\t\t<slot name=\"footer\" />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * CnConfigurationCard — Configuration card with title, actions, status, and content.\r\n *\r\n * Decoupled from OpenRegister's ConfigurationCard. All data is provided via\r\n * props and slots — no store dependencies. Consumer wraps this and handles\r\n * navigation/store logic.\r\n *\r\n * @example\r\n * <CnConfigurationCard title=\"Database Configuration\">\r\n * <template #actions>\r\n * <NcActions><NcActionButton @click=\"edit\">Edit</NcActionButton></NcActions>\r\n * </template>\r\n * <template #status>\r\n * <CnStatusBadge label=\"Connected\" variant=\"success\" />\r\n * </template>\r\n * <p>PostgreSQL 15.2 on localhost:5432</p>\r\n * </CnConfigurationCard>\r\n */\r\nexport default {\r\n\tname: 'CnConfigurationCard',\r\n\r\n\tprops: {\r\n\t\t/** Card title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-config-card__status {\r\n\tdisplay: flex;\r\n\tgap: 8px;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.cn-config-card__content {\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.cn-config-card__footer {\r\n\tpadding-top: 12px;\r\n\tborder-top: 1px solid var(--color-border);\r\n}\r\n</style>\r\n","<template>\r\n\t<CnSettingsSection\r\n\t\t:name=\"title\"\r\n\t\t:description=\"description\"\r\n\t\t:doc-url=\"docUrl\"\r\n\t\t:loading=\"loading\"\r\n\t\tloading-message=\"Loading version information...\">\r\n\t\t<!-- Actions slot -->\r\n\t\t<template #actions>\r\n\t\t\t<!-- Update Button -->\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"showUpdateButton\"\r\n\t\t\t\t:type=\"updateButtonType\"\r\n\t\t\t\t:disabled=\"updateButtonDisabled\"\r\n\t\t\t\t@click=\"handleUpdateClick\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"updating\" :size=\"20\" />\r\n\t\t\t\t\t<Check v-else-if=\"isUpToDate\" :size=\"20\" />\r\n\t\t\t\t\t<Update v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ updateButtonText }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<!-- Additional Actions (slot) -->\r\n\t\t\t<slot name=\"actions\" />\r\n\t\t</template>\r\n\r\n\t\t<!-- Main content (only shown when not loading) -->\r\n\t\t<div v-if=\"!loading\" class=\"cn-version-info\">\r\n\t\t\t<!-- Version card with gray background -->\r\n\t\t\t<div class=\"cn-version-info__card\">\r\n\t\t\t\t<h4>{{ cardTitle }}</h4>\r\n\t\t\t\t<div class=\"cn-version-info__details\">\r\n\t\t\t\t\t<!-- Application Name -->\r\n\t\t\t\t\t<div class=\"cn-version-info__item\">\r\n\t\t\t\t\t\t<span class=\"cn-version-info__label\">{{ labels.appName }}:</span>\r\n\t\t\t\t\t\t<span class=\"cn-version-info__value\">{{ appName }}</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Version -->\r\n\t\t\t\t\t<div class=\"cn-version-info__item\">\r\n\t\t\t\t\t\t<span class=\"cn-version-info__label\">{{ labels.version }}:</span>\r\n\t\t\t\t\t\t<span class=\"cn-version-info__value\">{{ appVersion }}</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Configured Version (if provided) -->\r\n\t\t\t\t\t<div v-if=\"configuredVersion\" class=\"cn-version-info__item\">\r\n\t\t\t\t\t\t<span class=\"cn-version-info__label\">{{ labels.configuredVersion }}:</span>\r\n\t\t\t\t\t\t<span class=\"cn-version-info__value\">{{ configuredVersion }}</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Additional items -->\r\n\t\t\t\t\t<div v-for=\"item in additionalItems\" :key=\"item.label\" class=\"cn-version-info__item\">\r\n\t\t\t\t\t\t<span class=\"cn-version-info__label\">{{ item.label }}:</span>\r\n\t\t\t\t\t\t<span class=\"cn-version-info__value\" :class=\"item.statusClass\">{{ item.value }}</span>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Optional additional items slot -->\r\n\t\t\t\t\t<slot name=\"additional-items\" />\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Optional footer slot -->\r\n\t\t\t\t<slot name=\"footer\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Optional extra cards slot -->\r\n\t\t\t<slot name=\"extra-cards\" />\r\n\t\t</div>\r\n\t</CnSettingsSection>\r\n</template>\r\n\r\n<script>\r\nimport { CnSettingsSection } from '../CnSettingsSection/index.js'\r\nimport { NcLoadingIcon, NcButton } from '@nextcloud/vue'\r\nimport Check from 'vue-material-design-icons/Check.vue'\r\nimport Update from 'vue-material-design-icons/Update.vue'\r\n\r\n/**\r\n * CnVersionInfoCard - App version information card for admin settings pages.\r\n *\r\n * Displays application name, version, and optional configured version with an\r\n * update button. Wraps CnSettingsSection for consistent admin settings layout.\r\n *\r\n * Every Conduction Nextcloud app should show this as the first section on its\r\n * admin settings page.\r\n *\r\n * @example Basic usage\r\n * <CnVersionInfoCard app-name=\"Open Register\" app-version=\"0.2.3\" />\r\n *\r\n * @example With update button\r\n * <CnVersionInfoCard\r\n * app-name=\"Open Register\"\r\n * app-version=\"0.2.3\"\r\n * configured-version=\"0.2.2\"\r\n * :is-up-to-date=\"false\"\r\n * :show-update-button=\"true\"\r\n * :updating=\"isUpdating\"\r\n * @update=\"runUpdate\" />\r\n *\r\n * @example With additional items and actions\r\n * <CnVersionInfoCard\r\n * app-name=\"Pipelinq\"\r\n * app-version=\"0.1.7\"\r\n * :additional-items=\"[{ label: 'Database', value: 'Connected', statusClass: 'cn-version-info__status--ok' }]\">\r\n * <template #actions>\r\n * <NcButton @click=\"clearCache\">Clear App Store Cache</NcButton>\r\n * </template>\r\n * </CnVersionInfoCard>\r\n */\r\nexport default {\r\n\tname: 'CnVersionInfoCard',\r\n\r\n\tcomponents: {\r\n\t\tCnSettingsSection,\r\n\t\tNcLoadingIcon,\r\n\t\tNcButton,\r\n\t\tCheck,\r\n\t\tUpdate,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Section title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Version Information',\r\n\t\t},\r\n\t\t/** Section description */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Information about the current application installation',\r\n\t\t},\r\n\t\t/** Documentation URL (shows info icon next to title) */\r\n\t\tdocUrl: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Card heading text */\r\n\t\tcardTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Application Information',\r\n\t\t},\r\n\t\t/** Application name to display */\r\n\t\tappName: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Application version string */\r\n\t\tappVersion: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Configured version (optional, for apps that track configuration versions separately) */\r\n\t\tconfiguredVersion: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Whether the app configuration is up to date */\r\n\t\tisUpToDate: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the update button */\r\n\t\tshowUpdateButton: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether an update is currently in progress */\r\n\t\tupdating: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/**\r\n\t\t * Additional key-value items to display.\r\n\t\t * Format: [{ label: 'Label', value: 'Value', statusClass: 'cn-version-info__status--ok' }]\r\n\t\t */\r\n\t\tadditionalItems: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Whether version info is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Custom labels for the standard fields */\r\n\t\tlabels: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({\r\n\t\t\t\tappName: 'Application Name',\r\n\t\t\t\tversion: 'Version',\r\n\t\t\t\tconfiguredVersion: 'Configured Version',\r\n\t\t\t}),\r\n\t\t},\r\n\t},\r\n\r\n\temits: ['update'],\r\n\r\n\tcomputed: {\r\n\t\t/** @return {string} Button type based on update status */\r\n\t\tupdateButtonType() {\r\n\t\t\tif (this.isUpToDate) {\r\n\t\t\t\treturn 'success'\r\n\t\t\t}\r\n\t\t\treturn 'error'\r\n\t\t},\r\n\r\n\t\t/** @return {boolean} Whether the update button should be disabled */\r\n\t\tupdateButtonDisabled() {\r\n\t\t\treturn this.isUpToDate || this.updating\r\n\t\t},\r\n\r\n\t\t/** @return {string} Update button label text */\r\n\t\tupdateButtonText() {\r\n\t\t\tif (this.updating) {\r\n\t\t\t\treturn 'Updating...'\r\n\t\t\t}\r\n\t\t\tif (this.isUpToDate) {\r\n\t\t\t\treturn 'Up to date'\r\n\t\t\t}\r\n\t\t\treturn 'Update'\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\thandleUpdateClick() {\r\n\t\t\tif (!this.updateButtonDisabled) {\r\n\t\t\t\tthis.$emit('update')\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-version-info__card {\r\n\tbackground: var(--color-background-hover);\r\n\tborder: 1px solid var(--color-border);\r\n\tborder-radius: var(--border-radius-large);\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n}\r\n\r\n.cn-version-info__card h4 {\r\n\tmargin: 0 0 16px 0;\r\n\tfont-size: 16px;\r\n\tfont-weight: 600;\r\n\tcolor: var(--color-main-text);\r\n}\r\n\r\n.cn-version-info__details {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 12px;\r\n}\r\n\r\n.cn-version-info__item {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tpadding: 8px 0;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-version-info__item:last-child {\r\n\tborder-bottom: none;\r\n}\r\n\r\n.cn-version-info__label {\r\n\tfont-weight: 500;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-size: 14px;\r\n}\r\n\r\n.cn-version-info__value {\r\n\tfont-family: 'Courier New', Courier, monospace;\r\n\tfont-weight: 600;\r\n\tcolor: var(--color-main-text);\r\n\tfont-size: 14px;\r\n}\r\n\r\n/* Status classes for values */\r\n.cn-version-info__status--ok {\r\n\tcolor: var(--color-success);\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-version-info__status--warning {\r\n\tcolor: var(--color-warning);\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-version-info__status--error {\r\n\tcolor: var(--color-error);\r\n\tfont-weight: 600;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n\t.cn-version-info__item {\r\n\t\tflex-direction: column;\r\n\t\talign-items: flex-start;\r\n\t\tgap: 4px;\r\n\t}\r\n\r\n\t.cn-version-info__label {\r\n\t\tfont-weight: 600;\r\n\t}\r\n\r\n\t.cn-version-info__value {\r\n\t\tword-break: break-all;\r\n\t}\r\n}\r\n</style>\r\n","<template>\r\n\t<div\r\n\t\tclass=\"cn-object-card\"\r\n\t\t:class=\"{ 'cn-object-card--selected': selected }\"\r\n\t\t@click=\"$emit('click', object)\">\r\n\t\t<!-- Selection checkbox -->\r\n\t\t<div v-if=\"selectable\" class=\"cn-object-card__checkbox\" @click.stop>\r\n\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t:checked=\"selected\"\r\n\t\t\t\t@update:checked=\"$emit('select', object)\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Card content -->\r\n\t\t<div class=\"cn-object-card__content\">\r\n\t\t\t<!-- Header: image + title -->\r\n\t\t\t<div class=\"cn-object-card__header\">\r\n\t\t\t\t<img\r\n\t\t\t\t\tv-if=\"imageUrl\"\r\n\t\t\t\t\t:src=\"imageUrl\"\r\n\t\t\t\t\t:alt=\"title\"\r\n\t\t\t\t\tclass=\"cn-object-card__image\">\r\n\r\n\t\t\t\t<div class=\"cn-object-card__title-area\">\r\n\t\t\t\t\t<h3 class=\"cn-object-card__title\">{{ title }}</h3>\r\n\t\t\t\t\t<p v-if=\"description\" class=\"cn-object-card__description\">\r\n\t\t\t\t\t\t{{ truncatedDescription }}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Badges slot -->\r\n\t\t\t<div v-if=\"$scopedSlots.badges\" class=\"cn-object-card__badges\">\r\n\t\t\t\t<slot name=\"badges\" :object=\"object\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Metadata: visible properties as label:value pairs -->\r\n\t\t\t<div v-if=\"metadataFields.length > 0\" class=\"cn-object-card__metadata\">\r\n\t\t\t\t<slot name=\"metadata\" :object=\"object\" :fields=\"metadataFields\">\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tv-for=\"field in metadataFields\"\r\n\t\t\t\t\t\t:key=\"field.key\"\r\n\t\t\t\t\t\tclass=\"cn-object-card__meta-item\">\r\n\t\t\t\t\t\t<span class=\"cn-object-card__meta-label\">{{ field.label }}</span>\r\n\t\t\t\t\t\t<CnCellRenderer\r\n\t\t\t\t\t\t\t:value=\"field.value\"\r\n\t\t\t\t\t\t\t:property=\"field.property\"\r\n\t\t\t\t\t\t\t:truncate=\"60\" />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</slot>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Actions slot -->\r\n\t\t<div v-if=\"$scopedSlots.actions\" class=\"cn-object-card__actions\" @click.stop>\r\n\t\t\t<slot name=\"actions\" :object=\"object\" />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport { CnCellRenderer } from '../CnCellRenderer/index.js'\r\nimport { formatValue } from '../../utils/schema.js'\r\n\r\n/**\r\n * CnObjectCard — Schema-configuration-driven card for object display.\r\n *\r\n * Uses `schema.configuration` to determine which fields map to the card title,\r\n * description, and image. Remaining visible properties are shown as metadata.\r\n *\r\n * @example\r\n * <CnObjectCard :object=\"publication\" :schema=\"pubSchema\">\r\n * <template #actions=\"{ object }\">\r\n * <NcActions><NcActionButton @click=\"edit(object)\">Edit</NcActionButton></NcActions>\r\n * </template>\r\n * </CnObjectCard>\r\n */\r\nexport default {\r\n\tname: 'CnObjectCard',\r\n\r\n\tcomponents: {\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tCnCellRenderer,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** The object data */\r\n\t\tobject: {\r\n\t\t\ttype: Object,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Schema definition with properties and configuration */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Whether this card is selected */\r\n\t\tselected: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether to show selection checkbox */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Maximum number of metadata fields to show */\r\n\t\tmaxMetadata: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 4,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tconfig() {\r\n\t\t\treturn this.schema?.configuration || {}\r\n\t\t},\r\n\r\n\t\ttitle() {\r\n\t\t\tconst field = this.config.objectNameField\r\n\t\t\tif (field && this.object[field]) {\r\n\t\t\t\treturn String(this.object[field])\r\n\t\t\t}\r\n\t\t\treturn this.object.title || this.object.name || this.object.id || '—'\r\n\t\t},\r\n\r\n\t\tdescription() {\r\n\t\t\tconst field = this.config.objectDescriptionField\r\n\t\t\tif (field && this.object[field]) {\r\n\t\t\t\treturn String(this.object[field])\r\n\t\t\t}\r\n\t\t\treturn null\r\n\t\t},\r\n\r\n\t\ttruncatedDescription() {\r\n\t\t\tif (!this.description) return null\r\n\t\t\tif (this.description.length > 120) {\r\n\t\t\t\treturn this.description.substring(0, 120) + '...'\r\n\t\t\t}\r\n\t\t\treturn this.description\r\n\t\t},\r\n\r\n\t\timageUrl() {\r\n\t\t\tconst field = this.config.objectImageField\r\n\t\t\tif (field && this.object[field]) {\r\n\t\t\t\treturn this.object[field]\r\n\t\t\t}\r\n\t\t\treturn null\r\n\t\t},\r\n\r\n\t\t/** Fields excluded from metadata (already shown as title/desc/image) */\r\n\t\tconfigFields() {\r\n\t\t\treturn [\r\n\t\t\t\tthis.config.objectNameField,\r\n\t\t\t\tthis.config.objectDescriptionField,\r\n\t\t\t\tthis.config.objectSummaryField,\r\n\t\t\t\tthis.config.objectImageField,\r\n\t\t\t].filter(Boolean)\r\n\t\t},\r\n\r\n\t\t/** Remaining visible properties for the metadata section */\r\n\t\tmetadataFields() {\r\n\t\t\tif (!this.schema?.properties) return []\r\n\r\n\t\t\treturn Object.entries(this.schema.properties)\r\n\t\t\t\t.filter(([key, prop]) => {\r\n\t\t\t\t\tif (this.configFields.includes(key)) return false\r\n\t\t\t\t\tif (prop.visible === false) return false\r\n\t\t\t\t\tif (prop.type === 'object') return false\r\n\t\t\t\t\tif (prop.format === 'markdown') return false\r\n\t\t\t\t\treturn true\r\n\t\t\t\t})\r\n\t\t\t\t.sort(([, a], [, b]) => {\r\n\t\t\t\t\tconst orderA = typeof a.order === 'number' ? a.order : Infinity\r\n\t\t\t\t\tconst orderB = typeof b.order === 'number' ? b.order : Infinity\r\n\t\t\t\t\treturn orderA - orderB\r\n\t\t\t\t})\r\n\t\t\t\t.slice(0, this.maxMetadata)\r\n\t\t\t\t.map(([key, prop]) => ({\r\n\t\t\t\t\tkey,\r\n\t\t\t\t\tlabel: prop.title || key,\r\n\t\t\t\t\tvalue: this.object[key],\r\n\t\t\t\t\tproperty: prop,\r\n\t\t\t\t}))\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tformatValue,\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-object-card {\r\n\tdisplay: flex;\r\n\tgap: 12px;\r\n\tpadding: 16px;\r\n\tbackground: var(--color-main-background);\r\n\tborder: 1px solid var(--color-border);\r\n\tborder-radius: var(--border-radius-large, 10px);\r\n\tcursor: pointer;\r\n\ttransition: box-shadow 0.2s ease, border-color 0.2s ease;\r\n}\r\n\r\n.cn-object-card:hover {\r\n\tborder-color: var(--color-primary-element);\r\n\tbox-shadow: 0 2px 8px var(--color-box-shadow);\r\n}\r\n\r\n.cn-object-card--selected {\r\n\tborder-color: var(--color-primary-element);\r\n\tbackground: var(--color-primary-element-light);\r\n}\r\n\r\n.cn-object-card__checkbox {\r\n\tflex-shrink: 0;\r\n\tpadding-top: 2px;\r\n}\r\n\r\n.cn-object-card__content {\r\n\tflex: 1;\r\n\tmin-width: 0;\r\n}\r\n\r\n.cn-object-card__header {\r\n\tdisplay: flex;\r\n\tgap: 12px;\r\n\talign-items: flex-start;\r\n}\r\n\r\n.cn-object-card__image {\r\n\twidth: 48px;\r\n\theight: 48px;\r\n\tborder-radius: var(--border-radius);\r\n\tobject-fit: cover;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.cn-object-card__title-area {\r\n\tflex: 1;\r\n\tmin-width: 0;\r\n}\r\n\r\n.cn-object-card__title {\r\n\tmargin: 0;\r\n\tfont-size: 16px;\r\n\tfont-weight: 600;\r\n\tline-height: 1.3;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-object-card__description {\r\n\tmargin: 4px 0 0;\r\n\tfont-size: 13px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tline-height: 1.4;\r\n}\r\n\r\n.cn-object-card__badges {\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.cn-object-card__metadata {\r\n\tdisplay: grid;\r\n\tgrid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\r\n\tgap: 8px;\r\n\tmargin-top: 12px;\r\n\tpadding-top: 12px;\r\n\tborder-top: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-object-card__meta-item {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 2px;\r\n}\r\n\r\n.cn-object-card__meta-label {\r\n\tfont-size: 11px;\r\n\tfont-weight: 500;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\ttext-transform: uppercase;\r\n\tletter-spacing: 0.3px;\r\n}\r\n\r\n.cn-object-card__actions {\r\n\tflex-shrink: 0;\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-card-grid\">\r\n\t\t<!-- Loading state -->\r\n\t\t<div v-if=\"loading\" class=\"cn-card-grid__loading\">\r\n\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Empty state -->\r\n\t\t<div v-else-if=\"objects.length === 0\" class=\"cn-card-grid__empty\">\r\n\t\t\t<slot name=\"empty\">\r\n\t\t\t\t<NcEmptyContent :name=\"emptyText\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<ViewGrid :size=\"64\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</NcEmptyContent>\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- Card grid -->\r\n\t\t<div v-else class=\"cn-card-grid__grid\">\r\n\t\t\t<slot\r\n\t\t\t\tv-for=\"object in objects\"\r\n\t\t\t\tname=\"card\"\r\n\t\t\t\t:object=\"object\"\r\n\t\t\t\t:selected=\"isSelected(object)\"\r\n\t\t\t\t:schema=\"schema\">\r\n\t\t\t\t<CnObjectCard\r\n\t\t\t\t\t:key=\"object[rowKey]\"\r\n\t\t\t\t\t:object=\"object\"\r\n\t\t\t\t\t:schema=\"schema\"\r\n\t\t\t\t\t:selectable=\"selectable\"\r\n\t\t\t\t\t:selected=\"isSelected(object)\"\r\n\t\t\t\t\t@click=\"$emit('click', object)\"\r\n\t\t\t\t\t@select=\"toggleSelect(object)\">\r\n\t\t\t\t\t<template v-if=\"$scopedSlots['card-actions']\" #actions=\"{ object: obj }\">\r\n\t\t\t\t\t\t<slot name=\"card-actions\" :object=\"obj\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-if=\"$scopedSlots['card-badges']\" #badges=\"{ object: obj }\">\r\n\t\t\t\t\t\t<slot name=\"card-badges\" :object=\"obj\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</CnObjectCard>\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon, NcEmptyContent } from '@nextcloud/vue'\r\nimport ViewGrid from 'vue-material-design-icons/ViewGrid.vue'\r\nimport { CnObjectCard } from '../CnObjectCard/index.js'\r\n\r\n/**\r\n * CnCardGrid — Responsive grid container for CnObjectCard instances.\r\n *\r\n * Displays objects in a responsive CSS grid layout using schema-driven cards.\r\n * Supports selection, loading/empty states, and custom card rendering via slots.\r\n *\r\n * @example\r\n * <CnCardGrid\r\n * :objects=\"publications\"\r\n * :schema=\"pubSchema\"\r\n * :selectable=\"true\"\r\n * :selected-ids=\"selectedIds\"\r\n * @click=\"openPublication\"\r\n * @select=\"onSelect\">\r\n * <template #card-actions=\"{ object }\">\r\n * <NcActions><NcActionButton>Edit</NcActionButton></NcActions>\r\n * </template>\r\n * </CnCardGrid>\r\n */\r\nexport default {\r\n\tname: 'CnCardGrid',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t\tNcEmptyContent,\r\n\t\tViewGrid,\r\n\t\tCnObjectCard,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Array of objects to display as cards */\r\n\t\tobjects: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Schema definition (passed through to CnObjectCard) */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Whether data is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether cards can be selected */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Array of currently selected object IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Property name used as unique identifier */\r\n\t\trowKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'id',\r\n\t\t},\r\n\t\t/** Text shown when there are no objects */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items found',\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tisSelected(object) {\r\n\t\t\treturn this.selectedIds.includes(object[this.rowKey])\r\n\t\t},\r\n\r\n\t\ttoggleSelect(object) {\r\n\t\t\tconst id = object[this.rowKey]\r\n\t\t\tconst newIds = this.isSelected(object)\r\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\r\n\t\t\t\t: [...this.selectedIds, id]\r\n\t\t\tthis.$emit('select', newIds)\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-card-grid__grid {\r\n\tdisplay: grid;\r\n\tgrid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-card-grid__loading {\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\tpadding: 40px;\r\n}\r\n\r\n.cn-card-grid__empty {\r\n\tpadding: 40px 20px;\r\n\ttext-align: center;\r\n}\r\n</style>\r\n","<template>\r\n\t<div class=\"cn-facet-sidebar\">\r\n\t\t<div class=\"cn-facet-sidebar__header\">\r\n\t\t\t<h3 class=\"cn-facet-sidebar__title\">{{ title }}</h3>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"hasActiveFilters\"\r\n\t\t\t\ttype=\"tertiary\"\r\n\t\t\t\tclass=\"cn-facet-sidebar__clear\"\r\n\t\t\t\t@click=\"$emit('clear-all')\">\r\n\t\t\t\t{{ clearLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</div>\r\n\r\n\t\t<!-- Loading state -->\r\n\t\t<div v-if=\"loading\" class=\"cn-facet-sidebar__loading\">\r\n\t\t\t<NcLoadingIcon :size=\"20\" />\r\n\t\t</div>\r\n\r\n\t\t<!-- Filter groups -->\r\n\t\t<div v-else class=\"cn-facet-sidebar__filters\">\r\n\t\t\t<div\r\n\t\t\t\tv-for=\"filter in effectiveFilters\"\r\n\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\tclass=\"cn-facet-sidebar__group\">\r\n\t\t\t\t<label class=\"cn-facet-sidebar__label\">{{ filter.label }}</label>\r\n\r\n\t\t\t\t<!-- Checkbox filter (boolean) -->\r\n\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\tv-if=\"filter.type === 'checkbox'\"\r\n\t\t\t\t\t:checked=\"getFilterValue(filter.key) === true\"\r\n\t\t\t\t\t@update:checked=\"onFilterChange(filter.key, $event)\">\r\n\t\t\t\t\t{{ filter.label }}\r\n\t\t\t\t</NcCheckboxRadioSwitch>\r\n\r\n\t\t\t\t<!-- Select filter (enum / facet values) -->\r\n\t\t\t\t<NcSelect\r\n\t\t\t\t\tv-else-if=\"filter.type === 'select'\"\r\n\t\t\t\t\tclass=\"cn-facet-sidebar__select\"\r\n\t\t\t\t\t:value=\"getSelectedOptions(filter)\"\r\n\t\t\t\t\t:options=\"getFilterOptions(filter)\"\r\n\t\t\t\t\t:placeholder=\"filter.label\"\r\n\t\t\t\t\t:input-label=\"filter.label\"\r\n\t\t\t\t\t:multiple=\"true\"\r\n\t\t\t\t\t:clearable=\"true\"\r\n\t\t\t\t\t@input=\"onSelectChange(filter.key, $event)\" />\r\n\r\n\t\t\t\t<!-- Text filter (fallback) -->\r\n\t\t\t\t<NcTextField\r\n\t\t\t\t\tv-else\r\n\t\t\t\t\t:value=\"getFilterValue(filter.key) || ''\"\r\n\t\t\t\t\t:placeholder=\"filter.label\"\r\n\t\t\t\t\t:label=\"filter.label\"\r\n\t\t\t\t\t@update:value=\"onFilterChange(filter.key, $event)\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcButton, NcSelect, NcTextField, NcCheckboxRadioSwitch, NcLoadingIcon } from '@nextcloud/vue'\r\nimport { filtersFromSchema } from '../../utils/schema.js'\r\n\r\n/**\r\n * CnFacetSidebar — Auto-generated faceted search sidebar from schema properties.\r\n *\r\n * Reads properties marked `facetable: true` in the schema and generates\r\n * appropriate filter widgets. Accepts live facet data from the API for\r\n * dynamic option values with counts.\r\n *\r\n * @example\r\n * <CnFacetSidebar\r\n * :schema=\"schema\"\r\n * :facet-data=\"facetData\"\r\n * :active-filters=\"filters\"\r\n * @filter-change=\"onFilterChange\"\r\n * @clear-all=\"clearFilters\" />\r\n */\r\nexport default {\r\n\tname: 'CnFacetSidebar',\r\n\r\n\tcomponents: {\r\n\t\tNcButton,\r\n\t\tNcSelect,\r\n\t\tNcTextField,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tNcLoadingIcon,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Schema definition — reads facetable properties */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Live facet data from API: { fieldName: { values: [{value, count}] } } */\r\n\t\tfacetData: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Current active filters: { fieldName: value | [values] } */\r\n\t\tactiveFilters: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Whether facet data is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Sidebar title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Filters',\r\n\t\t},\r\n\t\t/** Clear all button label */\r\n\t\tclearLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Clear all',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\teffectiveFilters() {\r\n\t\t\treturn filtersFromSchema(this.schema)\r\n\t\t},\r\n\r\n\t\thasActiveFilters() {\r\n\t\t\treturn Object.values(this.activeFilters).some((v) => {\r\n\t\t\t\tif (Array.isArray(v)) return v.length > 0\r\n\t\t\t\treturn v !== null && v !== undefined && v !== '' && v !== false\r\n\t\t\t})\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tgetFilterValue(key) {\r\n\t\t\treturn this.activeFilters[key] ?? null\r\n\t\t},\r\n\r\n\t\tgetFilterOptions(filter) {\r\n\t\t\t// Use facet data if available (live values with counts)\r\n\t\t\tconst facet = this.facetData[filter.key]\r\n\t\t\tif (facet?.values?.length > 0) {\r\n\t\t\t\treturn facet.values.map((v) => ({\r\n\t\t\t\t\tid: v.value,\r\n\t\t\t\t\tlabel: v.count !== undefined ? `${v.value} (${v.count})` : String(v.value),\r\n\t\t\t\t}))\r\n\t\t\t}\r\n\t\t\t// Fall back to static enum options from schema\r\n\t\t\treturn filter.options || []\r\n\t\t},\r\n\r\n\t\tgetSelectedOptions(filter) {\r\n\t\t\tconst value = this.getFilterValue(filter.key)\r\n\t\t\tif (!value) return []\r\n\t\t\tconst values = Array.isArray(value) ? value : [value]\r\n\t\t\tconst options = this.getFilterOptions(filter)\r\n\t\t\treturn values.map((v) => options.find((o) => o.id === v) || { id: v, label: String(v) })\r\n\t\t},\r\n\r\n\t\tonSelectChange(key, selected) {\r\n\t\t\tconst values = selected ? selected.map((o) => o.id) : []\r\n\t\t\tthis.$emit('filter-change', { key, values })\r\n\t\t},\r\n\r\n\t\tonFilterChange(key, value) {\r\n\t\t\tthis.$emit('filter-change', { key, values: value })\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-facet-sidebar {\r\n\tpadding: 16px;\r\n\tborder-right: 1px solid var(--color-border);\r\n\tmin-width: 240px;\r\n\tmax-width: 300px;\r\n}\r\n\r\n.cn-facet-sidebar__header {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n.cn-facet-sidebar__title {\r\n\tmargin: 0;\r\n\tfont-size: 15px;\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-facet-sidebar__loading {\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\tpadding: 20px;\r\n}\r\n\r\n.cn-facet-sidebar__filters {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-facet-sidebar__group {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 4px;\r\n}\r\n\r\n.cn-facet-sidebar__label {\r\n\tfont-size: 12px;\r\n\tfont-weight: 500;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\ttext-transform: uppercase;\r\n\tletter-spacing: 0.3px;\r\n}\r\n\r\n.cn-facet-sidebar__select {\r\n\twidth: 100%;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcActions :force-menu=\"actions.length > 3\">\r\n\t\t<NcActionButton\r\n\t\t\tv-for=\"action in actions\"\r\n\t\t\t:key=\"action.label\"\r\n\t\t\t:disabled=\"action.disabled\"\r\n\t\t\t:class=\"{ 'cn-row-action--destructive': action.destructive }\"\r\n\t\t\t@click=\"onAction(action)\">\r\n\t\t\t<template v-if=\"action.icon\" #icon>\r\n\t\t\t\t<component :is=\"action.icon\" :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ action.label }}\r\n\t\t</NcActionButton>\r\n\t</NcActions>\r\n</template>\r\n\r\n<script>\r\nimport { NcActions, NcActionButton } from '@nextcloud/vue'\r\n\r\n/**\r\n * CnRowActions — Action menu wrapper for table rows and cards.\r\n *\r\n * Wraps NcActions + NcActionButton for consistent row/card action menus.\r\n * Actions are defined as an array of objects with label, icon, handler, etc.\r\n *\r\n * @example\r\n * <CnRowActions\r\n * :actions=\"[\r\n * { label: 'Edit', icon: PencilIcon, handler: (row) => editRow(row) },\r\n * { label: 'Delete', icon: TrashIcon, handler: (row) => deleteRow(row), destructive: true },\r\n * ]\"\r\n * :row=\"row\" />\r\n */\r\nexport default {\r\n\tname: 'CnRowActions',\r\n\r\n\tcomponents: {\r\n\t\tNcActions,\r\n\t\tNcActionButton,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/**\r\n\t\t * Action definitions.\r\n\t\t * @type {Array<{label: string, icon?: Component, handler: Function, disabled?: boolean, destructive?: boolean}>}\r\n\t\t */\r\n\t\tactions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** The row/object data (passed to action handlers) */\r\n\t\trow: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tonAction(action) {\r\n\t\t\tif (action.handler && typeof action.handler === 'function') {\r\n\t\t\t\taction.handler(this.row)\r\n\t\t\t}\r\n\t\t\tthis.$emit('action', { action: action.label, row: this.row })\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-row-action--destructive {\r\n\tcolor: var(--color-error) !important;\r\n}\r\n</style>\r\n","<template>\r\n\t<component :is=\"resolvedComponent\" :size=\"size\" />\r\n</template>\r\n\r\n<script>\r\nimport HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue'\r\n\r\n/**\r\n * Mutable icon registry.\r\n *\r\n * Pre-populated with HelpCircleOutline (the default fallback).\r\n * Apps extend this at boot via registerIcons() — import only the\r\n * icons you need, keeping bundles small.\r\n *\r\n * @example\r\n * import { registerIcons } from '@conduction/nextcloud-vue'\r\n * import Sword from 'vue-material-design-icons/Sword.vue'\r\n * registerIcons({ Sword })\r\n */\r\nconst _registry = {\r\n\tHelpCircleOutline,\r\n}\r\n\r\n/**\r\n * Register one or more MDI icon components for use with CnIcon.\r\n *\r\n * Call this in your app's main.js before mounting the Vue instance.\r\n * Each key must be the PascalCase icon name matching the\r\n * vue-material-design-icons file name (e.g. \"Sword\" for Sword.vue).\r\n *\r\n * @param {Record<string, import('vue').Component>} icons\r\n *\r\n * @example\r\n * import { registerIcons } from '@conduction/nextcloud-vue'\r\n * import Sword from 'vue-material-design-icons/Sword.vue'\r\n * import MagicStaff from 'vue-material-design-icons/MagicStaff.vue'\r\n * registerIcons({ Sword, MagicStaff })\r\n */\r\nexport function registerIcons(icons) {\r\n\tObject.assign(_registry, icons)\r\n}\r\n\r\n/**\r\n * Read-only reference to the current icon registry.\r\n * Useful for checking which icons are available.\r\n *\r\n * @type {Record<string, import('vue').Component>}\r\n */\r\nexport const ICON_MAP = _registry\r\n\r\n/**\r\n * CnIcon — Renders a Material Design Icon by PascalCase name.\r\n *\r\n * Looks up the name in the shared registry. If not found, renders\r\n * the fallback icon (HelpCircleOutline by default).\r\n *\r\n * @example\r\n * <CnIcon name=\"AccountGroup\" :size=\"24\" />\r\n *\r\n * @see https://pictogrammers.com/library/mdi/\r\n */\r\nexport default {\r\n\tname: 'CnIcon',\r\n\r\n\tprops: {\r\n\t\t/** MDI icon name in PascalCase (e.g. \"AccountGroup\") */\r\n\t\tname: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Icon pixel size */\r\n\t\tsize: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 20,\r\n\t\t},\r\n\t\t/** Fallback icon name if `name` is not found in the registry */\r\n\t\tfallback: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'HelpCircleOutline',\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tresolvedComponent() {\r\n\t\t\treturn _registry[this.name] || _registry[this.fallback] || HelpCircleOutline\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div class=\"cn-page-header\">\r\n\t\t<div v-if=\"icon || $slots.icon\" class=\"cn-page-header__icon\">\r\n\t\t\t<slot name=\"icon\">\r\n\t\t\t\t<CnIcon :name=\"icon\" :size=\"iconSize\" />\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\t\t<div class=\"cn-page-header__text\">\r\n\t\t\t<h1 class=\"cn-page-header__title\">{{ title }}</h1>\r\n\t\t\t<p v-if=\"description\" class=\"cn-page-header__description\">{{ description }}</p>\r\n\t\t</div>\r\n\t\t<slot name=\"extra\" />\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { CnIcon } from '../CnIcon/index.js'\r\n\r\n/**\r\n * CnPageHeader — Reusable page header with optional icon, title, and description.\r\n *\r\n * @example\r\n * <CnPageHeader title=\"Clients\" description=\"Manage your clients\" icon=\"AccountGroup\" />\r\n */\r\nexport default {\r\n\tname: 'CnPageHeader',\r\n\r\n\tcomponents: {\r\n\t\tCnIcon,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Page title text */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Optional description shown below the title */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Optional MDI icon name (rendered via CnIcon) */\r\n\t\ticon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Icon size in pixels */\r\n\t\ticonSize: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 28,\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<!-- Styles in css/page-header.css -->\r\n","<template>\r\n\t<div class=\"cn-actions-bar\">\r\n\t\t<div class=\"cn-actions-bar__info\">\r\n\t\t\t<span v-if=\"pagination && pagination.total > 0\" class=\"cn-actions-bar__count\">\r\n\t\t\t\t{{ countText }}\r\n\t\t\t</span>\r\n\t\t</div>\r\n\t\t<div class=\"cn-actions-bar__actions\">\r\n\t\t\t<!-- View mode toggle (Cards / Table) -->\r\n\t\t\t<div v-if=\"showViewToggle\" class=\"cn-actions-bar__view-toggle\">\r\n\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t:checked=\"viewMode\"\r\n\t\t\t\t\t:button-variant=\"true\"\r\n\t\t\t\t\tvalue=\"cards\"\r\n\t\t\t\t\tname=\"cn_view_mode\"\r\n\t\t\t\t\ttype=\"radio\"\r\n\t\t\t\t\tbutton-variant-grouped=\"horizontal\"\r\n\t\t\t\t\t@update:checked=\"$emit('view-mode-change', 'cards')\">\r\n\t\t\t\t\tCards\r\n\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t:checked=\"viewMode\"\r\n\t\t\t\t\t:button-variant=\"true\"\r\n\t\t\t\t\tvalue=\"table\"\r\n\t\t\t\t\tname=\"cn_view_mode\"\r\n\t\t\t\t\ttype=\"radio\"\r\n\t\t\t\t\tbutton-variant-grouped=\"horizontal\"\r\n\t\t\t\t\t@update:checked=\"$emit('view-mode-change', 'table')\">\r\n\t\t\t\t\tTable\r\n\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Add button (primary) -->\r\n\t\t\t<NcButton type=\"primary\" @click=\"$emit('add')\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\r\n\t\t\t\t\t<Plus v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ addLabel }}\r\n\t\t\t</NcButton>\r\n\r\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\r\n\t\t\t<NcActions\r\n\t\t\t\t:force-name=\"true\"\r\n\t\t\t\t:inline=\"0\"\r\n\t\t\t\tmenu-name=\"Actions\">\r\n\t\t\t\t<NcActionButton @click=\"$emit('refresh')\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<Refresh :size=\"20\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\tRefresh\r\n\t\t\t\t</NcActionButton>\r\n\r\n\t\t\t\t<!-- Custom primary action items (overflow) -->\r\n\t\t\t\t<slot name=\"action-items\" />\r\n\r\n\t\t\t\t<!-- Separator between primary and mass actions -->\r\n\t\t\t\t<NcActionSeparator v-if=\"selectable\" />\r\n\r\n\t\t\t\t<!-- Mass actions (overflow) -->\r\n\t\t\t\t<NcActionButton\r\n\t\t\t\t\tv-if=\"showMassImport\"\r\n\t\t\t\t\t@click=\"$emit('show-import')\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<Import :size=\"20\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\tImport\r\n\t\t\t\t</NcActionButton>\r\n\t\t\t\t<NcActionButton\r\n\t\t\t\t\tv-if=\"showMassExport\"\r\n\t\t\t\t\t@click=\"$emit('show-export')\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<Export :size=\"20\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\tExport\r\n\t\t\t\t</NcActionButton>\r\n\t\t\t\t<NcActionButton\r\n\t\t\t\t\tv-if=\"showMassCopy\"\r\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\r\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? 'Select 1 or more items to copy' : ''\"\r\n\t\t\t\t\t@click=\"$emit('show-copy')\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\tCopy selected\r\n\t\t\t\t</NcActionButton>\r\n\t\t\t\t<NcActionButton\r\n\t\t\t\t\tv-if=\"showMassDelete\"\r\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\r\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? 'Select 1 or more items to delete' : ''\"\r\n\t\t\t\t\t@click=\"$emit('show-delete')\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\tDelete selected\r\n\t\t\t\t</NcActionButton>\r\n\r\n\t\t\t\t<!-- Custom mass actions (overflow) -->\r\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selected-ids=\"selectedIds\" />\r\n\t\t\t</NcActions>\r\n\r\n\t\t\t<slot name=\"header-actions\" />\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcActions, NcActionButton, NcActionSeparator, NcButton, NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport { CnIcon } from '../CnIcon/index.js'\r\nimport Plus from 'vue-material-design-icons/Plus.vue'\r\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\r\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\r\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\r\nimport Import from 'vue-material-design-icons/Import.vue'\r\nimport Export from 'vue-material-design-icons/Export.vue'\r\n\r\n/**\r\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\r\n *\r\n * @example\r\n * <CnActionsBar\r\n * :pagination=\"pagination\"\r\n * :object-count=\"items.length\"\r\n * add-label=\"Add Client\"\r\n * add-icon=\"AccountGroup\"\r\n * @add=\"createNew\"\r\n * @refresh=\"reload\" />\r\n */\r\nexport default {\r\n\tname: 'CnActionsBar',\r\n\r\n\tcomponents: {\r\n\t\tNcActions,\r\n\t\tNcActionButton,\r\n\t\tNcActionSeparator,\r\n\t\tNcButton,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tCnIcon,\r\n\t\tPlus,\r\n\t\tRefresh,\r\n\t\tContentCopy,\r\n\t\tTrashCanOutline,\r\n\t\tImport,\r\n\t\tExport,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Pagination state: { total, page, pages, limit } */\r\n\t\tpagination: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\r\n\t\tobjectCount: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t},\r\n\t\t/** Whether rows/cards can be selected */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Currently selected IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Label for the Add button */\r\n\t\taddLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Add',\r\n\t\t},\r\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\r\n\t\taddIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\r\n\t\tinlineActionCount: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 2,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Import action */\r\n\t\tshowMassImport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Export action */\r\n\t\tshowMassExport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Copy action */\r\n\t\tshowMassCopy: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Delete action */\r\n\t\tshowMassDelete: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Current view mode: 'table' or 'cards' */\r\n\t\tviewMode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'table',\r\n\t\t\tvalidator: (v) => ['table', 'cards'].includes(v),\r\n\t\t},\r\n\t\t/** Whether to show the Cards/Table view toggle */\r\n\t\tshowViewToggle: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tcountText() {\r\n\t\t\tif (!this.pagination) return ''\r\n\t\t\treturn `Showing ${this.objectCount} of ${this.pagination.total}`\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<!-- Styles in css/actions-bar.css -->\r\n","<template>\r\n\t<NcDialog\r\n\t\t:name=\"dialogTitle\"\r\n\t\tsize=\"normal\"\r\n\t\t:can-close=\"!loading\"\r\n\t\t@closing=\"$emit('close')\">\r\n\t\t<!-- Review phase -->\r\n\t\t<div v-if=\"result === null\" class=\"cn-mass-delete__review\">\r\n\t\t\t<NcNoteCard type=\"warning\">\r\n\t\t\t\t{{ warningText }}\r\n\t\t\t</NcNoteCard>\r\n\r\n\t\t\t<div class=\"cn-mass-delete__list\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"item in localItems\"\r\n\t\t\t\t\t:key=\"item.id\"\r\n\t\t\t\t\tclass=\"cn-mass-delete__item\">\r\n\t\t\t\t\t<span class=\"cn-mass-delete__item-name\">\r\n\t\t\t\t\t\t{{ getItemName(item) }}\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<NcButton\r\n\t\t\t\t\t\ttype=\"tertiary\"\r\n\t\t\t\t\t\t:aria-label=\"removeLabel\"\r\n\t\t\t\t\t\t@click=\"removeItem(item.id)\">\r\n\t\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t\t<Close :size=\"16\" />\r\n\t\t\t\t\t\t</template>\r\n\t\t\t\t\t</NcButton>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<p v-if=\"localItems.length === 0\" class=\"cn-mass-delete__empty\">\r\n\t\t\t\t{{ emptyText }}\r\n\t\t\t</p>\r\n\t\t</div>\r\n\r\n\t\t<!-- Result phase -->\r\n\t\t<div v-else class=\"cn-mass-delete__result\">\r\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\r\n\t\t\t\t{{ successText }}\r\n\t\t\t</NcNoteCard>\r\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\r\n\t\t\t\t{{ result.error }}\r\n\t\t\t</NcNoteCard>\r\n\t\t</div>\r\n\r\n\t\t<template #actions>\r\n\t\t\t<NcButton @click=\"$emit('close')\">\r\n\t\t\t\t{{ result === null ? cancelLabel : closeLabel }}\r\n\t\t\t</NcButton>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"result === null\"\r\n\t\t\t\ttype=\"error\"\r\n\t\t\t\t:disabled=\"loading || localItems.length === 0\"\r\n\t\t\t\t@click=\"executeDelete\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\r\n\t\t\t\t\t<TrashCanOutline v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ confirmLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</template>\r\n\t</NcDialog>\r\n</template>\r\n\r\n<script>\r\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon } from '@nextcloud/vue'\r\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\r\nimport Close from 'vue-material-design-icons/Close.vue'\r\n\r\n/**\r\n * CnMassDeleteDialog — Two-phase mass delete confirmation dialog.\r\n *\r\n * Phase 1 (review): Shows the items to be deleted with the ability to remove\r\n * individual items before confirming. Phase 2 (result): Shows success or error.\r\n *\r\n * The dialog does NOT perform the delete itself — it emits a `confirm` event\r\n * with the item IDs. The parent component performs the actual API call and\r\n * calls `setResult()` via a ref.\r\n *\r\n * @example\r\n * <CnMassDeleteDialog\r\n * v-if=\"showDeleteDialog\"\r\n * :items=\"selectedObjects\"\r\n * :name-field=\"'title'\"\r\n * @confirm=\"onDeleteConfirm\"\r\n * @close=\"showDeleteDialog = false\" />\r\n *\r\n * // In methods:\r\n * async onDeleteConfirm(ids) {\r\n * try {\r\n * await store.massDelete(ids)\r\n * this.$refs.deleteDialog.setResult({ success: true })\r\n * } catch (e) {\r\n * this.$refs.deleteDialog.setResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnMassDeleteDialog',\r\n\r\n\tcomponents: {\r\n\t\tNcDialog,\r\n\t\tNcButton,\r\n\t\tNcNoteCard,\r\n\t\tNcLoadingIcon,\r\n\t\tTrashCanOutline,\r\n\t\tClose,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Items to delete. Each must have an `id` property. */\r\n\t\titems: {\r\n\t\t\ttype: Array,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Property name used for display (e.g., 'title', 'name') */\r\n\t\tnameField: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'title',\r\n\t\t},\r\n\t\t/** Dialog title */\r\n\t\tdialogTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Delete Items',\r\n\t\t},\r\n\t\t/** Warning text shown above the item list */\r\n\t\twarningText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'The following items will be permanently deleted. Remove any items you want to keep.',\r\n\t\t},\r\n\t\t/** Text when all items removed from list */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items selected for deletion.',\r\n\t\t},\r\n\t\t/** Success message */\r\n\t\tsuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Items successfully deleted.',\r\n\t\t},\r\n\t\tcancelLabel: { type: String, default: 'Cancel' },\r\n\t\tcloseLabel: { type: String, default: 'Close' },\r\n\t\tconfirmLabel: { type: String, default: 'Delete' },\r\n\t\tremoveLabel: { type: String, default: 'Remove from list' },\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tlocalItems: [...this.items],\r\n\t\t\tloading: false,\r\n\t\t\tresult: null,\r\n\t\t\tcloseTimeout: null,\r\n\t\t}\r\n\t},\r\n\r\n\twatch: {\r\n\t\titems(val) {\r\n\t\t\tthis.localItems = [...val]\r\n\t\t},\r\n\t},\r\n\r\n\tbeforeDestroy() {\r\n\t\tif (this.closeTimeout) clearTimeout(this.closeTimeout)\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tgetItemName(item) {\r\n\t\t\treturn item[this.nameField] || item.name || item.title || item.id\r\n\t\t},\r\n\r\n\t\tremoveItem(id) {\r\n\t\t\tthis.localItems = this.localItems.filter((i) => i.id !== id)\r\n\t\t},\r\n\r\n\t\texecuteDelete() {\r\n\t\t\tthis.loading = true\r\n\t\t\tconst ids = this.localItems.map((i) => i.id)\r\n\t\t\t/**\r\n\t\t\t * @event confirm Emitted when the user confirms deletion.\r\n\t\t\t * Payload: array of item IDs to delete.\r\n\t\t\t */\r\n\t\t\tthis.$emit('confirm', ids)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of the delete operation. Call this from the parent\r\n\t\t * after the API call completes.\r\n\t\t *\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetResult(resultData) {\r\n\t\t\tthis.loading = false\r\n\t\t\tthis.result = resultData\r\n\t\t\tif (resultData.success) {\r\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\r\n\t\t\t\t\tthis.$emit('close')\r\n\t\t\t\t}, 2000)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-mass-delete__list {\r\n\tmax-height: 300px;\r\n\toverflow-y: auto;\r\n\tmargin-top: 12px;\r\n}\r\n\r\n.cn-mass-delete__item {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\tpadding: 8px 12px;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-mass-delete__item:last-child {\r\n\tborder-bottom: none;\r\n}\r\n\r\n.cn-mass-delete__item-name {\r\n\tfont-weight: 500;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-mass-delete__empty {\r\n\ttext-align: center;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-style: italic;\r\n\tpadding: 20px;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcDialog\r\n\t\t:name=\"dialogTitle\"\r\n\t\tsize=\"normal\"\r\n\t\t:can-close=\"!loading\"\r\n\t\t@closing=\"$emit('close')\">\r\n\t\t<!-- Review phase -->\r\n\t\t<div v-if=\"result === null\" class=\"cn-mass-copy__review\">\r\n\t\t\t<div class=\"cn-mass-copy__pattern\">\r\n\t\t\t\t<label for=\"cn-mass-copy-pattern\">{{ patternLabel }}</label>\r\n\t\t\t\t<NcSelect\r\n\t\t\t\t\tinput-id=\"cn-mass-copy-pattern\"\r\n\t\t\t\t\t:options=\"patternOptions\"\r\n\t\t\t\t\t:value=\"selectedPattern\"\r\n\t\t\t\t\t:clearable=\"false\"\r\n\t\t\t\t\t@input=\"onPatternChange\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"cn-mass-copy__list\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"item in localItems\"\r\n\t\t\t\t\t:key=\"item.id\"\r\n\t\t\t\t\tclass=\"cn-mass-copy__item\">\r\n\t\t\t\t\t<div class=\"cn-mass-copy__item-names\">\r\n\t\t\t\t\t\t<span class=\"cn-mass-copy__item-original\">{{ getItemName(item) }}</span>\r\n\t\t\t\t\t\t<span class=\"cn-mass-copy__item-arrow\">→</span>\r\n\t\t\t\t\t\t<span class=\"cn-mass-copy__item-new\">{{ getNewName(item) }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<NcButton\r\n\t\t\t\t\t\ttype=\"tertiary\"\r\n\t\t\t\t\t\t:aria-label=\"removeLabel\"\r\n\t\t\t\t\t\t@click=\"removeItem(item.id)\">\r\n\t\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t\t<Close :size=\"16\" />\r\n\t\t\t\t\t\t</template>\r\n\t\t\t\t\t</NcButton>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<p v-if=\"localItems.length === 0\" class=\"cn-mass-copy__empty\">\r\n\t\t\t\t{{ emptyText }}\r\n\t\t\t</p>\r\n\t\t</div>\r\n\r\n\t\t<!-- Result phase -->\r\n\t\t<div v-else class=\"cn-mass-copy__result\">\r\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\r\n\t\t\t\t{{ successText }}\r\n\t\t\t</NcNoteCard>\r\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\r\n\t\t\t\t{{ result.error }}\r\n\t\t\t</NcNoteCard>\r\n\t\t</div>\r\n\r\n\t\t<template #actions>\r\n\t\t\t<NcButton @click=\"$emit('close')\">\r\n\t\t\t\t{{ result === null ? cancelLabel : closeLabel }}\r\n\t\t\t</NcButton>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"result === null\"\r\n\t\t\t\ttype=\"primary\"\r\n\t\t\t\t:disabled=\"loading || localItems.length === 0\"\r\n\t\t\t\t@click=\"executeCopy\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\r\n\t\t\t\t\t<ContentCopy v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ confirmLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</template>\r\n\t</NcDialog>\r\n</template>\r\n\r\n<script>\r\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\r\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\r\nimport Close from 'vue-material-design-icons/Close.vue'\r\n\r\n/**\r\n * CnMassCopyDialog — Two-phase mass copy confirmation dialog.\r\n *\r\n * Phase 1 (review): Shows the items to be copied with a naming pattern\r\n * selector and real-time preview of new names. Phase 2 (result): Shows\r\n * success or error.\r\n *\r\n * The dialog does NOT perform the copy itself — it emits a `confirm` event\r\n * with the items and naming function. The parent performs the actual API\r\n * call and calls `setResult()` via a ref.\r\n *\r\n * @example\r\n * <CnMassCopyDialog\r\n * v-if=\"showCopyDialog\"\r\n * ref=\"copyDialog\"\r\n * :items=\"selectedObjects\"\r\n * :name-field=\"'title'\"\r\n * @confirm=\"onCopyConfirm\"\r\n * @close=\"showCopyDialog = false\" />\r\n *\r\n * // In methods:\r\n * async onCopyConfirm({ ids, getName }) {\r\n * try {\r\n * for (const item of this.selectedObjects) {\r\n * await store.copyObject(item.id, { title: getName(item) })\r\n * }\r\n * this.$refs.copyDialog.setResult({ success: true })\r\n * } catch (e) {\r\n * this.$refs.copyDialog.setResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnMassCopyDialog',\r\n\r\n\tcomponents: {\r\n\t\tNcDialog,\r\n\t\tNcButton,\r\n\t\tNcNoteCard,\r\n\t\tNcLoadingIcon,\r\n\t\tNcSelect,\r\n\t\tContentCopy,\r\n\t\tClose,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Items to copy. Each must have an `id` property. */\r\n\t\titems: {\r\n\t\t\ttype: Array,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Property name used for display (e.g., 'title', 'name') */\r\n\t\tnameField: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'title',\r\n\t\t},\r\n\t\t/** Dialog title */\r\n\t\tdialogTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Copy Items',\r\n\t\t},\r\n\t\t/** Label for the naming pattern selector */\r\n\t\tpatternLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Naming pattern',\r\n\t\t},\r\n\t\t/** Text when all items removed from list */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items selected for copying.',\r\n\t\t},\r\n\t\t/** Success message */\r\n\t\tsuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Items successfully copied.',\r\n\t\t},\r\n\t\tcancelLabel: { type: String, default: 'Cancel' },\r\n\t\tcloseLabel: { type: String, default: 'Close' },\r\n\t\tconfirmLabel: { type: String, default: 'Copy' },\r\n\t\tremoveLabel: { type: String, default: 'Remove from list' },\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tlocalItems: [...this.items],\r\n\t\t\tloading: false,\r\n\t\t\tresult: null,\r\n\t\t\tcloseTimeout: null,\r\n\t\t\tselectedPattern: { id: 'copy-of', label: 'Copy of {name}' },\r\n\t\t}\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tpatternOptions() {\r\n\t\t\treturn [\r\n\t\t\t\t{ id: 'copy-of', label: 'Copy of {name}' },\r\n\t\t\t\t{ id: 'name-copy', label: '{name} - Copy' },\r\n\t\t\t\t{ id: 'name-parens', label: '{name} (Copy)' },\r\n\t\t\t]\r\n\t\t},\r\n\t},\r\n\r\n\twatch: {\r\n\t\titems(val) {\r\n\t\t\tthis.localItems = [...val]\r\n\t\t},\r\n\t},\r\n\r\n\tbeforeDestroy() {\r\n\t\tif (this.closeTimeout) clearTimeout(this.closeTimeout)\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tgetItemName(item) {\r\n\t\t\treturn item[this.nameField] || item.name || item.title || item.id\r\n\t\t},\r\n\r\n\t\tgetNewName(item) {\r\n\t\t\tconst name = this.getItemName(item)\r\n\t\t\treturn this.applyPattern(name, this.selectedPattern.id)\r\n\t\t},\r\n\r\n\t\tapplyPattern(name, patternId) {\r\n\t\t\tswitch (patternId) {\r\n\t\t\tcase 'copy-of':\r\n\t\t\t\treturn `Copy of ${name}`\r\n\t\t\tcase 'name-copy':\r\n\t\t\t\treturn `${name} - Copy`\r\n\t\t\tcase 'name-parens':\r\n\t\t\t\treturn `${name} (Copy)`\r\n\t\t\tdefault:\r\n\t\t\t\treturn `Copy of ${name}`\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonPatternChange(option) {\r\n\t\t\tthis.selectedPattern = option\r\n\t\t},\r\n\r\n\t\tremoveItem(id) {\r\n\t\t\tthis.localItems = this.localItems.filter((i) => i.id !== id)\r\n\t\t},\r\n\r\n\t\texecuteCopy() {\r\n\t\t\tthis.loading = true\r\n\t\t\tconst ids = this.localItems.map((i) => i.id)\r\n\t\t\tconst patternId = this.selectedPattern.id\r\n\t\t\t/**\r\n\t\t\t * @event confirm Emitted when the user confirms copying.\r\n\t\t\t * Payload: { ids, getName } where getName(item) returns the new name.\r\n\t\t\t */\r\n\t\t\tthis.$emit('confirm', {\r\n\t\t\t\tids,\r\n\t\t\t\tgetName: (item) => {\r\n\t\t\t\t\tconst name = this.getItemName(item)\r\n\t\t\t\t\treturn this.applyPattern(name, patternId)\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of the copy operation. Call this from the parent\r\n\t\t * after the API call completes.\r\n\t\t *\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetResult(resultData) {\r\n\t\t\tthis.loading = false\r\n\t\t\tthis.result = resultData\r\n\t\t\tif (resultData.success) {\r\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\r\n\t\t\t\t\tthis.$emit('close')\r\n\t\t\t\t}, 2000)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-mass-copy__pattern {\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n.cn-mass-copy__pattern label {\r\n\tdisplay: block;\r\n\tfont-weight: 600;\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.cn-mass-copy__list {\r\n\tmax-height: 300px;\r\n\toverflow-y: auto;\r\n}\r\n\r\n.cn-mass-copy__item {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\tpadding: 8px 12px;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-mass-copy__item:last-child {\r\n\tborder-bottom: none;\r\n}\r\n\r\n.cn-mass-copy__item-names {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: 8px;\r\n\toverflow: hidden;\r\n\tflex: 1;\r\n}\r\n\r\n.cn-mass-copy__item-original {\r\n\tcolor: var(--color-text-maxcontrast);\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-mass-copy__item-arrow {\r\n\tflex-shrink: 0;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-mass-copy__item-new {\r\n\tfont-weight: 500;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.cn-mass-copy__empty {\r\n\ttext-align: center;\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-style: italic;\r\n\tpadding: 20px;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcDialog\r\n\t\t:name=\"dialogTitle\"\r\n\t\tsize=\"small\"\r\n\t\t:can-close=\"!loading\"\r\n\t\t@closing=\"$emit('close')\">\r\n\t\t<!-- Result phase -->\r\n\t\t<div v-if=\"result !== null\" class=\"cn-mass-export__result\">\r\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\r\n\t\t\t\t{{ successText }}\r\n\t\t\t</NcNoteCard>\r\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\r\n\t\t\t\t{{ result.error }}\r\n\t\t\t</NcNoteCard>\r\n\t\t</div>\r\n\r\n\t\t<!-- Form phase -->\r\n\t\t<div v-else class=\"cn-mass-export__form\">\r\n\t\t\t<p v-if=\"description\" class=\"cn-mass-export__description\">\r\n\t\t\t\t{{ description }}\r\n\t\t\t</p>\r\n\r\n\t\t\t<div class=\"cn-mass-export__field\">\r\n\t\t\t\t<label for=\"cn-mass-export-format\">{{ formatLabel }}</label>\r\n\t\t\t\t<NcSelect\r\n\t\t\t\t\tinput-id=\"cn-mass-export-format\"\r\n\t\t\t\t\t:options=\"formatOptions\"\r\n\t\t\t\t\t:value=\"selectedFormat\"\r\n\t\t\t\t\t:clearable=\"false\"\r\n\t\t\t\t\t@input=\"selectedFormat = $event\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<template #actions>\r\n\t\t\t<NcButton @click=\"$emit('close')\">\r\n\t\t\t\t{{ result !== null ? closeLabel : cancelLabel }}\r\n\t\t\t</NcButton>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"result === null\"\r\n\t\t\t\ttype=\"primary\"\r\n\t\t\t\t:disabled=\"loading\"\r\n\t\t\t\t@click=\"executeExport\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\r\n\t\t\t\t\t<ExportIcon v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ confirmLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</template>\r\n\t</NcDialog>\r\n</template>\r\n\r\n<script>\r\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\r\nimport ExportIcon from 'vue-material-design-icons/Export.vue'\r\n\r\n/**\r\n * CnMassExportDialog — Export dialog with format selection.\r\n *\r\n * Allows users to select an export format and triggers the export.\r\n * The parent handles the actual download. Based on the OpenRegister\r\n * ExportRegister pattern.\r\n *\r\n * @example\r\n * <CnMassExportDialog\r\n * v-if=\"showExportDialog\"\r\n * ref=\"exportDialog\"\r\n * description=\"Export 42 objects from Cases\"\r\n * @confirm=\"onExportConfirm\"\r\n * @close=\"showExportDialog = false\" />\r\n *\r\n * // In methods:\r\n * async onExportConfirm({ format }) {\r\n * try {\r\n * const response = await axios({\r\n * url: `/api/objects/export`,\r\n * method: 'GET',\r\n * params: { type: format },\r\n * responseType: 'blob',\r\n * })\r\n * // Trigger download...\r\n * this.$refs.exportDialog.setResult({ success: true })\r\n * } catch (e) {\r\n * this.$refs.exportDialog.setResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnMassExportDialog',\r\n\r\n\tcomponents: {\r\n\t\tNcDialog,\r\n\t\tNcButton,\r\n\t\tNcNoteCard,\r\n\t\tNcLoadingIcon,\r\n\t\tNcSelect,\r\n\t\tExportIcon,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Dialog title */\r\n\t\tdialogTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Export Objects',\r\n\t\t},\r\n\t\t/** Description text shown above the format selector */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Available export formats */\r\n\t\tformats: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [\r\n\t\t\t\t{ id: 'excel', label: 'Excel (.xlsx)' },\r\n\t\t\t\t{ id: 'csv', label: 'CSV (.csv)' },\r\n\t\t\t],\r\n\t\t},\r\n\t\t/** Default selected format ID */\r\n\t\tdefaultFormat: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'excel',\r\n\t\t},\r\n\t\t/** Success message */\r\n\t\tsuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Export completed successfully.',\r\n\t\t},\r\n\t\tformatLabel: { type: String, default: 'Export format' },\r\n\t\tcancelLabel: { type: String, default: 'Cancel' },\r\n\t\tcloseLabel: { type: String, default: 'Close' },\r\n\t\tconfirmLabel: { type: String, default: 'Export' },\r\n\t},\r\n\r\n\tdata() {\r\n\t\tconst defaultOption = this.formats.find((f) => f.id === this.defaultFormat) || this.formats[0]\r\n\t\treturn {\r\n\t\t\tselectedFormat: defaultOption,\r\n\t\t\tloading: false,\r\n\t\t\tresult: null,\r\n\t\t\tcloseTimeout: null,\r\n\t\t}\r\n\t},\r\n\r\n\tbeforeDestroy() {\r\n\t\tif (this.closeTimeout) clearTimeout(this.closeTimeout)\r\n\t},\r\n\r\n\tmethods: {\r\n\t\texecuteExport() {\r\n\t\t\tthis.loading = true\r\n\t\t\tthis.$emit('confirm', {\r\n\t\t\t\tformat: this.selectedFormat.id,\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of the export operation.\r\n\t\t * @param {{ success?: boolean, error?: string }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetResult(resultData) {\r\n\t\t\tthis.loading = false\r\n\t\t\tthis.result = resultData\r\n\t\t\tif (resultData.success) {\r\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\r\n\t\t\t\t\tthis.$emit('close')\r\n\t\t\t\t}, 2000)\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-mass-export__description {\r\n\tmargin-bottom: 16px;\r\n\tcolor: var(--color-text-maxcontrast);\r\n}\r\n\r\n.cn-mass-export__field {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 4px;\r\n}\r\n\r\n.cn-mass-export__field label {\r\n\tfont-weight: 600;\r\n}\r\n</style>\r\n","<template>\r\n\t<NcDialog\r\n\t\t:name=\"dialogTitle\"\r\n\t\tsize=\"large\"\r\n\t\t:can-close=\"!loading\"\r\n\t\t@closing=\"$emit('close')\">\r\n\t\t<!-- Success/error messages -->\r\n\t\t<NcNoteCard v-if=\"result && result.success && !hasErrors\" type=\"success\">\r\n\t\t\t{{ successText }}\r\n\t\t</NcNoteCard>\r\n\t\t<NcNoteCard v-if=\"result && result.success && hasErrors\" type=\"warning\">\r\n\t\t\t{{ partialSuccessText }}\r\n\t\t</NcNoteCard>\r\n\t\t<NcNoteCard v-if=\"result && result.error\" type=\"error\">\r\n\t\t\t{{ result.error }}\r\n\t\t</NcNoteCard>\r\n\r\n\t\t<!-- Results summary table -->\r\n\t\t<div v-if=\"result && result.summary\" class=\"cn-mass-import__results\">\r\n\t\t\t<h3>{{ summaryTitle }}</h3>\r\n\t\t\t<table class=\"cn-mass-import__summary-table\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<th>{{ sheetLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ foundLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ createdLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ updatedLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ unchangedLabel }}</th>\r\n\t\t\t\t\t\t<th>{{ errorsLabel }}</th>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<template v-for=\"(sheet, key) in result.summary\">\r\n\t\t\t\t\t\t<tr :key=\"key\">\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__sheet-name\">{{ key }}</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--found\">\r\n\t\t\t\t\t\t\t\t{{ sheet.found || 0 }}\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--created\">\r\n\t\t\t\t\t\t\t\t{{ getCount(sheet.created) }}\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--updated\">\r\n\t\t\t\t\t\t\t\t{{ getCount(sheet.updated) }}\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--unchanged\">\r\n\t\t\t\t\t\t\t\t{{ getCount(sheet.unchanged) }}\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class=\"cn-mass-import__stat cn-mass-import__stat--errors\">\r\n\t\t\t\t\t\t\t\t<span>{{ getCount(sheet.errors) }}</span>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tv-if=\"getCount(sheet.errors) > 0\"\r\n\t\t\t\t\t\t\t\t\tclass=\"cn-mass-import__expand\"\r\n\t\t\t\t\t\t\t\t\t:class=\"{ 'cn-mass-import__expand--open': expandedErrors[key] }\"\r\n\t\t\t\t\t\t\t\t\t@click=\"toggleErrors(key)\">\r\n\t\t\t\t\t\t\t\t\t<ChevronDown :size=\"16\" />\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t<!-- Error details row -->\r\n\t\t\t\t\t\t<tr\r\n\t\t\t\t\t\t\tv-if=\"expandedErrors[key] && sheet.errors && sheet.errors.length\"\r\n\t\t\t\t\t\t\t:key=\"`${key}-errors`\"\r\n\t\t\t\t\t\t\tclass=\"cn-mass-import__error-row\">\r\n\t\t\t\t\t\t\t<td colspan=\"6\">\r\n\t\t\t\t\t\t\t\t<table class=\"cn-mass-import__error-table\">\r\n\t\t\t\t\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t\t\t<th>Row</th>\r\n\t\t\t\t\t\t\t\t\t\t\t<th>Type</th>\r\n\t\t\t\t\t\t\t\t\t\t\t<th>Message</th>\r\n\t\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t</thead>\r\n\t\t\t\t\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t\t\t\t\t<tr v-for=\"(err, idx) in sheet.errors\" :key=\"idx\">\r\n\t\t\t\t\t\t\t\t\t\t\t<td>{{ err.row || '—' }}</td>\r\n\t\t\t\t\t\t\t\t\t\t\t<td>{{ err.type || 'Unknown' }}</td>\r\n\t\t\t\t\t\t\t\t\t\t\t<td>{{ err.error || err.message || '—' }}</td>\r\n\t\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t</tbody>\r\n\t\t\t\t\t\t\t\t</table>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\r\n\t\t<!-- Upload form -->\r\n\t\t<div v-if=\"!result\" class=\"cn-mass-import__form\">\r\n\t\t\t<input\r\n\t\t\t\tref=\"fileInput\"\r\n\t\t\t\ttype=\"file\"\r\n\t\t\t\t:accept=\"acceptedTypes\"\r\n\t\t\t\tstyle=\"display: none\"\r\n\t\t\t\t@change=\"handleFileSelect\">\r\n\r\n\t\t\t<div class=\"cn-mass-import__file-row\">\r\n\t\t\t\t<NcButton @click=\"$refs.fileInput.click()\">\r\n\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t<Upload :size=\"20\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t{{ selectFileLabel }}\r\n\t\t\t\t</NcButton>\r\n\t\t\t\t<div v-if=\"selectedFile\" class=\"cn-mass-import__file-info\">\r\n\t\t\t\t\t<span class=\"cn-mass-import__file-name\">{{ selectedFile.name }}</span>\r\n\t\t\t\t\t<span class=\"cn-mass-import__file-size\">({{ formatFileSize(selectedFile.size) }})</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Additional fields slot (e.g., register/schema selectors) -->\r\n\t\t\t<slot name=\"fields\" :file=\"selectedFile\" />\r\n\r\n\t\t\t<!-- File type help text -->\r\n\t\t\t<div v-if=\"fileTypeHelp\" class=\"cn-mass-import__help\">\r\n\t\t\t\t<p><strong>{{ supportedFormatsLabel }}</strong></p>\r\n\t\t\t\t<ul>\r\n\t\t\t\t\t<li v-for=\"(help, idx) in fileTypeHelp\" :key=\"idx\">\r\n\t\t\t\t\t\t<strong>{{ help.label }}</strong> — {{ help.description }}\r\n\t\t\t\t\t</li>\r\n\t\t\t\t</ul>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Import options -->\r\n\t\t\t<div v-if=\"options.length > 0\" class=\"cn-mass-import__options\">\r\n\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\tv-for=\"opt in options\"\r\n\t\t\t\t\t:key=\"opt.key\"\r\n\t\t\t\t\t:checked=\"optionValues[opt.key]\"\r\n\t\t\t\t\ttype=\"switch\"\r\n\t\t\t\t\t@update:checked=\"setOption(opt.key, $event)\">\r\n\t\t\t\t\t{{ opt.label }}\r\n\t\t\t\t\t<template v-if=\"opt.description\" #helper>\r\n\t\t\t\t\t\t{{ opt.description }}\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Loading indicator -->\r\n\t\t<NcNoteCard v-if=\"loading\" type=\"info\">\r\n\t\t\t{{ loadingText }}\r\n\t\t</NcNoteCard>\r\n\r\n\t\t<template #actions>\r\n\t\t\t<NcButton @click=\"$emit('close')\">\r\n\t\t\t\t{{ result ? closeLabel : cancelLabel }}\r\n\t\t\t</NcButton>\r\n\t\t\t<NcButton\r\n\t\t\t\tv-if=\"!result\"\r\n\t\t\t\ttype=\"primary\"\r\n\t\t\t\t:disabled=\"loading || !selectedFile || !canSubmit\"\r\n\t\t\t\t@click=\"executeImport\">\r\n\t\t\t\t<template #icon>\r\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\r\n\t\t\t\t\t<ImportIcon v-else :size=\"20\" />\r\n\t\t\t\t</template>\r\n\t\t\t\t{{ confirmLabel }}\r\n\t\t\t</NcButton>\r\n\t\t</template>\r\n\t</NcDialog>\r\n</template>\r\n\r\n<script>\r\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon, NcCheckboxRadioSwitch } from '@nextcloud/vue'\r\nimport Upload from 'vue-material-design-icons/Upload.vue'\r\nimport ImportIcon from 'vue-material-design-icons/Import.vue'\r\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\r\n\r\n/**\r\n * CnMassImportDialog — File import dialog with options and results summary.\r\n *\r\n * Supports file upload (JSON, Excel, CSV), configurable import options via\r\n * toggle switches, and a results summary table showing created/updated/error\r\n * counts per sheet. Based on the OpenRegister ImportRegister pattern.\r\n *\r\n * The dialog does NOT perform the import itself — it emits a `confirm` event\r\n * with the file and options. The parent handles the API call and calls\r\n * `setResult()` via a ref.\r\n *\r\n * @example\r\n * <CnMassImportDialog\r\n * v-if=\"showImportDialog\"\r\n * ref=\"importDialog\"\r\n * :options=\"importOptions\"\r\n * @confirm=\"onImportConfirm\"\r\n * @close=\"showImportDialog = false\">\r\n * <template #fields=\"{ file }\">\r\n * <NcSelect v-if=\"file\" :options=\"schemas\" @input=\"selectedSchema = $event\" />\r\n * </template>\r\n * </CnMassImportDialog>\r\n *\r\n * // In data:\r\n * importOptions: [\r\n * { key: 'validation', label: 'Enable validation', description: 'Validate against schema', default: true },\r\n * { key: 'publish', label: 'Auto-publish', description: 'Set published date', default: false },\r\n * ]\r\n *\r\n * // In methods:\r\n * async onImportConfirm({ file, options }) {\r\n * try {\r\n * const formData = new FormData()\r\n * formData.append('file', file)\r\n * const result = await axios.post('/api/import', formData, { params: options })\r\n * this.$refs.importDialog.setResult({ success: true, summary: result.data.summary })\r\n * } catch (e) {\r\n * this.$refs.importDialog.setResult({ error: e.message })\r\n * }\r\n * }\r\n */\r\nexport default {\r\n\tname: 'CnMassImportDialog',\r\n\r\n\tcomponents: {\r\n\t\tNcDialog,\r\n\t\tNcButton,\r\n\t\tNcNoteCard,\r\n\t\tNcLoadingIcon,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tUpload,\r\n\t\tImportIcon,\r\n\t\tChevronDown,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Dialog title */\r\n\t\tdialogTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Import Data',\r\n\t\t},\r\n\t\t/** Accepted file types (input accept attribute) */\r\n\t\tacceptedTypes: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '.json,.xlsx,.xls,.csv',\r\n\t\t},\r\n\t\t/** Import option definitions */\r\n\t\toptions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** File type help entries */\r\n\t\tfileTypeHelp: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [\r\n\t\t\t\t{ label: 'JSON', description: 'Configuration and objects.' },\r\n\t\t\t\t{ label: 'Excel (.xlsx, .xls)', description: 'Tabular objects data with multiple sheets.' },\r\n\t\t\t\t{ label: 'CSV', description: 'Single table of objects data.' },\r\n\t\t\t],\r\n\t\t},\r\n\t\t/** Whether the form is ready to submit (parent can control via slot logic) */\r\n\t\tcanSubmit: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Success text when all rows imported without errors */\r\n\t\tsuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Import completed successfully!',\r\n\t\t},\r\n\t\t/** Text when import partially succeeded */\r\n\t\tpartialSuccessText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Import completed with errors. Check the details below.',\r\n\t\t},\r\n\t\t/** Text shown while importing */\r\n\t\tloadingText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Importing data — this may take a moment for large files...',\r\n\t\t},\r\n\t\tsummaryTitle: { type: String, default: 'Import Summary' },\r\n\t\tsupportedFormatsLabel: { type: String, default: 'Supported file types:' },\r\n\t\tselectFileLabel: { type: String, default: 'Select File' },\r\n\t\tcancelLabel: { type: String, default: 'Cancel' },\r\n\t\tcloseLabel: { type: String, default: 'Close' },\r\n\t\tconfirmLabel: { type: String, default: 'Import' },\r\n\t\tsheetLabel: { type: String, default: 'Sheet' },\r\n\t\tfoundLabel: { type: String, default: 'Found' },\r\n\t\tcreatedLabel: { type: String, default: 'Created' },\r\n\t\tupdatedLabel: { type: String, default: 'Updated' },\r\n\t\tunchangedLabel: { type: String, default: 'Unchanged' },\r\n\t\terrorsLabel: { type: String, default: 'Errors' },\r\n\t},\r\n\r\n\tdata() {\r\n\t\tconst optionValues = {}\r\n\t\tthis.options.forEach((opt) => {\r\n\t\t\toptionValues[opt.key] = opt.default !== undefined ? opt.default : false\r\n\t\t})\r\n\t\treturn {\r\n\t\t\tselectedFile: null,\r\n\t\t\tloading: false,\r\n\t\t\tresult: null,\r\n\t\t\toptionValues,\r\n\t\t\texpandedErrors: {},\r\n\t\t}\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\thasErrors() {\r\n\t\t\tif (!this.result || !this.result.summary) return false\r\n\t\t\treturn Object.values(this.result.summary).some(\r\n\t\t\t\t(sheet) => sheet.errors && sheet.errors.length > 0,\r\n\t\t\t)\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\thandleFileSelect(event) {\r\n\t\t\tconst file = event.target.files[0]\r\n\t\t\tthis.selectedFile = file || null\r\n\t\t},\r\n\r\n\t\tsetOption(key, value) {\r\n\t\t\tthis.$set(this.optionValues, key, value)\r\n\t\t},\r\n\r\n\t\tformatFileSize(bytes) {\r\n\t\t\tif (bytes === 0) return '0 B'\r\n\t\t\tconst k = 1024\r\n\t\t\tconst sizes = ['B', 'KB', 'MB', 'GB']\r\n\t\t\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\r\n\t\t\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\r\n\t\t},\r\n\r\n\t\tgetCount(val) {\r\n\t\t\tif (Array.isArray(val)) return val.length\r\n\t\t\tif (typeof val === 'number') return val\r\n\t\t\treturn 0\r\n\t\t},\r\n\r\n\t\ttoggleErrors(key) {\r\n\t\t\tthis.$set(this.expandedErrors, key, !this.expandedErrors[key])\r\n\t\t},\r\n\r\n\t\texecuteImport() {\r\n\t\t\tthis.loading = true\r\n\t\t\tthis.$emit('confirm', {\r\n\t\t\t\tfile: this.selectedFile,\r\n\t\t\t\toptions: { ...this.optionValues },\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the result of the import operation.\r\n\t\t * @param {{ success?: boolean, error?: string, summary?: object }} resultData\r\n\t\t * @public\r\n\t\t */\r\n\t\tsetResult(resultData) {\r\n\t\t\tthis.loading = false\r\n\t\t\tthis.result = resultData\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-mass-import__form {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 16px;\r\n}\r\n\r\n.cn-mass-import__file-row {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: 12px;\r\n}\r\n\r\n.cn-mass-import__file-info {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: 6px;\r\n}\r\n\r\n.cn-mass-import__file-name {\r\n\tfont-weight: 500;\r\n}\r\n\r\n.cn-mass-import__file-size {\r\n\tcolor: var(--color-text-maxcontrast);\r\n\tfont-size: 0.9em;\r\n}\r\n\r\n.cn-mass-import__help {\r\n\tpadding: 12px;\r\n\tbackground: var(--color-background-hover);\r\n\tborder-radius: var(--border-radius);\r\n}\r\n\r\n.cn-mass-import__help p {\r\n\tmargin: 0 0 8px;\r\n}\r\n\r\n.cn-mass-import__help ul {\r\n\tmargin: 0;\r\n\tpadding-left: 20px;\r\n}\r\n\r\n.cn-mass-import__options {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tgap: 12px;\r\n}\r\n\r\n/* Summary table */\r\n.cn-mass-import__results h3 {\r\n\tmargin: 0 0 12px;\r\n\tfont-size: 1.1rem;\r\n}\r\n\r\n.cn-mass-import__summary-table {\r\n\twidth: 100%;\r\n\tborder-collapse: collapse;\r\n\tborder-radius: var(--border-radius);\r\n\toverflow: hidden;\r\n\tbox-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.cn-mass-import__summary-table th,\r\n.cn-mass-import__summary-table td {\r\n\tpadding: 8px 12px;\r\n\ttext-align: left;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-mass-import__summary-table th {\r\n\tbackground: var(--color-background-dark);\r\n\tfont-weight: 600;\r\n\tfont-size: 0.85rem;\r\n\ttext-transform: uppercase;\r\n}\r\n\r\n.cn-mass-import__sheet-name {\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-mass-import__stat {\r\n\ttext-align: center;\r\n\tfont-weight: 600;\r\n}\r\n\r\n.cn-mass-import__stat--found { color: var(--color-primary-element); }\r\n.cn-mass-import__stat--created { color: var(--color-success); }\r\n.cn-mass-import__stat--updated { color: var(--color-warning); }\r\n.cn-mass-import__stat--unchanged { color: var(--color-text-maxcontrast); }\r\n.cn-mass-import__stat--errors { color: var(--color-error); }\r\n\r\n.cn-mass-import__expand {\r\n\tbackground: none;\r\n\tborder: none;\r\n\tcursor: pointer;\r\n\tpadding: 2px;\r\n\tborder-radius: var(--border-radius-small, 4px);\r\n\tcolor: var(--color-error);\r\n\ttransition: transform 0.2s ease;\r\n\tvertical-align: middle;\r\n\tmargin-left: 4px;\r\n}\r\n\r\n.cn-mass-import__expand:hover {\r\n\tbackground: var(--color-background-hover);\r\n}\r\n\r\n.cn-mass-import__expand--open {\r\n\ttransform: rotate(180deg);\r\n}\r\n\r\n/* Error details */\r\n.cn-mass-import__error-row td {\r\n\tpadding: 8px 12px;\r\n\tbackground: var(--color-background-hover);\r\n}\r\n\r\n.cn-mass-import__error-table {\r\n\twidth: 100%;\r\n\tborder-collapse: collapse;\r\n\tfont-size: 0.9em;\r\n}\r\n\r\n.cn-mass-import__error-table th,\r\n.cn-mass-import__error-table td {\r\n\tpadding: 6px 10px;\r\n\ttext-align: left;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n\r\n.cn-mass-import__error-table th {\r\n\tbackground: var(--color-background-dark);\r\n\tfont-weight: 600;\r\n\tfont-size: 0.85rem;\r\n}\r\n</style>\r\n","<template>\n\t<NcDialog\n\t\t:name=\"dialogTitle\"\n\t\tsize=\"small\"\n\t\t:can-close=\"!loading\"\n\t\t@closing=\"$emit('close')\">\n\t\t<!-- Result phase -->\n\t\t<div v-if=\"result !== null\" class=\"cn-delete__result\">\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\n\t\t\t\t{{ successText }}\n\t\t\t</NcNoteCard>\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\n\t\t\t\t{{ result.error }}\n\t\t\t</NcNoteCard>\n\t\t</div>\n\n\t\t<!-- Confirm phase -->\n\t\t<div v-else class=\"cn-delete__confirm\">\n\t\t\t<NcNoteCard type=\"warning\">\n\t\t\t\t{{ resolvedWarningText }}\n\t\t\t</NcNoteCard>\n\t\t</div>\n\n\t\t<template #actions>\n\t\t\t<NcButton @click=\"$emit('close')\">\n\t\t\t\t{{ result !== null ? closeLabel : cancelLabel }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"result === null\"\n\t\t\t\ttype=\"error\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t@click=\"executeDelete\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\n\t\t\t\t\t<TrashCanOutline v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ confirmLabel }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</NcDialog>\n</template>\n\n<script>\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon } from '@nextcloud/vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\n\n/**\n * CnDeleteDialog — Single-item delete confirmation dialog.\n *\n * Two-phase UI: confirm then result. The dialog does NOT perform the delete\n * itself — it emits a `confirm` event with the item ID. The parent performs\n * the actual API call and calls `setResult()` via a ref.\n *\n * @example\n * <CnDeleteDialog\n * v-if=\"showDeleteDialog\"\n * ref=\"deleteDialog\"\n * :item=\"itemToDelete\"\n * @confirm=\"onDeleteConfirm\"\n * @close=\"showDeleteDialog = false\" />\n *\n * // In methods:\n * async onDeleteConfirm(id) {\n * try {\n * await store.deleteItem(id)\n * this.$refs.deleteDialog.setResult({ success: true })\n * } catch (e) {\n * this.$refs.deleteDialog.setResult({ error: e.message })\n * }\n * }\n */\nexport default {\n\tname: 'CnDeleteDialog',\n\n\tcomponents: {\n\t\tNcDialog,\n\t\tNcButton,\n\t\tNcNoteCard,\n\t\tNcLoadingIcon,\n\t\tTrashCanOutline,\n\t},\n\n\tprops: {\n\t\t/** The item to delete. Must have an `id` property. */\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\t/** Property name used for display (e.g., 'title', 'name') */\n\t\tnameField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'title',\n\t\t},\n\t\t/** Dialog title */\n\t\tdialogTitle: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Delete Item',\n\t\t},\n\t\t/** Warning text. Use `{name}` as placeholder for the item name. */\n\t\twarningText: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Are you sure you want to permanently delete \"{name}\"? This action cannot be undone.',\n\t\t},\n\t\t/** Success message */\n\t\tsuccessText: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Item successfully deleted.',\n\t\t},\n\t\tcancelLabel: { type: String, default: 'Cancel' },\n\t\tcloseLabel: { type: String, default: 'Close' },\n\t\tconfirmLabel: { type: String, default: 'Delete' },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tresult: null,\n\t\t\tcloseTimeout: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\titemName() {\n\t\t\treturn this.item[this.nameField] || this.item.name || this.item.title || this.item.id\n\t\t},\n\t\tresolvedWarningText() {\n\t\t\treturn this.warningText.replace('{name}', this.itemName)\n\t\t},\n\t},\n\n\tbeforeDestroy() {\n\t\tif (this.closeTimeout) clearTimeout(this.closeTimeout)\n\t},\n\n\t/**\n\t * @event confirm Emitted when the user confirms deletion. Payload: the item ID.\n\t * @event close Emitted when the dialog should be closed (cancel, close button, or auto-close after success).\n\t */\n\n\tmethods: {\n\t\texecuteDelete() {\n\t\t\tthis.loading = true\n\t\t\tthis.$emit('confirm', this.item.id)\n\t\t},\n\n\t\t/**\n\t\t * Set the result of the delete operation. Call this from the parent\n\t\t * after the API call completes.\n\t\t *\n\t\t * @param {{ success?: boolean, error?: string }} resultData\n\t\t * @public\n\t\t */\n\t\tsetResult(resultData) {\n\t\t\tthis.loading = false\n\t\t\tthis.result = resultData\n\t\t\tif (resultData.success) {\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\n\t\t\t\t\tthis.$emit('close')\n\t\t\t\t}, 2000)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-delete__confirm {\n\tpadding: 4px 0;\n}\n</style>\n","<template>\n\t<NcDialog\n\t\t:name=\"dialogTitle\"\n\t\tsize=\"small\"\n\t\t:can-close=\"!loading\"\n\t\t@closing=\"$emit('close')\">\n\t\t<!-- Result phase -->\n\t\t<div v-if=\"result !== null\" class=\"cn-copy__result\">\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\n\t\t\t\t{{ successText }}\n\t\t\t</NcNoteCard>\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\n\t\t\t\t{{ result.error }}\n\t\t\t</NcNoteCard>\n\t\t</div>\n\n\t\t<!-- Form phase -->\n\t\t<div v-else class=\"cn-copy__form\">\n\t\t\t<div class=\"cn-copy__pattern\">\n\t\t\t\t<label for=\"cn-copy-pattern\">{{ patternLabel }}</label>\n\t\t\t\t<NcSelect\n\t\t\t\t\tinput-id=\"cn-copy-pattern\"\n\t\t\t\t\t:options=\"patternOptions\"\n\t\t\t\t\t:value=\"selectedPattern\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t@input=\"selectedPattern = $event\" />\n\t\t\t</div>\n\n\t\t\t<div class=\"cn-copy__preview\">\n\t\t\t\t<div class=\"cn-copy__preview-row\">\n\t\t\t\t\t<span class=\"cn-copy__preview-original\">{{ itemName }}</span>\n\t\t\t\t\t<span class=\"cn-copy__preview-arrow\">→</span>\n\t\t\t\t\t<span class=\"cn-copy__preview-new\">{{ newName }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<template #actions>\n\t\t\t<NcButton @click=\"$emit('close')\">\n\t\t\t\t{{ result !== null ? closeLabel : cancelLabel }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"result === null\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t@click=\"executeCopy\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\n\t\t\t\t\t<ContentCopy v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ confirmLabel }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</NcDialog>\n</template>\n\n<script>\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\n\n/**\n * CnCopyDialog — Single-item copy confirmation dialog with naming pattern.\n *\n * Two-phase UI: form (with name preview) then result. The dialog does NOT\n * perform the copy itself — it emits a `confirm` event with the item ID\n * and the new name. The parent performs the actual API call and calls\n * `setResult()` via a ref.\n *\n * @example\n * <CnCopyDialog\n * v-if=\"showCopyDialog\"\n * ref=\"copyDialog\"\n * :item=\"itemToCopy\"\n * @confirm=\"onCopyConfirm\"\n * @close=\"showCopyDialog = false\" />\n *\n * // In methods:\n * async onCopyConfirm({ id, newName }) {\n * try {\n * await store.copyItem(id, { title: newName })\n * this.$refs.copyDialog.setResult({ success: true })\n * } catch (e) {\n * this.$refs.copyDialog.setResult({ error: e.message })\n * }\n * }\n */\nexport default {\n\tname: 'CnCopyDialog',\n\n\tcomponents: {\n\t\tNcDialog,\n\t\tNcButton,\n\t\tNcNoteCard,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tContentCopy,\n\t},\n\n\tprops: {\n\t\t/** The item to copy. Must have an `id` property. */\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\t/** Property name used for display (e.g., 'title', 'name') */\n\t\tnameField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'title',\n\t\t},\n\t\t/** Dialog title */\n\t\tdialogTitle: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Copy Item',\n\t\t},\n\t\t/** Label for the naming pattern selector */\n\t\tpatternLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Naming pattern',\n\t\t},\n\t\t/** Success message */\n\t\tsuccessText: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Item successfully copied.',\n\t\t},\n\t\tcancelLabel: { type: String, default: 'Cancel' },\n\t\tcloseLabel: { type: String, default: 'Close' },\n\t\tconfirmLabel: { type: String, default: 'Copy' },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tresult: null,\n\t\t\tcloseTimeout: null,\n\t\t\tselectedPattern: { id: 'copy-of', label: 'Copy of {name}' },\n\t\t}\n\t},\n\n\tcomputed: {\n\t\titemName() {\n\t\t\treturn this.item[this.nameField] || this.item.name || this.item.title || this.item.id\n\t\t},\n\n\t\tpatternOptions() {\n\t\t\treturn [\n\t\t\t\t{ id: 'copy-of', label: 'Copy of {name}' },\n\t\t\t\t{ id: 'name-copy', label: '{name} - Copy' },\n\t\t\t\t{ id: 'name-parens', label: '{name} (Copy)' },\n\t\t\t]\n\t\t},\n\n\t\tnewName() {\n\t\t\treturn this.applyPattern(this.itemName, this.selectedPattern.id)\n\t\t},\n\t},\n\n\tbeforeDestroy() {\n\t\tif (this.closeTimeout) clearTimeout(this.closeTimeout)\n\t},\n\n\t/**\n\t * @event confirm Emitted when the user confirms copying. Payload: `{ id, newName }`.\n\t * @event close Emitted when the dialog should be closed (cancel, close button, or auto-close after success).\n\t */\n\n\tmethods: {\n\t\tapplyPattern(name, patternId) {\n\t\t\tswitch (patternId) {\n\t\t\tcase 'copy-of':\n\t\t\t\treturn `Copy of ${name}`\n\t\t\tcase 'name-copy':\n\t\t\t\treturn `${name} - Copy`\n\t\t\tcase 'name-parens':\n\t\t\t\treturn `${name} (Copy)`\n\t\t\tdefault:\n\t\t\t\treturn `Copy of ${name}`\n\t\t\t}\n\t\t},\n\n\t\texecuteCopy() {\n\t\t\tthis.loading = true\n\t\t\tthis.$emit('confirm', {\n\t\t\t\tid: this.item.id,\n\t\t\t\tnewName: this.newName,\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set the result of the copy operation. Call this from the parent\n\t\t * after the API call completes.\n\t\t *\n\t\t * @param {{ success?: boolean, error?: string }} resultData\n\t\t * @public\n\t\t */\n\t\tsetResult(resultData) {\n\t\t\tthis.loading = false\n\t\t\tthis.result = resultData\n\t\t\tif (resultData.success) {\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\n\t\t\t\t\tthis.$emit('close')\n\t\t\t\t}, 2000)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-copy__pattern {\n\tmargin-bottom: 16px;\n}\n\n.cn-copy__pattern label {\n\tdisplay: block;\n\tfont-weight: 600;\n\tmargin-bottom: 4px;\n}\n\n.cn-copy__preview {\n\tmargin-top: 12px;\n}\n\n.cn-copy__preview-row {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 8px 12px;\n\tbackground-color: var(--color-background-hover);\n\tborder-radius: var(--border-radius);\n}\n\n.cn-copy__preview-original {\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-copy__preview-arrow {\n\tflex-shrink: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-copy__preview-new {\n\tfont-weight: 500;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n</style>\n","<template>\n\t<NcDialog\n\t\t:name=\"resolvedTitle\"\n\t\t:size=\"size\"\n\t\t:can-close=\"!loading\"\n\t\t@closing=\"$emit('close')\">\n\t\t<!-- Result phase -->\n\t\t<div v-if=\"result !== null\" class=\"cn-form-dialog__result\">\n\t\t\t<NcNoteCard v-if=\"result.success\" type=\"success\">\n\t\t\t\t{{ resolvedSuccessText }}\n\t\t\t</NcNoteCard>\n\t\t\t<NcNoteCard v-if=\"result.error\" type=\"error\">\n\t\t\t\t{{ result.error }}\n\t\t\t</NcNoteCard>\n\t\t</div>\n\n\t\t<!-- Form phase -->\n\t\t<div v-else class=\"cn-form-dialog__form\">\n\t\t\t<!-- Full form override slot -->\n\t\t\t<slot\n\t\t\t\tv-if=\"$scopedSlots.form\"\n\t\t\t\tname=\"form\"\n\t\t\t\t:fields=\"resolvedFields\"\n\t\t\t\t:form-data=\"formData\"\n\t\t\t\t:errors=\"errors\"\n\t\t\t\t:update-field=\"updateField\" />\n\n\t\t\t<!-- Auto-generated form -->\n\t\t\t<template v-else>\n\t\t\t\t<slot name=\"before-fields\" />\n\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"field in resolvedFields\"\n\t\t\t\t\t:key=\"field.key\"\n\t\t\t\t\tclass=\"cn-form-dialog__field\">\n\t\t\t\t\t<!-- Per-field override slot -->\n\t\t\t\t\t<slot\n\t\t\t\t\t\tv-if=\"$scopedSlots['field-' + field.key]\"\n\t\t\t\t\t\t:name=\"'field-' + field.key\"\n\t\t\t\t\t\t:field=\"field\"\n\t\t\t\t\t\t:value=\"formData[field.key]\"\n\t\t\t\t\t\t:error=\"errors[field.key]\"\n\t\t\t\t\t\t:update-field=\"updateField\" />\n\n\t\t\t\t\t<!-- Auto-generated field -->\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<!-- Text / Email / URL -->\n\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\tv-if=\"field.widget === 'text' || field.widget === 'email' || field.widget === 'url'\"\n\t\t\t\t\t\t\t:label=\"field.label + (field.required ? ' *' : '')\"\n\t\t\t\t\t\t\t:value=\"formData[field.key] != null ? String(formData[field.key]) : ''\"\n\t\t\t\t\t\t\t:helper-text=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t:error=\"!!errors[field.key]\"\n\t\t\t\t\t\t\t:type=\"field.widget === 'email' ? 'email' : field.widget === 'url' ? 'url' : 'text'\"\n\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t@update:value=\"value => updateField(field.key, value)\" />\n\n\t\t\t\t\t\t<!-- Number -->\n\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\tv-else-if=\"field.widget === 'number'\"\n\t\t\t\t\t\t\t:label=\"field.label + (field.required ? ' *' : '')\"\n\t\t\t\t\t\t\t:value=\"formData[field.key] != null ? String(formData[field.key]) : ''\"\n\t\t\t\t\t\t\t:helper-text=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t:error=\"!!errors[field.key]\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t@update:value=\"value => updateField(field.key, value !== '' ? Number(value) : null)\" />\n\n\t\t\t\t\t\t<!-- Textarea -->\n\t\t\t\t\t\t<div v-else-if=\"field.widget === 'textarea'\" class=\"cn-form-dialog__textarea-wrapper\">\n\t\t\t\t\t\t\t<label :for=\"'cn-form-' + field.key\" class=\"cn-form-dialog__label\">\n\t\t\t\t\t\t\t\t{{ field.label }}{{ field.required ? ' *' : '' }}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t:id=\"'cn-form-' + field.key\"\n\t\t\t\t\t\t\t\tclass=\"cn-form-dialog__textarea\"\n\t\t\t\t\t\t\t\t:value=\"formData[field.key] || ''\"\n\t\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\trows=\"4\"\n\t\t\t\t\t\t\t\t@input=\"updateField(field.key, $event.target.value)\" />\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t\tclass=\"cn-form-dialog__helper\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-form-dialog__helper--error': errors[field.key] }\">\n\t\t\t\t\t\t\t\t{{ errors[field.key] || field.description }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Select (enum) -->\n\t\t\t\t\t\t<div v-else-if=\"field.widget === 'select'\" class=\"cn-form-dialog__select-wrapper\">\n\t\t\t\t\t\t\t<label :for=\"'cn-form-' + field.key\" class=\"cn-form-dialog__label\">\n\t\t\t\t\t\t\t\t{{ field.label }}{{ field.required ? ' *' : '' }}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t:input-id=\"'cn-form-' + field.key\"\n\t\t\t\t\t\t\t\t:options=\"getEnumOptions(field)\"\n\t\t\t\t\t\t\t\t:value=\"getSelectedEnumOption(field)\"\n\t\t\t\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t\t@input=\"onSelectChange(field.key, $event)\" />\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t\tclass=\"cn-form-dialog__helper\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-form-dialog__helper--error': errors[field.key] }\">\n\t\t\t\t\t\t\t\t{{ errors[field.key] || field.description }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Multiselect (array with enum items) -->\n\t\t\t\t\t\t<div v-else-if=\"field.widget === 'multiselect'\" class=\"cn-form-dialog__select-wrapper\">\n\t\t\t\t\t\t\t<label :for=\"'cn-form-' + field.key\" class=\"cn-form-dialog__label\">\n\t\t\t\t\t\t\t\t{{ field.label }}{{ field.required ? ' *' : '' }}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t:input-id=\"'cn-form-' + field.key\"\n\t\t\t\t\t\t\t\t:options=\"getArrayEnumOptions(field)\"\n\t\t\t\t\t\t\t\t:value=\"getSelectedArrayOptions(field)\"\n\t\t\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t\t\t:clearable=\"true\"\n\t\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t\t@input=\"onMultiSelectChange(field.key, $event)\" />\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t\tclass=\"cn-form-dialog__helper\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-form-dialog__helper--error': errors[field.key] }\">\n\t\t\t\t\t\t\t\t{{ errors[field.key] || field.description }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Tags (array, freeform) -->\n\t\t\t\t\t\t<div v-else-if=\"field.widget === 'tags'\" class=\"cn-form-dialog__select-wrapper\">\n\t\t\t\t\t\t\t<label :for=\"'cn-form-' + field.key\" class=\"cn-form-dialog__label\">\n\t\t\t\t\t\t\t\t{{ field.label }}{{ field.required ? ' *' : '' }}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t:input-id=\"'cn-form-' + field.key\"\n\t\t\t\t\t\t\t\t:value=\"formData[field.key] || []\"\n\t\t\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\t\t\t:clearable=\"true\"\n\t\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t\t@input=\"updateField(field.key, $event)\" />\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t\tclass=\"cn-form-dialog__helper\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-form-dialog__helper--error': errors[field.key] }\">\n\t\t\t\t\t\t\t\t{{ errors[field.key] || field.description }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Checkbox / Switch (boolean) -->\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\tv-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t\t\t:checked=\"!!formData[field.key]\"\n\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t@update:checked=\"value => updateField(field.key, value)\">\n\t\t\t\t\t\t\t{{ field.label }}{{ field.required ? ' *' : '' }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t\t\t<!-- Date -->\n\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\tv-else-if=\"field.widget === 'date'\"\n\t\t\t\t\t\t\t:label=\"field.label + (field.required ? ' *' : '')\"\n\t\t\t\t\t\t\t:value=\"formData[field.key] || ''\"\n\t\t\t\t\t\t\t:helper-text=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t:error=\"!!errors[field.key]\"\n\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t@update:value=\"value => updateField(field.key, value)\" />\n\n\t\t\t\t\t\t<!-- Datetime -->\n\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\tv-else-if=\"field.widget === 'datetime'\"\n\t\t\t\t\t\t\t:label=\"field.label + (field.required ? ' *' : '')\"\n\t\t\t\t\t\t\t:value=\"formData[field.key] || ''\"\n\t\t\t\t\t\t\t:helper-text=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t:error=\"!!errors[field.key]\"\n\t\t\t\t\t\t\ttype=\"datetime-local\"\n\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t@update:value=\"value => updateField(field.key, value)\" />\n\n\t\t\t\t\t\t<!-- Fallback: text input -->\n\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t:label=\"field.label + (field.required ? ' *' : '')\"\n\t\t\t\t\t\t\t:value=\"formData[field.key] != null ? String(formData[field.key]) : ''\"\n\t\t\t\t\t\t\t:helper-text=\"errors[field.key] || field.description\"\n\t\t\t\t\t\t\t:error=\"!!errors[field.key]\"\n\t\t\t\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t@update:value=\"value => updateField(field.key, value)\" />\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\n\t\t\t\t<slot name=\"after-fields\" />\n\t\t\t</template>\n\t\t</div>\n\n\t\t<template #actions>\n\t\t\t<NcButton @click=\"$emit('close')\">\n\t\t\t\t{{ result !== null ? closeLabel : cancelLabel }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"result === null\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t@click=\"executeConfirm\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"loading\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else-if=\"isCreateMode\" :size=\"20\" />\n\t\t\t\t\t<ContentSaveOutline v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ resolvedConfirmLabel }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</NcDialog>\n</template>\n\n<script>\nimport { NcDialog, NcButton, NcNoteCard, NcLoadingIcon, NcTextField, NcSelect, NcCheckboxRadioSwitch } from '@nextcloud/vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport ContentSaveOutline from 'vue-material-design-icons/ContentSaveOutline.vue'\nimport { fieldsFromSchema } from '../../utils/schema.js'\n\n/**\n * CnFormDialog — Create/edit dialog with auto-generated form from schema.\n *\n * When `item` is null, operates in create mode. When `item` is provided,\n * operates in edit mode. Auto-generates form fields from schema using\n * `fieldsFromSchema()`, but supports slot overrides at three levels:\n *\n * - `#form` — Replace the entire form content\n * - `#field-{key}` — Replace a single auto-generated field\n * - `#before-fields` / `#after-fields` — Inject content around fields\n *\n * The dialog does NOT perform the save itself — it emits a `confirm` event\n * with the form data. The parent performs the actual API call and calls\n * `setResult()` via a ref.\n *\n * @event confirm Emitted when the user confirms the form. Payload: formData object (includes `id` in edit mode).\n * @event close Emitted when the dialog should be closed (cancel, close button, or auto-close after success).\n *\n * @example\n * <CnFormDialog\n * v-if=\"showFormDialog\"\n * ref=\"formDialog\"\n * :schema=\"schema\"\n * :item=\"editItem\"\n * @confirm=\"onFormConfirm\"\n * @close=\"showFormDialog = false\" />\n *\n * // In methods:\n * async onFormConfirm(formData) {\n * try {\n * if (formData.id) {\n * await store.updateItem(formData.id, formData)\n * } else {\n * await store.createItem(formData)\n * }\n * this.$refs.formDialog.setResult({ success: true })\n * } catch (e) {\n * this.$refs.formDialog.setResult({ error: e.message })\n * }\n * }\n */\nexport default {\n\tname: 'CnFormDialog',\n\n\tcomponents: {\n\t\tNcDialog,\n\t\tNcButton,\n\t\tNcNoteCard,\n\t\tNcLoadingIcon,\n\t\tNcTextField,\n\t\tNcSelect,\n\t\tNcCheckboxRadioSwitch,\n\t\tPlus,\n\t\tContentSaveOutline,\n\t},\n\n\tprops: {\n\t\t/** Schema for auto-generating fields. Either schema or fields must be provided. */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\t/** Existing item for edit mode. Pass null for create mode. */\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t\t/** Dialog title. Defaults to \"Create {schema.title}\" or \"Edit {schema.title}\". */\n\t\tdialogTitle: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\t/** Manual field definitions. Overrides schema-generated fields when provided. */\n\t\tfields: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\t\t/** Field keys to exclude from auto-generated form */\n\t\texcludeFields: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\t\t/** Field keys to include (whitelist mode) */\n\t\tincludeFields: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\t\t/** Per-field overrides passed to fieldsFromSchema */\n\t\tfieldOverrides: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\t/** Which field is the \"name\" (used in result messages) */\n\t\tnameField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'title',\n\t\t},\n\t\t/** NcDialog size */\n\t\tsize: {\n\t\t\ttype: String,\n\t\t\tdefault: 'normal',\n\t\t},\n\t\t/** Success message. Defaults to \"Item saved successfully.\" */\n\t\tsuccessText: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tcancelLabel: { type: String, default: 'Cancel' },\n\t\tcloseLabel: { type: String, default: 'Close' },\n\t\t/** Confirm button label. Defaults to \"Create\" or \"Save\". */\n\t\tconfirmLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tformData: {},\n\t\t\terrors: {},\n\t\t\tloading: false,\n\t\t\tresult: null,\n\t\t\tcloseTimeout: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisCreateMode() {\n\t\t\treturn !this.item\n\t\t},\n\n\t\tschemaTitle() {\n\t\t\treturn (this.schema && this.schema.title) || 'Item'\n\t\t},\n\n\t\tresolvedTitle() {\n\t\t\tif (this.dialogTitle) return this.dialogTitle\n\t\t\treturn this.isCreateMode\n\t\t\t\t? `Create ${this.schemaTitle}`\n\t\t\t\t: `Edit ${this.schemaTitle}`\n\t\t},\n\n\t\tresolvedConfirmLabel() {\n\t\t\tif (this.confirmLabel) return this.confirmLabel\n\t\t\treturn this.isCreateMode ? 'Create' : 'Save'\n\t\t},\n\n\t\tresolvedSuccessText() {\n\t\t\tif (this.successText) return this.successText\n\t\t\treturn `${this.schemaTitle} saved successfully.`\n\t\t},\n\n\t\tresolvedFields() {\n\t\t\t// Manual fields take priority\n\t\t\tif (this.fields) return this.fields\n\n\t\t\t// Auto-generate from schema\n\t\t\treturn fieldsFromSchema(this.schema, {\n\t\t\t\texclude: this.excludeFields,\n\t\t\t\tinclude: this.includeFields,\n\t\t\t\toverrides: this.fieldOverrides,\n\t\t\t})\n\t\t},\n\t},\n\n\twatch: {\n\t\titem: {\n\t\t\timmediate: true,\n\t\t\thandler(newItem) {\n\t\t\t\tthis.initFormData(newItem)\n\t\t\t},\n\t\t},\n\t},\n\n\tmethods: {\n\t\tinitFormData(item) {\n\t\t\tif (item) {\n\t\t\t\t// Edit mode: clone item data\n\t\t\t\tthis.formData = JSON.parse(JSON.stringify(item))\n\t\t\t} else {\n\t\t\t\t// Create mode: initialize with field defaults\n\t\t\t\tconst data = {}\n\t\t\t\tfor (const field of this.resolvedFields) {\n\t\t\t\t\tif (field.default !== null && field.default !== undefined) {\n\t\t\t\t\t\tdata[field.key] = field.default\n\t\t\t\t\t} else if (field.widget === 'checkbox') {\n\t\t\t\t\t\tdata[field.key] = false\n\t\t\t\t\t} else if (field.widget === 'tags' || field.widget === 'multiselect') {\n\t\t\t\t\t\tdata[field.key] = []\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdata[field.key] = null\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.formData = data\n\t\t\t}\n\t\t\tthis.errors = {}\n\t\t},\n\n\t\tupdateField(key, value) {\n\t\t\tthis.$set(this.formData, key, value)\n\t\t\t// Clear error when field is edited\n\t\t\tif (this.errors[key]) {\n\t\t\t\tthis.$delete(this.errors, key)\n\t\t\t}\n\t\t},\n\n\t\tgetEnumOptions(field) {\n\t\t\tif (!field.enum) return []\n\t\t\treturn field.enum.map((val) => ({\n\t\t\t\tid: val,\n\t\t\t\tlabel: String(val),\n\t\t\t}))\n\t\t},\n\n\t\tgetSelectedEnumOption(field) {\n\t\t\tconst val = this.formData[field.key]\n\t\t\tif (val === null || val === undefined) return null\n\t\t\treturn { id: val, label: String(val) }\n\t\t},\n\n\t\tonSelectChange(key, option) {\n\t\t\tthis.updateField(key, option ? option.id : null)\n\t\t},\n\n\t\tgetArrayEnumOptions(field) {\n\t\t\tif (!field.items || !field.items.enum) return []\n\t\t\treturn field.items.enum.map((val) => ({\n\t\t\t\tid: val,\n\t\t\t\tlabel: String(val),\n\t\t\t}))\n\t\t},\n\n\t\tgetSelectedArrayOptions(field) {\n\t\t\tconst val = this.formData[field.key]\n\t\t\tif (!Array.isArray(val)) return []\n\t\t\treturn val.map((v) => ({ id: v, label: String(v) }))\n\t\t},\n\n\t\tonMultiSelectChange(key, options) {\n\t\t\tthis.updateField(key, (options || []).map((o) => o.id))\n\t\t},\n\n\t\t/**\n\t\t * Run client-side validation on all form fields.\n\t\t * Checks required, minLength, maxLength, pattern, minimum, maximum.\n\t\t *\n\t\t * @return {boolean} True if all fields pass validation\n\t\t * @public\n\t\t */\n\t\tvalidate() {\n\t\t\tconst newErrors = {}\n\t\t\tfor (const field of this.resolvedFields) {\n\t\t\t\tconst value = this.formData[field.key]\n\n\t\t\t\t// Required check\n\t\t\t\tif (field.required) {\n\t\t\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\t\t\tnewErrors[field.key] = `${field.label} is required.`\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(value) && value.length === 0) {\n\t\t\t\t\t\tnewErrors[field.key] = `${field.label} is required.`\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Skip further validation if empty and not required\n\t\t\t\tif (value === null || value === undefined || value === '') continue\n\n\t\t\t\tconst v = field.validation || {}\n\n\t\t\t\t// String length checks\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\tif (v.minLength !== undefined && value.length < v.minLength) {\n\t\t\t\t\t\tnewErrors[field.key] = `Minimum ${v.minLength} characters.`\n\t\t\t\t\t} else if (v.maxLength !== undefined && value.length > v.maxLength) {\n\t\t\t\t\t\tnewErrors[field.key] = `Maximum ${v.maxLength} characters.`\n\t\t\t\t\t} else if (v.pattern !== undefined) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (!new RegExp(v.pattern).test(value)) {\n\t\t\t\t\t\t\t\tnewErrors[field.key] = 'Invalid format.'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Ignore invalid regex patterns\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Number range checks\n\t\t\t\tif (typeof value === 'number') {\n\t\t\t\t\tif (v.minimum !== undefined && value < v.minimum) {\n\t\t\t\t\t\tnewErrors[field.key] = `Minimum value is ${v.minimum}.`\n\t\t\t\t\t} else if (v.maximum !== undefined && value > v.maximum) {\n\t\t\t\t\t\tnewErrors[field.key] = `Maximum value is ${v.maximum}.`\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.errors = newErrors\n\t\t\treturn Object.keys(newErrors).length === 0\n\t\t},\n\n\t\texecuteConfirm() {\n\t\t\tif (!this.validate()) return\n\n\t\t\tthis.loading = true\n\t\t\t/**\n\t\t\t * @event confirm Emitted when the user confirms the form.\n\t\t\t * Payload: form data object. Includes `id` when editing.\n\t\t\t */\n\t\t\tthis.$emit('confirm', { ...this.formData })\n\t\t},\n\n\t\t/**\n\t\t * Set the result of the save operation. Call this from the parent\n\t\t * after the API call completes.\n\t\t *\n\t\t * @param {{ success?: boolean, error?: string }} resultData\n\t\t * @public\n\t\t */\n\t\tsetResult(resultData) {\n\t\t\tthis.loading = false\n\t\t\tthis.result = resultData\n\t\t\tif (resultData.success) {\n\t\t\t\tthis.closeTimeout = setTimeout(() => {\n\t\t\t\t\tthis.$emit('close')\n\t\t\t\t}, 2000)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Set per-field validation errors from the server. Call this from\n\t\t * the parent when the API returns validation errors.\n\t\t *\n\t\t * @param {object} fieldErrors Object keyed by field key with error messages\n\t\t * @public\n\t\t */\n\t\tsetValidationErrors(fieldErrors) {\n\t\t\tthis.loading = false\n\t\t\tthis.errors = { ...this.errors, ...fieldErrors }\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-form-dialog__form {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-form-dialog__field {\n\tmargin-bottom: 8px;\n}\n\n.cn-form-dialog__textarea-wrapper,\n.cn-form-dialog__select-wrapper {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-form-dialog__label {\n\tfont-weight: 600;\n\tfont-size: 0.9em;\n\tcolor: var(--color-main-text);\n}\n\n.cn-form-dialog__textarea {\n\twidth: 100%;\n\tmin-height: 80px;\n\tpadding: 8px;\n\tborder: 2px solid var(--color-border-maxcontrast);\n\tborder-radius: var(--border-radius-large);\n\tbackground-color: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tresize: vertical;\n}\n\n.cn-form-dialog__textarea:focus {\n\tborder-color: var(--color-primary-element);\n\toutline: none;\n}\n\n.cn-form-dialog__textarea:disabled {\n\topacity: 0.5;\n\tcursor: not-allowed;\n}\n\n.cn-form-dialog__helper {\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-form-dialog__helper--error {\n\tcolor: var(--color-error);\n}\n</style>\n","<template>\r\n\t<div class=\"cn-index-page\">\r\n\t\t<!-- Header (hidden by default — shown in sidebar instead) -->\r\n\t\t<CnPageHeader\r\n\t\t\tv-if=\"showTitle\"\r\n\t\t\t:title=\"title\"\r\n\t\t\t:description=\"description\"\r\n\t\t\t:icon=\"resolvedIcon\" />\r\n\r\n\t\t<!-- Actions bar -->\r\n\t\t<CnActionsBar\r\n\t\t\t:pagination=\"pagination\"\r\n\t\t\t:object-count=\"objects.length\"\r\n\t\t\t:selectable=\"selectable\"\r\n\t\t\t:selected-ids=\"internalSelectedIds\"\r\n\t\t\t:add-label=\"resolvedAddLabel\"\r\n\t\t\t:add-icon=\"resolvedIcon\"\r\n\t\t\t:inline-action-count=\"inlineActionCount\"\r\n\t\t\t:show-mass-import=\"showMassImport\"\r\n\t\t\t:show-mass-export=\"showMassExport\"\r\n\t\t\t:show-mass-copy=\"showMassCopy\"\r\n\t\t\t:show-mass-delete=\"showMassDelete\"\r\n\t\t\t:view-mode=\"currentViewMode\"\r\n\t\t\t:show-view-toggle=\"showViewToggle\"\r\n\t\t\t@add=\"onAddClick\"\r\n\t\t\t@refresh=\"$emit('refresh')\"\r\n\t\t\t@show-import=\"showImportDialog = true\"\r\n\t\t\t@show-export=\"showExportDialog = true\"\r\n\t\t\t@show-copy=\"showMassCopyDialog = true\"\r\n\t\t\t@show-delete=\"showMassDeleteDialog = true\"\r\n\t\t\t@view-mode-change=\"onViewModeChange\">\r\n\t\t\t<template v-if=\"$scopedSlots['mass-actions']\" #mass-actions=\"{ count, selectedIds: ids }\">\r\n\t\t\t\t<slot name=\"mass-actions\" :count=\"count\" :selected-ids=\"ids\" />\r\n\t\t\t</template>\r\n\t\t\t<template v-if=\"$scopedSlots['action-items']\" #action-items>\r\n\t\t\t\t<slot name=\"action-items\" />\r\n\t\t\t</template>\r\n\t\t\t<template v-if=\"$scopedSlots['header-actions']\" #header-actions>\r\n\t\t\t\t<slot name=\"header-actions\" />\r\n\t\t\t</template>\r\n\t\t</CnActionsBar>\r\n\r\n\t\t<!-- Mass delete dialog -->\r\n\t\t<CnMassDeleteDialog\r\n\t\t\tv-if=\"showMassDeleteDialog\"\r\n\t\t\tref=\"massDeleteDialog\"\r\n\t\t\t:items=\"selectedObjects\"\r\n\t\t\t:name-field=\"massActionNameField\"\r\n\t\t\t@confirm=\"onMassDeleteConfirm\"\r\n\t\t\t@close=\"showMassDeleteDialog = false\" />\r\n\r\n\t\t<!-- Mass copy dialog -->\r\n\t\t<CnMassCopyDialog\r\n\t\t\tv-if=\"showMassCopyDialog\"\r\n\t\t\tref=\"massCopyDialog\"\r\n\t\t\t:items=\"selectedObjects\"\r\n\t\t\t:name-field=\"massActionNameField\"\r\n\t\t\t@confirm=\"onMassCopyConfirm\"\r\n\t\t\t@close=\"showMassCopyDialog = false\" />\r\n\r\n\t\t<!-- Mass export dialog -->\r\n\t\t<CnMassExportDialog\r\n\t\t\tv-if=\"showExportDialog\"\r\n\t\t\tref=\"exportDialog\"\r\n\t\t\t:formats=\"exportFormats\"\r\n\t\t\t@confirm=\"onMassExportConfirm\"\r\n\t\t\t@close=\"showExportDialog = false\" />\r\n\r\n\t\t<!-- Mass import dialog -->\r\n\t\t<CnMassImportDialog\r\n\t\t\tv-if=\"showImportDialog\"\r\n\t\t\tref=\"importDialog\"\r\n\t\t\t:options=\"importOptions\"\r\n\t\t\t@confirm=\"onMassImportConfirm\"\r\n\t\t\t@close=\"showImportDialog = false\">\r\n\t\t\t<template v-if=\"$scopedSlots['import-fields']\" #fields=\"{ file }\">\r\n\t\t\t\t<slot name=\"import-fields\" :file=\"file\" />\r\n\t\t\t</template>\r\n\t\t</CnMassImportDialog>\r\n\r\n\t\t<!-- Single delete dialog (overridable via slot) -->\r\n\t\t<slot\r\n\t\t\tname=\"delete-dialog\"\r\n\t\t\t:item=\"actionTargetItem\"\r\n\t\t\t:close=\"closeSingleDelete\">\r\n\t\t\t<CnDeleteDialog\r\n\t\t\t\tv-if=\"showSingleDeleteDialog && actionTargetItem\"\r\n\t\t\t\tref=\"singleDeleteDialog\"\r\n\t\t\t\t:item=\"actionTargetItem\"\r\n\t\t\t\t:name-field=\"massActionNameField\"\r\n\t\t\t\t@confirm=\"onSingleDeleteConfirm\"\r\n\t\t\t\t@close=\"closeSingleDelete\" />\r\n\t\t</slot>\r\n\r\n\t\t<!-- Single copy dialog (overridable via slot) -->\r\n\t\t<slot\r\n\t\t\tname=\"copy-dialog\"\r\n\t\t\t:item=\"actionTargetItem\"\r\n\t\t\t:close=\"closeSingleCopy\">\r\n\t\t\t<CnCopyDialog\r\n\t\t\t\tv-if=\"showSingleCopyDialog && actionTargetItem\"\r\n\t\t\t\tref=\"singleCopyDialog\"\r\n\t\t\t\t:item=\"actionTargetItem\"\r\n\t\t\t\t:name-field=\"massActionNameField\"\r\n\t\t\t\t@confirm=\"onSingleCopyConfirm\"\r\n\t\t\t\t@close=\"closeSingleCopy\" />\r\n\t\t</slot>\r\n\r\n\t\t<!-- Form dialog for create/edit (overridable via slot) -->\r\n\t\t<slot\r\n\t\t\tname=\"form-dialog\"\r\n\t\t\t:item=\"editItem\"\r\n\t\t\t:schema=\"schema\"\r\n\t\t\t:close=\"closeFormDialog\">\r\n\t\t\t<CnFormDialog\r\n\t\t\t\tv-if=\"showFormDialogVisible\"\r\n\t\t\t\tref=\"formDialog\"\r\n\t\t\t\t:schema=\"schema\"\r\n\t\t\t\t:item=\"editItem\"\r\n\t\t\t\t:exclude-fields=\"excludeFields\"\r\n\t\t\t\t:include-fields=\"includeFields\"\r\n\t\t\t\t:field-overrides=\"fieldOverrides\"\r\n\t\t\t\t:name-field=\"massActionNameField\"\r\n\t\t\t\t@confirm=\"onFormConfirm\"\r\n\t\t\t\t@close=\"closeFormDialog\">\r\n\t\t\t\t<template v-if=\"$scopedSlots['form-fields']\" #form=\"scope\">\r\n\t\t\t\t\t<slot name=\"form-fields\" v-bind=\"scope\" />\r\n\t\t\t\t</template>\r\n\t\t\t</CnFormDialog>\r\n\t\t</slot>\r\n\r\n\t\t<!-- Body -->\r\n\t\t<div class=\"cn-index-page__body\">\r\n\t\t\t<div class=\"cn-index-page__main\">\r\n\t\t\t\t<!-- Loading state -->\r\n\t\t\t\t<div v-if=\"loading\" class=\"cn-index-page__loading\">\r\n\t\t\t\t\t<NcLoadingIcon :size=\"32\" />\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Empty state -->\r\n\t\t\t\t<div v-else-if=\"objects.length === 0\" class=\"cn-index-page__empty\">\r\n\t\t\t\t\t<slot name=\"empty\">\r\n\t\t\t\t\t\t<NcEmptyContent :name=\"emptyText\">\r\n\t\t\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t\t\t<CnIcon v-if=\"resolvedIcon\" :name=\"resolvedIcon\" :size=\"64\" />\r\n\t\t\t\t\t\t\t\t<DatabaseSearch v-else :size=\"64\" />\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t</NcEmptyContent>\r\n\t\t\t\t\t</slot>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Table view -->\r\n\t\t\t\t<CnDataTable\r\n\t\t\t\t\tv-else-if=\"currentViewMode === 'table'\"\r\n\t\t\t\t\t:schema=\"schema\"\r\n\t\t\t\t\t:columns=\"columns\"\r\n\t\t\t\t\t:rows=\"objects\"\r\n\t\t\t\t\t:sort-key=\"sortKey\"\r\n\t\t\t\t\t:sort-order=\"sortOrder\"\r\n\t\t\t\t\t:selectable=\"selectable\"\r\n\t\t\t\t\t:selected-ids=\"internalSelectedIds\"\r\n\t\t\t\t\t:row-key=\"rowKey\"\r\n\t\t\t\t\t:empty-text=\"emptyText\"\r\n\t\t\t\t\t:exclude-columns=\"excludeColumns\"\r\n\t\t\t\t\t:include-columns=\"includeColumns\"\r\n\t\t\t\t\t:column-overrides=\"columnOverrides\"\r\n\t\t\t\t\t:row-class=\"rowClass\"\r\n\t\t\t\t\t@sort=\"$emit('sort', $event)\"\r\n\t\t\t\t\t@select=\"onSelect\"\r\n\t\t\t\t\t@row-click=\"$emit('row-click', $event)\">\r\n\t\t\t\t\t<!-- Pass through column slots -->\r\n\t\t\t\t\t<template\r\n\t\t\t\t\t\tv-for=\"col in slotColumns\"\r\n\t\t\t\t\t\t#[`column-${col}`]=\"{ row, value }\">\r\n\t\t\t\t\t\t<slot :name=\"'column-' + col\" :row=\"row\" :value=\"value\" />\r\n\t\t\t\t\t</template>\r\n\r\n\t\t\t\t\t<!-- Row actions -->\r\n\t\t\t\t\t<template v-if=\"hasRowActions\" #row-actions=\"{ row }\">\r\n\t\t\t\t\t\t<slot name=\"row-actions\" :row=\"row\">\r\n\t\t\t\t\t\t\t<CnRowActions\r\n\t\t\t\t\t\t\t\t:actions=\"mergedActions\"\r\n\t\t\t\t\t\t\t\t:row=\"row\"\r\n\t\t\t\t\t\t\t\t@action=\"$emit('action', $event)\" />\r\n\t\t\t\t\t\t</slot>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</CnDataTable>\r\n\r\n\t\t\t\t<!-- Card view -->\r\n\t\t\t\t<CnCardGrid\r\n\t\t\t\t\tv-else\r\n\t\t\t\t\t:objects=\"objects\"\r\n\t\t\t\t\t:schema=\"schema\"\r\n\t\t\t\t\t:selectable=\"selectable\"\r\n\t\t\t\t\t:selected-ids=\"internalSelectedIds\"\r\n\t\t\t\t\t:row-key=\"rowKey\"\r\n\t\t\t\t\t:empty-text=\"emptyText\"\r\n\t\t\t\t\t@click=\"$emit('row-click', $event)\"\r\n\t\t\t\t\t@select=\"onSelect\">\r\n\t\t\t\t\t<template v-if=\"$scopedSlots.card\" #card=\"{ object, selected }\">\r\n\t\t\t\t\t\t<slot name=\"card\" :object=\"object\" :selected=\"selected\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-if=\"hasRowActions\" #card-actions=\"{ object }\">\r\n\t\t\t\t\t\t<slot name=\"row-actions\" :row=\"object\">\r\n\t\t\t\t\t\t\t<CnRowActions\r\n\t\t\t\t\t\t\t\t:actions=\"mergedActions\"\r\n\t\t\t\t\t\t\t\t:row=\"object\"\r\n\t\t\t\t\t\t\t\t@action=\"$emit('action', $event)\" />\r\n\t\t\t\t\t\t</slot>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</CnCardGrid>\r\n\r\n\t\t\t\t<!-- Pagination -->\r\n\t\t\t\t<CnPagination\r\n\t\t\t\t\tv-if=\"pagination && pagination.pages > 1\"\r\n\t\t\t\t\t:current-page=\"pagination.page || 1\"\r\n\t\t\t\t\t:total-pages=\"pagination.pages || 1\"\r\n\t\t\t\t\t:total-items=\"pagination.total || 0\"\r\n\t\t\t\t\t:current-page-size=\"pagination.limit || 20\"\r\n\t\t\t\t\tclass=\"cn-index-page__pagination\"\r\n\t\t\t\t\t@page-changed=\"$emit('page-changed', $event)\"\r\n\t\t\t\t\t@page-size-changed=\"$emit('page-size-changed', $event)\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\nimport { NcLoadingIcon, NcEmptyContent } from '@nextcloud/vue'\r\nimport DatabaseSearch from 'vue-material-design-icons/DatabaseSearch.vue'\r\nimport Eye from 'vue-material-design-icons/Eye.vue'\r\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\r\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\r\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\r\nimport { CnPageHeader } from '../CnPageHeader/index.js'\r\nimport { CnActionsBar } from '../CnActionsBar/index.js'\r\nimport { CnIcon, ICON_MAP } from '../CnIcon/index.js'\r\nimport { CnDataTable } from '../CnDataTable/index.js'\r\nimport { CnCardGrid } from '../CnCardGrid/index.js'\r\nimport { CnPagination } from '../CnPagination/index.js'\r\nimport { CnRowActions } from '../CnRowActions/index.js'\r\nimport { CnMassDeleteDialog } from '../CnMassDeleteDialog/index.js'\r\nimport { CnMassCopyDialog } from '../CnMassCopyDialog/index.js'\r\nimport { CnMassExportDialog } from '../CnMassExportDialog/index.js'\r\nimport { CnMassImportDialog } from '../CnMassImportDialog/index.js'\r\nimport { CnDeleteDialog } from '../CnDeleteDialog/index.js'\r\nimport { CnCopyDialog } from '../CnCopyDialog/index.js'\r\nimport { CnFormDialog } from '../CnFormDialog/index.js'\r\n\r\n/**\r\n * CnIndexPage — Top-level schema-driven index page component.\r\n *\r\n * Assembles sub-components (CnPageHeader, CnActionsBar, table, cards,\r\n * pagination, mass actions, single-object dialogs) into a single\r\n * zero-config page.\r\n *\r\n * Dialogs are overridable via named slots:\r\n * - `#form-dialog` — Replace the create/edit dialog entirely\r\n * - `#delete-dialog` — Replace the single-item delete dialog\r\n * - `#copy-dialog` — Replace the single-item copy dialog\r\n * - `#form-fields` — Replace only the form content inside the built-in form dialog\r\n *\r\n * @example Minimal usage (auto-generated dialogs from schema)\r\n * <CnIndexPage\r\n * title=\"Clients\"\r\n * :schema=\"schema\"\r\n * :objects=\"clients\"\r\n * :pagination=\"pagination\"\r\n * :loading=\"loading\"\r\n * @create=\"onCreate\"\r\n * @edit=\"onEdit\"\r\n * @delete=\"onDelete\"\r\n * @refresh=\"fetchClients\"\r\n * @row-click=\"openClient\"\r\n * @page-changed=\"onPage\" />\r\n *\r\n * @example With custom form dialog\r\n * <CnIndexPage ...>\r\n * <template #form-dialog=\"{ item, schema, close }\">\r\n * <MyCustomFormDialog :item=\"item\" @close=\"close\" />\r\n * </template>\r\n * </CnIndexPage>\r\n *\r\n * @event {void} add — Add button clicked (backward compat, only if listener attached)\r\n * @event {object} create — Form dialog create confirmed. Payload: formData object\r\n * @event {object} edit — Form dialog edit confirmed. Payload: formData object (includes id)\r\n * @event {string} delete — Single delete confirmed. Payload: item ID\r\n * @event {{ id: string, newName: string }} copy — Single copy confirmed\r\n * @event {string[]} mass-delete — Mass delete confirmed. Payload: array of IDs\r\n * @event {object} mass-copy — Mass copy confirmed. Payload: { ids, pattern }\r\n * @event {object} mass-export — Mass export confirmed. Payload: { ids, format }\r\n * @event {object} mass-import — Mass import confirmed. Payload: import data\r\n * @event {void} refresh — Refresh button clicked\r\n * @event {object} row-click — Table row or card clicked. Payload: row object\r\n * @event {{ key: string, order: string }} sort — Column sort changed\r\n * @event {number} page-changed — Pagination page changed\r\n * @event {number} page-size-changed — Pagination page size changed\r\n * @event {string[]} select — Selection changed. Payload: array of selected IDs\r\n * @event {object} action — Row action triggered. Payload: { action, row }\r\n *\r\n * @slot mass-actions — Extra mass action buttons (shown when items are selected)\r\n * @slot action-items — Extra action bar buttons\r\n * @slot header-actions — Extra buttons in the page header\r\n * @slot delete-dialog — Replace the single-item delete dialog. Scope: `{ item, close }`\r\n * @slot copy-dialog — Replace the single-item copy dialog. Scope: `{ item, close }`\r\n * @slot form-dialog — Replace the create/edit form dialog. Scope: `{ item, schema, close }`\r\n * @slot form-fields — Replace form content inside the built-in CnFormDialog. Scope: `{ fields, formData, errors, updateField }`\r\n * @slot import-fields — Extra fields in the import dialog\r\n * @slot empty — Custom empty state content\r\n * @slot card — Custom card template for card view. Scope: `{ row }`\r\n * @slot row-actions — Custom row actions. Scope: `{ row }`\r\n * @slot column-{key} — Custom cell renderer for a specific column. Scope: `{ row, value }`\r\n */\r\nexport default {\r\n\tname: 'CnIndexPage',\r\n\r\n\tcomponents: {\r\n\t\tNcLoadingIcon,\r\n\t\tNcEmptyContent,\r\n\t\tDatabaseSearch,\r\n\t\tCnPageHeader,\r\n\t\tCnActionsBar,\r\n\t\tCnIcon,\r\n\t\tCnDataTable,\r\n\t\tCnCardGrid,\r\n\t\tCnPagination,\r\n\t\tCnRowActions,\r\n\t\tCnMassDeleteDialog,\r\n\t\tCnMassCopyDialog,\r\n\t\tCnMassExportDialog,\r\n\t\tCnMassImportDialog,\r\n\t\tCnDeleteDialog,\r\n\t\tCnCopyDialog,\r\n\t\tCnFormDialog,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Page title */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\trequired: true,\r\n\t\t},\r\n\t\t/** Optional description shown below the title */\r\n\t\tdescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/**\r\n\t\t * Whether to show the page header (icon, title, description) inline.\r\n\t\t * When false (default), the title is shown in the sidebar header instead.\r\n\t\t */\r\n\t\tshowTitle: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Optional MDI icon name. Defaults to schema.icon when a schema is provided. */\r\n\t\ticon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Schema definition */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Manual column definitions (used instead of schema when provided) */\r\n\t\tcolumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Object/row data array */\r\n\t\tobjects: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Pagination state: { page, pages, total, limit } */\r\n\t\tpagination: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Whether data is loading */\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false,\r\n\t\t},\r\n\t\t/** Whether rows/cards can be selected */\r\n\t\tselectable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Currently selected IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** View mode: 'table' or 'cards' */\r\n\t\tviewMode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'table',\r\n\t\t\tvalidator: (v) => ['table', 'cards'].includes(v),\r\n\t\t},\r\n\t\t/** Current sort key */\r\n\t\tsortKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Current sort order */\r\n\t\tsortOrder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'asc',\r\n\t\t},\r\n\t\t/** Unique row identifier property */\r\n\t\trowKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'id',\r\n\t\t},\r\n\t\t/** Columns to exclude in schema mode */\r\n\t\texcludeColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Columns to include in schema mode (whitelist) */\r\n\t\tincludeColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Per-column overrides in schema mode */\r\n\t\tcolumnOverrides: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Row action definitions (app-provided, merged with built-in actions) */\r\n\t\tactions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Text shown when no items found */\r\n\t\temptyText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'No items found',\r\n\t\t},\r\n\t\t/** Function returning CSS class(es) for a row */\r\n\t\trowClass: {\r\n\t\t\ttype: Function,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Override label for the Add button. Defaults to \"Add {schema.title}\" */\r\n\t\taddLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\r\n\t\tinlineActionCount: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 2,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Import action */\r\n\t\tshowMassImport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Export action */\r\n\t\tshowMassExport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Copy button */\r\n\t\tshowMassCopy: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in mass Delete button */\r\n\t\tshowMassDelete: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Property name used to display item names in dialogs */\r\n\t\tmassActionNameField: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'title',\r\n\t\t},\r\n\t\t/** Available export formats for the export dialog */\r\n\t\texportFormats: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [\r\n\t\t\t\t{ id: 'excel', label: 'Excel (.xlsx)' },\r\n\t\t\t\t{ id: 'csv', label: 'CSV (.csv)' },\r\n\t\t\t],\r\n\t\t},\r\n\t\t/** Import option definitions for the import dialog */\r\n\t\timportOptions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Whether to show the built-in form dialog for Add/Edit */\r\n\t\tshowFormDialog: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to add an Edit action to row actions */\r\n\t\tshowEditAction: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to add a Copy action to row actions */\r\n\t\tshowCopyAction: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to add a Delete action to row actions */\r\n\t\tshowDeleteAction: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Field keys to exclude from the form dialog */\r\n\t\texcludeFields: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Field keys to include in the form dialog (whitelist mode) */\r\n\t\tincludeFields: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Per-field overrides passed to CnFormDialog */\r\n\t\tfieldOverrides: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Whether to show the Cards/Table view toggle in the actions bar */\r\n\t\tshowViewToggle: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tcurrentViewMode: this.viewMode,\r\n\t\t\tinternalSelectedIds: [...this.selectedIds],\r\n\t\t\t// Mass action dialogs\r\n\t\t\tshowMassDeleteDialog: false,\r\n\t\t\tshowMassCopyDialog: false,\r\n\t\t\tshowExportDialog: false,\r\n\t\t\tshowImportDialog: false,\r\n\t\t\t// Single-object dialogs\r\n\t\t\tshowSingleDeleteDialog: false,\r\n\t\t\tshowSingleCopyDialog: false,\r\n\t\t\tshowFormDialogVisible: false,\r\n\t\t\t// Dialog targets\r\n\t\t\tactionTargetItem: null,\r\n\t\t\teditItem: null,\r\n\t\t}\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\t/** Resolved icon — explicit prop overrides schema.icon */\r\n\t\tresolvedIcon() {\r\n\t\t\tif (this.icon) return this.icon\r\n\t\t\treturn this.schema?.icon || ''\r\n\t\t},\r\n\r\n\t\t/** Resolved schema icon component for View action */\r\n\t\tschemaIconComponent() {\r\n\t\t\tif (this.resolvedIcon && ICON_MAP[this.resolvedIcon]) {\r\n\t\t\t\treturn ICON_MAP[this.resolvedIcon]\r\n\t\t\t}\r\n\t\t\treturn Eye\r\n\t\t},\r\n\r\n\t\t/** Built-in row actions based on show*Action props */\r\n\t\tdefaultActions() {\r\n\t\t\tconst builtIn = []\r\n\t\t\tif (this.$listeners && this.$listeners['row-click']) {\r\n\t\t\t\tbuiltIn.push({\r\n\t\t\t\t\tlabel: 'View',\r\n\t\t\t\t\ticon: this.schemaIconComponent,\r\n\t\t\t\t\thandler: (row) => {\r\n\t\t\t\t\t\tthis.$emit('row-click', row)\r\n\t\t\t\t\t},\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tif (this.showEditAction) {\r\n\t\t\t\tbuiltIn.push({\r\n\t\t\t\t\tlabel: 'Edit',\r\n\t\t\t\t\ticon: Pencil,\r\n\t\t\t\t\thandler: (row) => {\r\n\t\t\t\t\t\tthis.editItem = row\r\n\t\t\t\t\t\tthis.showFormDialogVisible = true\r\n\t\t\t\t\t},\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tif (this.showCopyAction) {\r\n\t\t\t\tbuiltIn.push({\r\n\t\t\t\t\tlabel: 'Copy',\r\n\t\t\t\t\ticon: ContentCopy,\r\n\t\t\t\t\thandler: (row) => {\r\n\t\t\t\t\t\tthis.actionTargetItem = row\r\n\t\t\t\t\t\tthis.showSingleCopyDialog = true\r\n\t\t\t\t\t},\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tif (this.showDeleteAction) {\r\n\t\t\t\tbuiltIn.push({\r\n\t\t\t\t\tlabel: 'Delete',\r\n\t\t\t\t\ticon: TrashCanOutline,\r\n\t\t\t\t\tdestructive: true,\r\n\t\t\t\t\thandler: (row) => {\r\n\t\t\t\t\t\tthis.actionTargetItem = row\r\n\t\t\t\t\t\tthis.showSingleDeleteDialog = true\r\n\t\t\t\t\t},\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\treturn builtIn\r\n\t\t},\r\n\r\n\t\t/** Merged actions: app-provided first, then built-in defaults */\r\n\t\tmergedActions() {\r\n\t\t\treturn [...this.actions, ...this.defaultActions]\r\n\t\t},\r\n\r\n\t\thasRowActions() {\r\n\t\t\treturn this.$scopedSlots['row-actions'] || this.mergedActions.length > 0\r\n\t\t},\r\n\r\n\t\t/** Whether all visible items are selected */\r\n\t\tallSelected() {\r\n\t\t\tif (this.objects.length === 0 || this.internalSelectedIds.length === 0) return false\r\n\t\t\treturn this.objects.every((o) => this.internalSelectedIds.includes(o[this.rowKey]))\r\n\t\t},\r\n\r\n\t\t/** Full objects for the selected IDs (used by mass action dialogs) */\r\n\t\tselectedObjects() {\r\n\t\t\treturn this.objects.filter((o) => this.internalSelectedIds.includes(o[this.rowKey]))\r\n\t\t},\r\n\r\n\t\t/** Column slot names that the parent has provided (for pass-through) */\r\n\t\tslotColumns() {\r\n\t\t\treturn Object.keys(this.$scopedSlots)\r\n\t\t\t\t.filter((name) => name.startsWith('column-'))\r\n\t\t\t\t.map((name) => name.replace('column-', ''))\r\n\t\t},\r\n\r\n\t\t/** Add button label — derived from schema.title if not explicitly set */\r\n\t\tresolvedAddLabel() {\r\n\t\t\tif (this.addLabel) return this.addLabel\r\n\t\t\treturn 'Add ' + (this.schema?.title || 'Item')\r\n\t\t},\r\n\t},\r\n\r\n\twatch: {\r\n\t\tviewMode(val) {\r\n\t\t\tthis.currentViewMode = val\r\n\t\t},\r\n\t\tselectedIds(val) {\r\n\t\t\tthis.internalSelectedIds = [...val]\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Handle the Add button click. If the consumer listens to @add,\r\n\t\t * emit the event (backward compatible). Otherwise open the form dialog.\r\n\t\t */\r\n\t\tonAddClick() {\r\n\t\t\tif (this.$listeners && this.$listeners.add) {\r\n\t\t\t\tthis.$emit('add')\r\n\t\t\t} else if (this.showFormDialog) {\r\n\t\t\t\tthis.editItem = null\r\n\t\t\t\tthis.showFormDialogVisible = true\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handle view mode toggle.\r\n\t\t * @param {string} mode 'table' or 'cards'\r\n\t\t */\r\n\t\tonViewModeChange(mode) {\r\n\t\t\tthis.currentViewMode = mode\r\n\t\t\tthis.$emit('view-mode-change', mode)\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handle selection changes from CnDataTable/CnCardGrid.\r\n\t\t * Updates internal state and re-emits for parent.\r\n\t\t * @param {Array} ids Array of selected row IDs\r\n\t\t */\r\n\t\tonSelect(ids) {\r\n\t\t\tthis.internalSelectedIds = ids\r\n\t\t\tthis.$emit('select', ids)\r\n\t\t},\r\n\r\n\t\t// --- Mass action handlers ---\r\n\r\n\t\tonMassDeleteConfirm(ids) {\r\n\t\t\tthis.$emit('mass-delete', ids)\r\n\t\t},\r\n\r\n\t\tonMassCopyConfirm(payload) {\r\n\t\t\tthis.$emit('mass-copy', payload)\r\n\t\t},\r\n\r\n\t\tonMassExportConfirm(payload) {\r\n\t\t\tthis.$emit('mass-export', payload)\r\n\t\t},\r\n\r\n\t\tonMassImportConfirm(payload) {\r\n\t\t\tthis.$emit('mass-import', payload)\r\n\t\t},\r\n\r\n\t\t/** @public Forward result to mass delete dialog */\r\n\t\tsetMassDeleteResult(resultData) {\r\n\t\t\tif (this.$refs.massDeleteDialog) {\r\n\t\t\t\tthis.$refs.massDeleteDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/** @public Forward result to mass copy dialog */\r\n\t\tsetMassCopyResult(resultData) {\r\n\t\t\tif (this.$refs.massCopyDialog) {\r\n\t\t\t\tthis.$refs.massCopyDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/** @public Forward result to export dialog */\r\n\t\tsetExportResult(resultData) {\r\n\t\t\tif (this.$refs.exportDialog) {\r\n\t\t\t\tthis.$refs.exportDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/** @public Forward result to import dialog */\r\n\t\tsetImportResult(resultData) {\r\n\t\t\tif (this.$refs.importDialog) {\r\n\t\t\t\tthis.$refs.importDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// --- Backward-compatible aliases ---\r\n\t\t/** @public @deprecated Use setMassDeleteResult instead */\r\n\t\tsetDeleteResult(resultData) {\r\n\t\t\tthis.setMassDeleteResult(resultData)\r\n\t\t},\r\n\t\t/** @public @deprecated Use setMassCopyResult instead */\r\n\t\tsetCopyResult(resultData) {\r\n\t\t\tthis.setMassCopyResult(resultData)\r\n\t\t},\r\n\r\n\t\t// --- Single-object dialog handlers ---\r\n\r\n\t\tonSingleDeleteConfirm(id) {\r\n\t\t\tthis.$emit('delete', id)\r\n\t\t},\r\n\r\n\t\tonSingleCopyConfirm(payload) {\r\n\t\t\tthis.$emit('copy', payload)\r\n\t\t},\r\n\r\n\t\tonFormConfirm(formData) {\r\n\t\t\tif (this.editItem) {\r\n\t\t\t\tthis.$emit('edit', formData)\r\n\t\t\t} else {\r\n\t\t\t\tthis.$emit('create', formData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tcloseSingleDelete() {\r\n\t\t\tthis.showSingleDeleteDialog = false\r\n\t\t\tthis.actionTargetItem = null\r\n\t\t},\r\n\r\n\t\tcloseSingleCopy() {\r\n\t\t\tthis.showSingleCopyDialog = false\r\n\t\t\tthis.actionTargetItem = null\r\n\t\t},\r\n\r\n\t\tcloseFormDialog() {\r\n\t\t\tthis.showFormDialogVisible = false\r\n\t\t\tthis.editItem = null\r\n\t\t},\r\n\r\n\t\t/** @public Forward result to single delete dialog */\r\n\t\tsetSingleDeleteResult(resultData) {\r\n\t\t\tif (this.$refs.singleDeleteDialog) {\r\n\t\t\t\tthis.$refs.singleDeleteDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/** @public Forward result to single copy dialog */\r\n\t\tsetSingleCopyResult(resultData) {\r\n\t\t\tif (this.$refs.singleCopyDialog) {\r\n\t\t\t\tthis.$refs.singleCopyDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/** @public Forward result to form dialog */\r\n\t\tsetFormResult(resultData) {\r\n\t\t\tif (this.$refs.formDialog) {\r\n\t\t\t\tthis.$refs.formDialog.setResult(resultData)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Programmatically open the form dialog.\r\n\t\t * @param {object|null} item Pass null for create mode, or an object for edit mode\r\n\t\t * @public\r\n\t\t */\r\n\t\topenFormDialog(item = null) {\r\n\t\t\tthis.editItem = item\r\n\t\t\tthis.showFormDialogVisible = true\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<!-- Styles in css/index-page.css -->\r\n","<template>\r\n\t<NcActions\r\n\t\tv-if=\"count > 0\"\r\n\t\t:menu-name=\"menuLabel\"\r\n\t\t:inline=\"0\">\r\n\t\t<template #icon>\r\n\t\t\t<TuneVariant :size=\"20\" />\r\n\t\t</template>\r\n\r\n\t\t<!-- Built-in: Import -->\r\n\t\t<NcActionButton\r\n\t\t\tv-if=\"showImport\"\r\n\t\t\t@click=\"$emit('mass-import')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<Import :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ importLabel }}\r\n\t\t</NcActionButton>\r\n\r\n\t\t<!-- Built-in: Export -->\r\n\t\t<NcActionButton\r\n\t\t\tv-if=\"showExport\"\r\n\t\t\t@click=\"$emit('mass-export')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<Export :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ exportLabel }}\r\n\t\t</NcActionButton>\r\n\r\n\t\t<!-- Built-in: Copy -->\r\n\t\t<NcActionButton\r\n\t\t\tv-if=\"showCopy\"\r\n\t\t\t@click=\"$emit('mass-copy')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<ContentCopy :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ copyLabel }}\r\n\t\t</NcActionButton>\r\n\r\n\t\t<!-- Built-in: Delete -->\r\n\t\t<NcActionButton\r\n\t\t\tv-if=\"showDelete\"\r\n\t\t\t@click=\"$emit('mass-delete')\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<TrashCanOutline :size=\"20\" />\r\n\t\t\t</template>\r\n\t\t\t{{ deleteLabel }}\r\n\t\t</NcActionButton>\r\n\r\n\t\t<!-- Custom actions slot -->\r\n\t\t<slot name=\"actions\" :count=\"count\" :selected-ids=\"selectedIds\" />\r\n\t</NcActions>\r\n</template>\r\n\r\n<script>\r\nimport { NcActions, NcActionButton } from '@nextcloud/vue'\r\nimport TuneVariant from 'vue-material-design-icons/TuneVariant.vue'\r\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\r\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\r\nimport Import from 'vue-material-design-icons/Import.vue'\r\nimport Export from 'vue-material-design-icons/Export.vue'\r\n\r\n/**\r\n * CnMassActionBar — Mass action dropdown button for selected items.\r\n *\r\n * Renders as a single \"Mass Actions (N)\" dropdown button with built-in\r\n * Import, Export, Copy, and Delete actions plus a slot for custom actions.\r\n * Place this in the header/action bar of your index page.\r\n *\r\n * ## Adding Custom Mass Actions\r\n *\r\n * Use the `#actions` scoped slot to add app-specific mass actions.\r\n * Slot content should use `NcActionButton` components:\r\n *\r\n * ```vue\r\n * <CnMassActionBar :selected-ids=\"selectedIds\" :count=\"selectedIds.length\">\r\n * <template #actions=\"{ count, selectedIds }\">\r\n * <NcActionButton @click=\"migrateSelected(selectedIds)\">\r\n * <template #icon><SwapHorizontal :size=\"20\" /></template>\r\n * Migrate\r\n * </NcActionButton>\r\n * <NcActionButton @click=\"publishSelected(selectedIds)\">\r\n * <template #icon><Publish :size=\"20\" /></template>\r\n * Publish\r\n * </NcActionButton>\r\n * </template>\r\n * </CnMassActionBar>\r\n * ```\r\n *\r\n * @example Basic usage\r\n * <CnMassActionBar\r\n * :selected-ids=\"selectedIds\"\r\n * :count=\"selectedIds.length\"\r\n * @mass-copy=\"openCopyDialog\"\r\n * @mass-delete=\"openDeleteDialog\"\r\n * @mass-import=\"openImportDialog\"\r\n * @mass-export=\"openExportDialog\" />\r\n */\r\nexport default {\r\n\tname: 'CnMassActionBar',\r\n\r\n\tcomponents: {\r\n\t\tNcActions,\r\n\t\tNcActionButton,\r\n\t\tTuneVariant,\r\n\t\tContentCopy,\r\n\t\tTrashCanOutline,\r\n\t\tImport,\r\n\t\tExport,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Array of selected item IDs */\r\n\t\tselectedIds: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Number of selected items */\r\n\t\tcount: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t},\r\n\t\t/** Whether to show the built-in Import action */\r\n\t\tshowImport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in Export action */\r\n\t\tshowExport: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in Copy action */\r\n\t\tshowCopy: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Whether to show the built-in Delete action */\r\n\t\tshowDelete: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Label template for the menu button. Use {count} for the count. */\r\n\t\tmenuLabelTemplate: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Mass Actions ({count})',\r\n\t\t},\r\n\t\timportLabel: { type: String, default: 'Import' },\r\n\t\texportLabel: { type: String, default: 'Export' },\r\n\t\tcopyLabel: { type: String, default: 'Copy' },\r\n\t\tdeleteLabel: { type: String, default: 'Delete' },\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tmenuLabel() {\r\n\t\t\treturn this.menuLabelTemplate.replace('{count}', String(this.count))\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n","<template>\r\n\t<div class=\"cn-kpi-grid\" :class=\"gridClasses\">\r\n\t\t<slot />\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * CnKpiGrid — Responsive grid layout for KPI/stats cards.\r\n *\r\n * Wraps CnStatsBlock components in a responsive CSS grid. Supports\r\n * 2, 3, or 4 column layouts that adapt to screen size.\r\n *\r\n * @example 4-column dashboard (default)\r\n * <CnKpiGrid>\r\n * <CnStatsBlock title=\"Cases\" :count=\"42\" :icon=\"BriefcaseOutline\" variant=\"primary\" />\r\n * <CnStatsBlock title=\"Contacts\" :count=\"128\" :icon=\"AccountGroup\" variant=\"success\" />\r\n * <CnStatsBlock title=\"Tasks\" :count=\"7\" :icon=\"ClipboardCheck\" variant=\"warning\" />\r\n * <CnStatsBlock title=\"Overdue\" :count=\"3\" :icon=\"AlertCircle\" variant=\"error\" />\r\n * </CnKpiGrid>\r\n *\r\n * @example 2-column layout\r\n * <CnKpiGrid :columns=\"2\">\r\n * <CnStatsBlock title=\"Open\" :count=\"15\" />\r\n * <CnStatsBlock title=\"Closed\" :count=\"42\" />\r\n * </CnKpiGrid>\r\n */\r\nexport default {\r\n\tname: 'CnKpiGrid',\r\n\r\n\tprops: {\r\n\t\t/** Number of columns at max width: 2, 3, or 4 */\r\n\t\tcolumns: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 4,\r\n\t\t\tvalidator: (v) => [2, 3, 4].includes(v),\r\n\t\t},\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\tgridClasses() {\r\n\t\t\treturn {\r\n\t\t\t\t[`cn-kpi-grid--cols-${this.columns}`]: true,\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.cn-kpi-grid {\r\n\tdisplay: grid;\r\n\tgap: 16px;\r\n\tmargin-bottom: 24px;\r\n}\r\n\r\n.cn-kpi-grid--cols-2 {\r\n\tgrid-template-columns: repeat(2, 1fr);\r\n}\r\n\r\n.cn-kpi-grid--cols-3 {\r\n\tgrid-template-columns: repeat(3, 1fr);\r\n}\r\n\r\n.cn-kpi-grid--cols-4 {\r\n\tgrid-template-columns: repeat(4, 1fr);\r\n}\r\n\r\n/* Responsive breakpoints */\r\n@media (max-width: 1200px) {\r\n\t.cn-kpi-grid--cols-4 {\r\n\t\tgrid-template-columns: repeat(2, 1fr);\r\n\t}\r\n}\r\n\r\n@media (max-width: 900px) {\r\n\t.cn-kpi-grid--cols-3 {\r\n\t\tgrid-template-columns: repeat(2, 1fr);\r\n\t}\r\n}\r\n\r\n@media (max-width: 600px) {\r\n\t.cn-kpi-grid--cols-2,\r\n\t.cn-kpi-grid--cols-3,\r\n\t.cn-kpi-grid--cols-4 {\r\n\t\tgrid-template-columns: 1fr;\r\n\t}\r\n}\r\n</style>\r\n","/**\r\n * Standard OpenRegister metadata columns.\r\n *\r\n * These system fields exist on every OpenRegister object. Used by\r\n * CnIndexSidebar to auto-generate the \"Metadata\" column group.\r\n */\r\nexport const METADATA_COLUMNS = [\r\n\t{ key: 'name', label: 'Name' },\r\n\t{ key: 'description', label: 'Description' },\r\n\t{ key: 'id', label: 'ID' },\r\n\t{ key: 'uri', label: 'URI' },\r\n\t{ key: 'version', label: 'Version' },\r\n\t{ key: 'register', label: 'Register' },\r\n\t{ key: 'schema', label: 'Schema' },\r\n\t{ key: 'files', label: 'Files' },\r\n\t{ key: 'locked', label: 'Locked' },\r\n\t{ key: 'organization', label: 'Organization' },\r\n\t{ key: 'validation', label: 'Validation' },\r\n\t{ key: 'owner', label: 'Owner' },\r\n\t{ key: 'application', label: 'Application' },\r\n\t{ key: 'folder', label: 'Folder' },\r\n\t{ key: 'geo', label: 'Geo' },\r\n\t{ key: 'retention', label: 'Retention' },\r\n\t{ key: 'size', label: 'Size' },\r\n\t{ key: 'published', label: 'Published' },\r\n\t{ key: 'depublished', label: 'Depublished' },\r\n\t{ key: 'deleted', label: 'Deleted' },\r\n\t{ key: 'created', label: 'Created' },\r\n\t{ key: 'updated', label: 'Updated' },\r\n]\r\n","<template>\r\n\t<NcAppSidebar\r\n\t\t:name=\"resolvedName\"\r\n\t\t:title=\"resolvedName\"\r\n\t\t:subname=\"resolvedSubname\"\r\n\t\t:open.sync=\"internalOpen\"\r\n\t\t:active=\"internalActiveTab\"\r\n\t\t:compact=\"!!resolvedIcon\"\r\n\t\t@close=\"$emit('update:open', false)\"\r\n\t\t@update:active=\"onTabChange\">\r\n\t\t<!-- Schema icon in sidebar header -->\r\n\t\t<template v-if=\"resolvedIcon\" #header>\r\n\t\t\t<div class=\"cn-index-sidebar__header-icon\">\r\n\t\t\t\t<CnIcon :name=\"resolvedIcon\" :size=\"32\" />\r\n\t\t\t</div>\r\n\t\t</template>\r\n\r\n\t\t<!-- Search Tab -->\r\n\t\t<NcAppSidebarTab\r\n\t\t\tid=\"search-tab\"\r\n\t\t\t:name=\"searchTabLabel\"\r\n\t\t\t:order=\"1\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<Magnify :size=\"20\" />\r\n\t\t\t</template>\r\n\r\n\t\t\t<div class=\"cn-index-sidebar__section\">\r\n\t\t\t\t<h3>{{ searchLabel }}</h3>\r\n\t\t\t\t<NcTextField\r\n\t\t\t\t\t:value=\"searchValue\"\r\n\t\t\t\t\t:placeholder=\"searchPlaceholder\"\r\n\t\t\t\t\t:label=\"searchLabel\"\r\n\t\t\t\t\t@update:value=\"$emit('search', $event)\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<div v-if=\"schemaFilters.length > 0\" class=\"cn-index-sidebar__section\">\r\n\t\t\t\t<h3>{{ filtersLabel }}</h3>\r\n\t\t\t\t<div\r\n\t\t\t\t\tv-for=\"filter in schemaFilters\"\r\n\t\t\t\t\t:key=\"filter.key\"\r\n\t\t\t\t\tclass=\"cn-index-sidebar__filter-group\">\r\n\t\t\t\t\t<div class=\"cn-index-sidebar__filter-header\">\r\n\t\t\t\t\t\t<span class=\"cn-index-sidebar__filter-label\">{{ filter.label }}</span>\r\n\t\t\t\t\t\t<NcPopover v-if=\"filter.description\" popup-role=\"dialog\">\r\n\t\t\t\t\t\t\t<template #trigger>\r\n\t\t\t\t\t\t\t\t<NcButton\r\n\t\t\t\t\t\t\t\t\ttype=\"tertiary-no-background\"\r\n\t\t\t\t\t\t\t\t\t:aria-label=\"filter.label + ' info'\"\r\n\t\t\t\t\t\t\t\t\tclass=\"cn-index-sidebar__info-btn\">\r\n\t\t\t\t\t\t\t\t\t<template #icon>\r\n\t\t\t\t\t\t\t\t\t\t<InformationOutline :size=\"16\" />\r\n\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t</NcButton>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<p class=\"cn-index-sidebar__filter-description\">{{ filter.description }}</p>\r\n\t\t\t\t\t\t</NcPopover>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<NcSelect\r\n\t\t\t\t\t\tclass=\"cn-index-sidebar__select\"\r\n\t\t\t\t\t\t:value=\"getSelectedFilterOptions(filter)\"\r\n\t\t\t\t\t\t:options=\"getFilterOptions(filter)\"\r\n\t\t\t\t\t\tplaceholder=\"Select...\"\r\n\t\t\t\t\t\t:input-label=\"filter.label\"\r\n\t\t\t\t\t\t:multiple=\"true\"\r\n\t\t\t\t\t\t:clearable=\"true\"\r\n\t\t\t\t\t\t@input=\"onFilterChange(filter.key, $event)\" />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<slot name=\"search-extra\" />\r\n\t\t</NcAppSidebarTab>\r\n\r\n\t\t<!-- Columns Tab -->\r\n\t\t<NcAppSidebarTab\r\n\t\t\tid=\"columns-tab\"\r\n\t\t\t:name=\"columnsTabLabel\"\r\n\t\t\t:order=\"2\">\r\n\t\t\t<template #icon>\r\n\t\t\t\t<FormatColumns :size=\"20\" />\r\n\t\t\t</template>\r\n\r\n\t\t\t<div class=\"cn-sidebar-columns\">\r\n\t\t\t\t<h3>{{ columnsHeading }}</h3>\r\n\t\t\t\t<p class=\"cn-sidebar-columns__description\">{{ columnsDescription }}</p>\r\n\r\n\t\t\t\t<template v-if=\"allColumns.length > 0 || allGroups.length > 0\">\r\n\t\t\t\t\t<!-- Schema properties group (collapsible) -->\r\n\t\t\t\t\t<div v-if=\"allColumns.length > 0\" class=\"cn-sidebar-columns__group cn-sidebar-columns__group--collapsible\">\r\n\t\t\t\t\t\t<div class=\"cn-sidebar-columns__group-header\" @click=\"propertiesExpanded = !propertiesExpanded\">\r\n\t\t\t\t\t\t\t<ChevronDown v-if=\"propertiesExpanded\" :size=\"20\" />\r\n\t\t\t\t\t\t\t<ChevronRight v-else :size=\"20\" />\r\n\t\t\t\t\t\t\t<h4>{{ resolvedPropertiesLabel }}</h4>\r\n\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t\t\t\t:checked=\"isGroupAllVisible(allColumns)\"\r\n\t\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__select-all\"\r\n\t\t\t\t\t\t\t\t@click.native.stop\r\n\t\t\t\t\t\t\t\t@update:checked=\"toggleGroupAll(allColumns)\">\r\n\t\t\t\t\t\t\t\tAll\r\n\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div v-if=\"propertiesExpanded\" class=\"cn-sidebar-columns__group-content\">\r\n\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t\t\t\tv-for=\"col in allColumns\"\r\n\t\t\t\t\t\t\t\t:key=\"col.key\"\r\n\t\t\t\t\t\t\t\t:checked=\"isColumnVisible(col.key)\"\r\n\t\t\t\t\t\t\t\t@update:checked=\"toggleColumn(col.key)\">\r\n\t\t\t\t\t\t\t\t{{ col.label }}\r\n\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- Extra column groups (built-in Metadata + external) -->\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tv-for=\"group in allGroups\"\r\n\t\t\t\t\t\t:key=\"group.id\"\r\n\t\t\t\t\t\tclass=\"cn-sidebar-columns__group cn-sidebar-columns__group--collapsible\">\r\n\t\t\t\t\t\t<div class=\"cn-sidebar-columns__group-header\" @click=\"toggleGroup(group.id)\">\r\n\t\t\t\t\t\t\t<ChevronDown v-if=\"expandedGroups[group.id]\" :size=\"20\" />\r\n\t\t\t\t\t\t\t<ChevronRight v-else :size=\"20\" />\r\n\t\t\t\t\t\t\t<h4>{{ group.label }}</h4>\r\n\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t\t\t\t:checked=\"isGroupAllVisible(group.columns)\"\r\n\t\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__select-all\"\r\n\t\t\t\t\t\t\t\t@click.native.stop\r\n\t\t\t\t\t\t\t\t@update:checked=\"toggleGroupAll(group.columns)\">\r\n\t\t\t\t\t\t\t\tAll\r\n\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div v-if=\"expandedGroups[group.id]\" class=\"cn-sidebar-columns__group-content\">\r\n\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\r\n\t\t\t\t\t\t\t\tv-for=\"col in group.columns\"\r\n\t\t\t\t\t\t\t\t:key=\"col.key\"\r\n\t\t\t\t\t\t\t\t:checked=\"isColumnVisible(col.key)\"\r\n\t\t\t\t\t\t\t\t@update:checked=\"toggleColumn(col.key)\">\r\n\t\t\t\t\t\t\t\t{{ col.label }}\r\n\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</template>\r\n\r\n\t\t\t\t<p v-else class=\"cn-sidebar-columns__empty\">\r\n\t\t\t\t\tNo columns available. Provide a schema to auto-generate columns.\r\n\t\t\t\t</p>\r\n\t\t\t</div>\r\n\r\n\t\t\t<slot name=\"columns-extra\" />\r\n\t\t</NcAppSidebarTab>\r\n\r\n\t\t<!-- Extra tabs injected by the consumer -->\r\n\t\t<slot name=\"tabs\" />\r\n\t</NcAppSidebar>\r\n</template>\r\n\r\n<script>\r\nimport { NcAppSidebar, NcAppSidebarTab, NcTextField, NcSelect, NcCheckboxRadioSwitch, NcPopover, NcButton } from '@nextcloud/vue'\r\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\r\nimport FormatColumns from 'vue-material-design-icons/FormatColumns.vue'\r\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\r\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\r\nimport InformationOutline from 'vue-material-design-icons/InformationOutline.vue'\r\nimport { CnIcon } from '../CnIcon/index.js'\r\nimport { columnsFromSchema, filtersFromSchema } from '../../utils/schema.js'\r\nimport { METADATA_COLUMNS } from '../../constants/metadata.js'\r\n\r\n/**\r\n * CnIndexSidebar — Reusable NcAppSidebar wrapper with Search + Columns tabs.\r\n *\r\n * Designed to be schema-driven: pass a schema and the sidebar auto-generates\r\n * search filters, column visibility controls, and the standard Metadata group.\r\n * Title and properties group label are derived from schema.title by default.\r\n *\r\n * Must be rendered at the App.vue level as a sibling of NcAppContent.\r\n * Use provide/inject to connect it to page components.\r\n *\r\n * @example\r\n * <!-- Minimal usage — schema drives everything -->\r\n * <CnIndexSidebar\r\n * :schema=\"schema\"\r\n * :visible-columns=\"visibleCols\"\r\n * :search-value=\"search\"\r\n * @search=\"onSearch\"\r\n * @columns-change=\"onColumnsChange\" />\r\n */\r\nexport default {\r\n\tname: 'CnIndexSidebar',\r\n\r\n\tcomponents: {\r\n\t\tNcAppSidebar,\r\n\t\tNcAppSidebarTab,\r\n\t\tNcTextField,\r\n\t\tNcSelect,\r\n\t\tNcCheckboxRadioSwitch,\r\n\t\tNcPopover,\r\n\t\tNcButton,\r\n\t\tCnIcon,\r\n\t\tMagnify,\r\n\t\tFormatColumns,\r\n\t\tChevronDown,\r\n\t\tChevronRight,\r\n\t\tInformationOutline,\r\n\t},\r\n\r\n\tprops: {\r\n\t\t/** Sidebar title. Defaults to schema.title when not set. */\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** MDI icon name or emoji. Defaults to schema.icon when not set. */\r\n\t\ticon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Schema object for auto-generating filters, columns, and labels */\r\n\t\tschema: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Array of currently visible column keys */\r\n\t\tvisibleColumns: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: null,\r\n\t\t},\r\n\t\t/** Current search term */\r\n\t\tsearchValue: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/** Whether sidebar is open */\r\n\t\topen: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Current active facet filters: { fieldName: [values] } */\r\n\t\tactiveFilters: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/** Live facet data from API: { fieldName: { values: [{value, count}] } } */\r\n\t\tfacetData: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault: () => ({}),\r\n\t\t},\r\n\t\t/**\r\n\t\t * Additional column groups beyond schema properties and the built-in Metadata.\r\n\t\t * Each group: { id: string, label: string, columns: Array<{key, label}>, expanded?: boolean }\r\n\t\t */\r\n\t\tcolumnGroups: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault: () => [],\r\n\t\t},\r\n\t\t/** Whether to include the built-in Metadata column group */\r\n\t\tshowMetadata: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true,\r\n\t\t},\r\n\t\t/** Search input placeholder */\r\n\t\tsearchPlaceholder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Type to search...',\r\n\t\t},\r\n\t\t/** Search tab label */\r\n\t\tsearchTabLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Search',\r\n\t\t},\r\n\t\t/** Columns tab label */\r\n\t\tcolumnsTabLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Columns',\r\n\t\t},\r\n\t\t/** Search section heading */\r\n\t\tsearchLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Search',\r\n\t\t},\r\n\t\t/** Filters section heading */\r\n\t\tfiltersLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Filters',\r\n\t\t},\r\n\t\t/** Columns section heading */\r\n\t\tcolumnsHeading: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Column Visibility',\r\n\t\t},\r\n\t\t/** Columns section description */\r\n\t\tcolumnsDescription: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'Select which columns to display in the table',\r\n\t\t},\r\n\t\t/** Override label for the schema properties group. Defaults to schema.title. */\r\n\t\tpropertiesGroupLabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '',\r\n\t\t},\r\n\t\t/**\r\n\t\t * ID of the tab that should be active when the sidebar opens.\r\n\t\t * Built-in IDs are 'search-tab' and 'columns-tab'.\r\n\t\t * Use the id you set on your custom NcAppSidebarTab for custom tabs.\r\n\t\t */\r\n\t\tdefaultTab: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'search-tab',\r\n\t\t},\r\n\t},\r\n\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tinternalOpen: this.open,\r\n\t\t\tinternalActiveTab: this.defaultTab,\r\n\t\t\tpropertiesExpanded: true,\r\n\t\t\texpandedGroups: {},\r\n\t\t}\r\n\t},\r\n\r\n\tcomputed: {\r\n\t\t/** Resolved icon — explicit prop overrides schema.icon */\r\n\t\tresolvedIcon() {\r\n\t\t\treturn this.icon || this.schema?.icon || ''\r\n\t\t},\r\n\r\n\t\t/** Sidebar name — schema title, shown as the h2 header */\r\n\t\tresolvedName() {\r\n\t\t\tif (this.title) return this.title\r\n\t\t\treturn this.schema?.title || 'Search'\r\n\t\t},\r\n\r\n\t\t/** Sidebar subname — schema description, shown below the name */\r\n\t\tresolvedSubname() {\r\n\t\t\treturn this.schema?.description || ''\r\n\t\t},\r\n\r\n\t\t/** Properties group label — derived from schema.title if not explicitly set */\r\n\t\tresolvedPropertiesLabel() {\r\n\t\t\tif (this.propertiesGroupLabel) return this.propertiesGroupLabel\r\n\t\t\treturn this.schema?.title || 'Properties'\r\n\t\t},\r\n\r\n\t\t/** All available columns from schema */\r\n\t\tallColumns() {\r\n\t\t\tif (!this.schema) return []\r\n\t\t\treturn columnsFromSchema(this.schema, {})\r\n\t\t},\r\n\r\n\t\t/** Filter definitions from schema (facetable properties) */\r\n\t\tschemaFilters() {\r\n\t\t\tif (!this.schema) return []\r\n\t\t\treturn filtersFromSchema(this.schema)\r\n\t\t},\r\n\r\n\t\t/** Combined column groups: built-in Metadata + external groups */\r\n\t\tallGroups() {\r\n\t\t\tconst groups = []\r\n\t\t\tif (this.showMetadata && this.schema) {\r\n\t\t\t\tgroups.push({\r\n\t\t\t\t\tid: 'metadata',\r\n\t\t\t\t\tlabel: 'Metadata',\r\n\t\t\t\t\tcolumns: METADATA_COLUMNS,\r\n\t\t\t\t\texpanded: true,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\treturn [...groups, ...this.columnGroups]\r\n\t\t},\r\n\r\n\t\t/** All column keys across schema properties and all groups */\r\n\t\tallColumnKeys() {\r\n\t\t\treturn [\r\n\t\t\t\t...this.allColumns.map((c) => c.key),\r\n\t\t\t\t...this.allGroups.flatMap((g) => g.columns.map((c) => c.key)),\r\n\t\t\t]\r\n\t\t},\r\n\t},\r\n\r\n\twatch: {\r\n\t\topen(val) {\r\n\t\t\tthis.internalOpen = val\r\n\t\t},\r\n\t\tinternalOpen(val) {\r\n\t\t\tthis.$emit('update:open', val)\r\n\t\t},\r\n\t\tdefaultTab(val) {\r\n\t\t\tthis.internalActiveTab = val\r\n\t\t},\r\n\t\tallGroups: {\r\n\t\t\timmediate: true,\r\n\t\t\thandler(groups) {\r\n\t\t\t\tfor (const group of groups) {\r\n\t\t\t\t\tif (!(group.id in this.expandedGroups)) {\r\n\t\t\t\t\t\tthis.$set(this.expandedGroups, group.id, group.expanded !== false)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\r\n\tmethods: {\r\n\t\t/** Handle tab change from NcAppSidebar */\r\n\t\tonTabChange(tabId) {\r\n\t\t\tthis.internalActiveTab = tabId\r\n\t\t\tthis.$emit('tab-change', tabId)\r\n\t\t},\r\n\r\n\t\t/** Check if a column is currently visible */\r\n\t\tisColumnVisible(key) {\r\n\t\t\tif (this.visibleColumns === null) return true\r\n\t\t\treturn this.visibleColumns.includes(key)\r\n\t\t},\r\n\r\n\t\t/** Check if all columns in a group are visible */\r\n\t\tisGroupAllVisible(columns) {\r\n\t\t\treturn columns.every((col) => this.isColumnVisible(col.key))\r\n\t\t},\r\n\r\n\t\t/** Toggle a single column's visibility */\r\n\t\ttoggleColumn(key) {\r\n\t\t\tlet newVisible\r\n\t\t\tif (this.visibleColumns === null) {\r\n\t\t\t\tnewVisible = this.allColumnKeys.filter((k) => k !== key)\r\n\t\t\t} else if (this.isColumnVisible(key)) {\r\n\t\t\t\tnewVisible = this.visibleColumns.filter((k) => k !== key)\r\n\t\t\t} else {\r\n\t\t\t\tnewVisible = [...this.visibleColumns, key]\r\n\t\t\t}\r\n\t\t\tthis.$emit('columns-change', newVisible)\r\n\t\t},\r\n\r\n\t\t/** Select or deselect all columns in a group */\r\n\t\ttoggleGroupAll(columns) {\r\n\t\t\tconst groupKeys = columns.map((c) => c.key)\r\n\t\t\tconst allVisible = this.isGroupAllVisible(columns)\r\n\r\n\t\t\tlet newVisible\r\n\t\t\tif (this.visibleColumns === null) {\r\n\t\t\t\t// Currently all visible — deselect this group\r\n\t\t\t\tnewVisible = this.allColumnKeys.filter((k) => !groupKeys.includes(k))\r\n\t\t\t} else if (allVisible) {\r\n\t\t\t\t// All in group visible — deselect them\r\n\t\t\t\tnewVisible = this.visibleColumns.filter((k) => !groupKeys.includes(k))\r\n\t\t\t} else {\r\n\t\t\t\t// Not all visible — select them all\r\n\t\t\t\tconst current = new Set(this.visibleColumns)\r\n\t\t\t\tgroupKeys.forEach((k) => current.add(k))\r\n\t\t\t\tnewVisible = [...current]\r\n\t\t\t}\r\n\t\t\tthis.$emit('columns-change', newVisible)\r\n\t\t},\r\n\r\n\t\t/** Toggle a group's expanded state */\r\n\t\ttoggleGroup(groupId) {\r\n\t\t\tthis.$set(this.expandedGroups, groupId, !this.expandedGroups[groupId])\r\n\t\t},\r\n\r\n\t\t/** Get filter options for a filter definition */\r\n\t\tgetFilterOptions(filter) {\r\n\t\t\tconst facet = this.facetData[filter.key]\r\n\t\t\tif (facet?.values?.length > 0) {\r\n\t\t\t\treturn facet.values.map((v) => ({\r\n\t\t\t\t\tid: v.value,\r\n\t\t\t\t\tlabel: v.count !== undefined ? `${v.value} (${v.count})` : String(v.value),\r\n\t\t\t\t}))\r\n\t\t\t}\r\n\t\t\treturn filter.options || []\r\n\t\t},\r\n\r\n\t\t/** Get currently selected options for a filter */\r\n\t\tgetSelectedFilterOptions(filter) {\r\n\t\t\tconst value = this.activeFilters[filter.key]\r\n\t\t\tif (!value) return []\r\n\t\t\tconst values = Array.isArray(value) ? value : [value]\r\n\t\t\tconst options = this.getFilterOptions(filter)\r\n\t\t\treturn values.map((v) => options.find((o) => o.id === v) || { id: v, label: String(v) })\r\n\t\t},\r\n\r\n\t\t/** Handle filter select change */\r\n\t\tonFilterChange(key, selected) {\r\n\t\t\tconst values = selected ? selected.map((o) => o.id) : []\r\n\t\t\tthis.$emit('filter-change', { key, values })\r\n\t\t},\r\n\t},\r\n}\r\n</script>\r\n\r\n<!-- Styles in css/index-sidebar.css -->\r\n","/**\r\n * Build standard Nextcloud request headers for API calls.\r\n *\r\n * Includes the CSRF request token and OCS API request header\r\n * required by Nextcloud's API layer.\r\n *\r\n * @param {string} [contentType='application/json'] Content-Type header value\r\n * @return {object} Headers object for use with fetch()\r\n */\r\nexport function buildHeaders(contentType = 'application/json') {\r\n\tconst headers = {\r\n\t\trequesttoken: OC.requestToken,\r\n\t\t'OCS-APIREQUEST': 'true',\r\n\t}\r\n\tif (contentType) {\r\n\t\theaders['Content-Type'] = contentType\r\n\t}\r\n\treturn headers\r\n}\r\n\r\n/**\r\n * Build a query string from a params object.\r\n *\r\n * Handles _order serialization (JSON.stringify for objects) and skips\r\n * null/undefined/empty values.\r\n *\r\n * @param {object} params Key-value pairs for query parameters\r\n * @return {string} Query string including leading '?' or empty string\r\n */\r\nexport function buildQueryString(params = {}) {\r\n\tconst queryParams = new URLSearchParams()\r\n\r\n\tfor (const [key, value] of Object.entries(params)) {\r\n\t\tif (value === undefined || value === null || value === '') continue\r\n\t\tif (Array.isArray(value)) {\r\n\t\t\tfor (const item of value) {\r\n\t\t\t\tif (item !== undefined && item !== null && item !== '') {\r\n\t\t\t\t\tqueryParams.append(key, String(item))\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (key === '_order' && typeof value === 'object') {\r\n\t\t\tqueryParams.set(key, JSON.stringify(value))\r\n\t\t} else {\r\n\t\t\tqueryParams.set(key, String(value))\r\n\t\t}\r\n\t}\r\n\r\n\tconst str = queryParams.toString()\r\n\treturn str ? '?' + str : ''\r\n}\r\n","<template>\n\t<CnSettingsSection\n\t\t:name=\"name\"\n\t\t:description=\"description\"\n\t\t:doc-url=\"docUrl\"\n\t\t:loading=\"registersLoading\"\n\t\tloading-message=\"Loading registers...\"\n\t\t:error=\"!!registersError\"\n\t\t:error-message=\"registersError || ''\"\n\t\t:on-retry=\"loadRegisters\">\n\t\t<!-- Action buttons -->\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showSaveButton\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t@click=\"handleSave\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"saving\" :size=\"20\" />\n\t\t\t\t\t<ContentSave v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ saving ? 'Saving...' : saveButtonText }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showReimportButton\"\n\t\t\t\ttype=\"secondary\"\n\t\t\t\t:disabled=\"reimporting\"\n\t\t\t\t@click=\"$emit('reimport')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"reimporting\" :size=\"20\" />\n\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ reimporting ? 'Importing...' : reimportButtonText }}\n\t\t\t</NcButton>\n\t\t\t<slot name=\"actions\" />\n\t\t</template>\n\n\t\t<!-- Group sections -->\n\t\t<div v-if=\"!registersLoading && !registersError\" class=\"cn-register-mapping\">\n\t\t\t<div\n\t\t\t\tv-for=\"(group, groupIdx) in groups\"\n\t\t\t\t:key=\"groupIdx\"\n\t\t\t\tclass=\"cn-register-mapping__group\">\n\t\t\t\t<!-- Group header -->\n\t\t\t\t<slot name=\"group-header\"\n\t\t\t\t\t:group=\"group\"\n\t\t\t\t\t:configured-count=\"configuredCount(groupIdx)\"\n\t\t\t\t\t:total-count=\"group.types.length\">\n\t\t\t\t\t<div class=\"cn-register-mapping__group-header\">\n\t\t\t\t\t\t<h4 class=\"cn-register-mapping__group-title\">\n\t\t\t\t\t\t\t{{ group.name }}\n\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t<span class=\"cn-register-mapping__group-status\">\n\t\t\t\t\t\t\t{{ configuredCount(groupIdx) }}/{{ group.types.length }} {{ labels.partiallyConfigured }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</slot>\n\n\t\t\t\t<!-- Group description -->\n\t\t\t\t<p v-if=\"group.description\" class=\"cn-register-mapping__group-description\">\n\t\t\t\t\t{{ group.description }}\n\t\t\t\t</p>\n\n\t\t\t\t<!-- Register selector -->\n\t\t\t\t<div class=\"cn-register-mapping__register-select\">\n\t\t\t\t\t<label class=\"cn-register-mapping__label\">{{ labels.register }}</label>\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t:value=\"selectedRegister(groupIdx)\"\n\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t:loading=\"registersLoading\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrack-by=\"value\"\n\t\t\t\t\t\t@input=\"handleRegisterChange(groupIdx, $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Type list -->\n\t\t\t\t<div v-if=\"selectedRegister(groupIdx)\" class=\"cn-register-mapping__type-list\">\n\t\t\t\t\t<!-- Header row -->\n\t\t\t\t\t<div class=\"cn-register-mapping__type-list-header\">\n\t\t\t\t\t\t<span>Name</span>\n\t\t\t\t\t\t<span>Schema</span>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Type rows -->\n\t\t\t\t\t<template v-for=\"type in group.types\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t:key=\"type.slug + '-row'\"\n\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-row\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-register-mapping__type-row--expanded': isExpanded(groupIdx, type.slug) }\"\n\t\t\t\t\t\t\t@click=\"toggleExpand(groupIdx, type.slug)\">\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-name\">{{ type.label }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-schema\">\n\t\t\t\t\t\t\t\t{{ schemaLabel(groupIdx, type) || labels.notConfigured }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-status\">\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__status-dot\"\n\t\t\t\t\t\t\t\t\t:class=\"schemaValue(groupIdx, type)\n\t\t\t\t\t\t\t\t\t\t? 'cn-register-mapping__status-dot--configured'\n\t\t\t\t\t\t\t\t\t\t: 'cn-register-mapping__status-dot--unconfigured'\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-chevron\">\n\t\t\t\t\t\t\t\t<ChevronUp v-if=\"isExpanded(groupIdx, type.slug)\" :size=\"20\" />\n\t\t\t\t\t\t\t\t<ChevronDown v-else :size=\"20\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Expanded detail -->\n\t\t\t\t\t\t<transition :key=\"type.slug + '-detail'\" name=\"slide\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-if=\"isExpanded(groupIdx, type.slug)\"\n\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-detail\">\n\t\t\t\t\t\t\t\t<p v-if=\"type.description\" class=\"cn-register-mapping__type-description\">\n\t\t\t\t\t\t\t\t\t{{ type.description }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t\t:value=\"selectedSchema(groupIdx, type)\"\n\t\t\t\t\t\t\t\t\t:options=\"schemaSelectOptions(groupIdx)\"\n\t\t\t\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t\ttrack-by=\"value\"\n\t\t\t\t\t\t\t\t\t@input=\"handleSchemaChange(groupIdx, type, $event)\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</transition>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- No register selected -->\n\t\t\t\t<NcNoteCard v-else-if=\"!registersLoading\" type=\"info\">\n\t\t\t\t\t{{ labels.selectRegister }}\n\t\t\t\t</NcNoteCard>\n\n\t\t\t\t<!-- No schemas available -->\n\t\t\t\t<NcNoteCard\n\t\t\t\t\tv-if=\"selectedRegister(groupIdx) && schemaSelectOptions(groupIdx).length === 0 && !registersLoading\"\n\t\t\t\t\ttype=\"warning\">\n\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Footer -->\n\t\t<template v-if=\"$slots.footer\" #footer>\n\t\t\t<slot name=\"footer\" />\n\t\t</template>\n\t</CnSettingsSection>\n</template>\n\n<script>\nimport { CnSettingsSection } from '../CnSettingsSection/index.js'\nimport { NcButton, NcLoadingIcon, NcNoteCard, NcSelect } from '@nextcloud/vue'\nimport ContentSave from 'vue-material-design-icons/ContentSave.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport { buildHeaders } from '../../utils/headers.js'\n\n/**\n * CnRegisterMapping - OpenRegister register/schema configuration component.\n *\n * Displays and manages register-to-schema mappings for app object types.\n * Self-fetches available registers and schemas from the OpenRegister API.\n * Supports multiple register groups (stacked sections) with expandable\n * type rows for manual schema override.\n *\n * @example Single register (Pipelinq)\n * <CnRegisterMapping\n * name=\"Register Configuration\"\n * :groups=\"[{\n * name: 'Core Objects',\n * types: [\n * { slug: 'client', label: 'Client' },\n * { slug: 'contact', label: 'Contact' },\n * ],\n * }]\"\n * :configuration=\"config\"\n * :show-reimport-button=\"true\"\n * @save=\"saveConfig\"\n * @reimport=\"reimport\" />\n *\n * @example Multi-register (SoftwareCatalog)\n * <CnRegisterMapping\n * :groups=\"[\n * { name: 'Voorzieningen', registerConfigKey: 'voorzieningen_register', types: [...] },\n * { name: 'AMEF', registerConfigKey: 'amef_register', types: [...] },\n * ]\"\n * :configuration=\"config\"\n * @save=\"saveConfig\" />\n */\nexport default {\n\tname: 'CnRegisterMapping',\n\n\tcomponents: {\n\t\tCnSettingsSection,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcNoteCard,\n\t\tNcSelect,\n\t\tContentSave,\n\t\tRefresh,\n\t\tChevronDown,\n\t\tChevronUp,\n\t},\n\n\tprops: {\n\t\t/** Section title */\n\t\tname: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Register Configuration',\n\t\t},\n\t\t/** Section description */\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Configure OpenRegister schema mappings for your object types',\n\t\t},\n\t\t/** Documentation URL */\n\t\tdocUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\t/**\n\t\t * Groups of object types that share a register.\n\t\t * @type {Array<{ name: string, description?: string, registerConfigKey?: string, types: Array<{ slug: string, label: string, description?: string, configKey?: string }> }>}\n\t\t */\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator: (groups) => groups.length > 0\n\t\t\t\t&& groups.every((g) => g.name && Array.isArray(g.types) && g.types.length > 0),\n\t\t},\n\t\t/** Current configuration values: { register: '5', client_schema: '28', ... } */\n\t\tconfiguration: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t\t/** Show save button */\n\t\tshowSaveButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\t/** Whether save is in progress */\n\t\tsaving: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\t/** Show reimport button */\n\t\tshowReimportButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\t/** Whether reimport is in progress */\n\t\treimporting: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\t/** Save button text */\n\t\tsaveButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Save Configuration',\n\t\t},\n\t\t/** Reimport button text */\n\t\treimportButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Re-import configuration',\n\t\t},\n\t\t/** Auto-match schema titles to type slugs on register change */\n\t\tautoMatch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\t/** UI labels (i18n) */\n\t\tlabels: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({\n\t\t\t\tregister: 'Register',\n\t\t\t\tschema: 'Schema',\n\t\t\t\tconfigured: 'Configured',\n\t\t\t\tnotConfigured: 'Not configured',\n\t\t\t\tnoSchemas: 'No schemas available in this register',\n\t\t\t\tselectRegister: 'Select a register',\n\t\t\t\tselectSchema: 'Select a schema',\n\t\t\t\tallConfigured: 'All types configured',\n\t\t\t\tpartiallyConfigured: 'configured',\n\t\t\t}),\n\t\t},\n\t},\n\n\temits: ['update:configuration', 'save', 'reimport'],\n\n\tdata() {\n\t\treturn {\n\t\t\t// Fetched data\n\t\t\tregisters: [],\n\t\t\tschemasByRegister: {},\n\t\t\tregistersLoading: false,\n\t\t\tregistersError: null,\n\t\t\t// Local state\n\t\t\tlocalConfig: {},\n\t\t\texpandedRows: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Register options for NcSelect */\n\t\tregisterSelectOptions() {\n\t\t\treturn this.registers.map((r) => ({\n\t\t\t\tlabel: r.title || r.slug || `Register ${r.id}`,\n\t\t\t\tvalue: String(r.id),\n\t\t\t}))\n\t\t},\n\n\t\t/** Whether local config differs from prop */\n\t\thasChanges() {\n\t\t\treturn JSON.stringify(this.localConfig) !== JSON.stringify(this.configuration)\n\t\t},\n\t},\n\n\twatch: {\n\t\tconfiguration: {\n\t\t\thandler(newVal) {\n\t\t\t\tthis.localConfig = { ...newVal }\n\t\t\t},\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.loadRegisters()\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Get the config key for a group's register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {string} Config key\n\t\t */\n\t\tregisterConfigKey(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tif (group.registerConfigKey) return group.registerConfigKey\n\t\t\tif (this.groups.length === 1) return 'register'\n\t\t\treturn group.name.toLowerCase().replace(/[^a-z0-9]+/g, '_') + '_register'\n\t\t},\n\n\t\t/**\n\t\t * Get the config key for a type's schema.\n\t\t *\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Config key\n\t\t */\n\t\tschemaConfigKey(type) {\n\t\t\treturn type.configKey || type.slug + '_schema'\n\t\t},\n\n\t\t/**\n\t\t * Get the selected register option for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedRegister(groupIdx) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) return null\n\t\t\treturn this.registerSelectOptions.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the selected schema option for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedSchema(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) return null\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\t\t\treturn options.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the schema value (ID) for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema ID or empty string\n\t\t */\n\t\tschemaValue(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\treturn this.localConfig[key] || ''\n\t\t},\n\n\t\t/**\n\t\t * Get the display label for a type's current schema.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema label or empty string\n\t\t */\n\t\tschemaLabel(groupIdx, type) {\n\t\t\tconst selected = this.selectedSchema(groupIdx, type)\n\t\t\tif (selected) return selected.label\n\t\t\tconst value = this.schemaValue(groupIdx, type)\n\t\t\treturn value ? `Schema ${value}` : ''\n\t\t},\n\n\t\t/**\n\t\t * Get schema options for a group's selected register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {Array<{label: string, value: string}>} NcSelect options\n\t\t */\n\t\tschemaSelectOptions(groupIdx) {\n\t\t\tconst reg = this.selectedRegister(groupIdx)\n\t\t\tif (!reg) return []\n\t\t\tconst schemas = this.schemasByRegister[reg.value] || []\n\t\t\treturn schemas.map((s) => ({\n\t\t\t\tlabel: s.title || s.slug || `Schema ${s.id}`,\n\t\t\t\tvalue: String(s.id),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Count configured types in a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {number} Count\n\t\t */\n\t\tconfiguredCount(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\treturn group.types.filter((type) => !!this.schemaValue(groupIdx, type)).length\n\t\t},\n\n\t\t/**\n\t\t * Check if a type row is expanded.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t * @return {boolean}\n\t\t */\n\t\tisExpanded(groupIdx, slug) {\n\t\t\treturn !!this.expandedRows[groupIdx + '-' + slug]\n\t\t},\n\n\t\t/**\n\t\t * Toggle a type row expansion.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t */\n\t\ttoggleExpand(groupIdx, slug) {\n\t\t\tconst key = groupIdx + '-' + slug\n\t\t\tthis.expandedRows = {\n\t\t\t\t...this.expandedRows,\n\t\t\t\t[key]: !this.expandedRows[key],\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle register selection change for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\tasync handleRegisterChange(groupIdx, option) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\n\t\t\t// Clear schema selections for this group\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: '' }\n\t\t\t}\n\n\t\t\t// Fetch schemas for the new register\n\t\t\tif (value) {\n\t\t\t\tawait this.loadSchemasForRegister(value)\n\n\t\t\t\t// Auto-match schemas\n\t\t\t\tif (this.autoMatch) {\n\t\t\t\t\tthis.autoMatchSchemas(groupIdx)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Handle schema selection change for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\thandleSchemaChange(groupIdx, type, option) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Auto-match schema titles to type slugs/labels (case-insensitive).\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t */\n\t\tautoMatchSchemas(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\t// Skip if already has a value\n\t\t\t\tif (this.localConfig[schemaKey]) continue\n\n\t\t\t\tconst slug = type.slug.toLowerCase()\n\t\t\t\tconst label = type.label.toLowerCase()\n\n\t\t\t\tconst match = options.find((o) => {\n\t\t\t\t\tconst optLabel = o.label.toLowerCase()\n\t\t\t\t\treturn optLabel === slug || optLabel === label\n\t\t\t\t\t\t|| optLabel.includes(slug) || slug.includes(optLabel)\n\t\t\t\t})\n\n\t\t\t\tif (match) {\n\t\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: match.value }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** Emit save event with current config */\n\t\thandleSave() {\n\t\t\tthis.$emit('save', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Fetch all registers from OpenRegister API.\n\t\t */\n\t\tasync loadRegisters() {\n\t\t\tthis.registersLoading = true\n\t\t\tthis.registersError = null\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch('/apps/openregister/api/registers?_extend[]=schemas', {\n\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.registersError = `Failed to fetch registers: ${response.statusText}`\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst results = data.results || data\n\t\t\t\tthis.registers = Array.isArray(results) ? results : []\n\n\t\t\t\t// Cache expanded schemas\n\t\t\t\tfor (const reg of this.registers) {\n\t\t\t\t\tif (Array.isArray(reg.schemas) && reg.schemas.length > 0) {\n\t\t\t\t\t\tconst schemas = reg.schemas.filter((s) => s && typeof s === 'object' && s.id)\n\t\t\t\t\t\tif (schemas.length > 0) {\n\t\t\t\t\t\t\tthis.schemasByRegister = {\n\t\t\t\t\t\t\t\t...this.schemasByRegister,\n\t\t\t\t\t\t\t\t[String(reg.id)]: schemas,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.registersError = error.message || 'Network error fetching registers'\n\t\t\t} finally {\n\t\t\t\tthis.registersLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch schemas for a specific register.\n\t\t *\n\t\t * @param {string} registerId Register ID\n\t\t */\n\t\tasync loadSchemasForRegister(registerId) {\n\t\t\tconst id = String(registerId)\n\n\t\t\t// Return cached\n\t\t\tif (this.schemasByRegister[id]?.length > 0) return\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(\n\t\t\t\t\t`/apps/openregister/api/registers/${id}?_extend[]=schemas`,\n\t\t\t\t\t{ method: 'GET', headers: buildHeaders() },\n\t\t\t\t)\n\t\t\t\tif (!response.ok) return\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst schemas = (data.schemas || []).filter((s) => s && typeof s === 'object' && s.id)\n\t\t\t\tthis.schemasByRegister = { ...this.schemasByRegister, [id]: schemas }\n\t\t\t} catch {\n\t\t\t\t// Silently fail — register already selected, schemas just won't populate\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-register-mapping__group {\n\tmargin-bottom: 24px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tpadding: 20px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__group:last-child {\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: 12px;\n}\n\n.cn-register-mapping__group-title {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tmargin: 0;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__group-status {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__group-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 12px 0;\n}\n\n.cn-register-mapping__label {\n\tdisplay: block;\n\tfont-weight: 500;\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-bottom: 4px;\n}\n\n.cn-register-mapping__register-select {\n\tmargin-bottom: 16px;\n\tmax-width: 400px;\n}\n\n.cn-register-mapping__type-list {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\toverflow: hidden;\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-list-header {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 8px 16px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.5px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 10px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tcursor: pointer;\n\ttransition: background-color 0.15s ease;\n}\n\n.cn-register-mapping__type-row:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row--expanded {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-name {\n\tfont-weight: 500;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__type-schema {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-register-mapping__type-status {\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.cn-register-mapping__type-chevron {\n\tdisplay: flex;\n\tjustify-content: center;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__status-dot {\n\tdisplay: inline-block;\n\twidth: 10px;\n\theight: 10px;\n\tborder-radius: 50%;\n}\n\n.cn-register-mapping__status-dot--configured {\n\tbackground-color: var(--color-success);\n}\n\n.cn-register-mapping__status-dot--unconfigured {\n\tbackground-color: var(--color-warning);\n}\n\n.cn-register-mapping__type-detail {\n\tpadding: 12px 16px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 8px 0;\n}\n\n/* Slide transition */\n.slide-enter-active,\n.slide-leave-active {\n\ttransition: all 0.2s ease;\n\tmax-height: 200px;\n\toverflow: hidden;\n}\n\n.slide-enter,\n.slide-leave-to {\n\tmax-height: 0;\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\topacity: 0;\n}\n\n/* Last row in list should not have bottom border */\n.cn-register-mapping__type-list > :last-child {\n\tborder-bottom: none;\n}\n\n@media (max-width: 768px) {\n\t.cn-register-mapping__type-list-header {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__type-row {\n\t\tgrid-template-columns: 1fr auto 32px;\n\t}\n\n\t.cn-register-mapping__type-schema {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__register-select {\n\t\tmax-width: none;\n\t}\n}\n</style>\n","/**\r\n * Unified error shape returned by all store actions.\r\n *\r\n * @typedef {object} ApiError\r\n * @property {number} status HTTP status code (0 for network errors)\r\n * @property {string} message Human-readable error message\r\n * @property {object|null} details Validation errors or additional details\r\n * @property {boolean} isValidation Whether this is a validation error (400/422)\r\n * @property {object|null} fields Per-field validation errors\r\n */\r\n\r\n/**\r\n * Parse an HTTP error response into a unified ApiError shape.\r\n *\r\n * Merges the best of Pipelinq's _parseResponseError (field extraction)\r\n * and Procest's _parseError (status-specific messages, isValidation flag).\r\n *\r\n * @param {Response} response The fetch Response object\r\n * @param {string} type The object type slug (used in error messages)\r\n * @return {Promise<ApiError>} Parsed error object\r\n */\r\nexport async function parseResponseError(response, type) {\r\n\tconst status = response.status\r\n\tlet details = null\r\n\tlet fields = null\r\n\tlet message = ''\r\n\r\n\ttry {\r\n\t\tconst body = await response.json()\r\n\t\tdetails = body.errors || body.error || body.message || null\r\n\t\tfields = body.validationErrors || body.errors || null\r\n\t} catch {\r\n\t\t// Response body is not JSON\r\n\t}\r\n\r\n\tswitch (true) {\r\n\tcase status === 400 || status === 422:\r\n\t\tmessage = details && typeof details === 'string'\r\n\t\t\t? details\r\n\t\t\t: `Validation failed for ${type}`\r\n\t\treturn { status, message, details, isValidation: true, fields, toString() { return this.message } }\r\n\tcase status === 401:\r\n\t\tmessage = 'Session expired, please log in again'\r\n\t\tbreak\r\n\tcase status === 403:\r\n\t\tmessage = 'You do not have permission to perform this action'\r\n\t\tbreak\r\n\tcase status === 404:\r\n\t\tmessage = `The requested ${type} could not be found`\r\n\t\tbreak\r\n\tcase status === 409:\r\n\t\tmessage = `This ${type} was modified by another user. Please reload.`\r\n\t\tbreak\r\n\tcase status >= 500:\r\n\t\tmessage = 'An unexpected server error occurred. Please try again.'\r\n\t\tbreak\r\n\tdefault:\r\n\t\tmessage = response.statusText || 'An unexpected error occurred'\r\n\t}\r\n\r\n\treturn { status, message, details, isValidation: false, fields, toString() { return this.message } }\r\n}\r\n\r\n/**\r\n * Create a network error object for fetch failures (no response).\r\n *\r\n * @param {Error} error The caught error\r\n * @return {ApiError} Network error object\r\n */\r\nexport function networkError(error) {\r\n\treturn {\r\n\t\tstatus: 0,\r\n\t\tmessage: error.message || 'A network error occurred. Check your connection and try again.',\r\n\t\tdetails: null,\r\n\t\tisValidation: false,\r\n\t\tfields: null,\r\n\t\ttoString() { return this.message },\r\n\t}\r\n}\r\n\r\n/**\r\n * Create a generic error object from a caught exception.\r\n *\r\n * @param {Error} error The caught error\r\n * @return {ApiError} Generic error object\r\n */\r\nexport function genericError(error) {\r\n\treturn {\r\n\t\tstatus: null,\r\n\t\tmessage: error.message,\r\n\t\tdetails: null,\r\n\t\tisValidation: false,\r\n\t\tfields: null,\r\n\t\ttoString() { return this.message },\r\n\t}\r\n}\r\n","import { defineStore } from 'pinia'\r\nimport { buildHeaders, buildQueryString } from '../utils/headers.js'\r\nimport { parseResponseError, networkError, genericError } from '../utils/errors.js'\r\n\r\n/**\r\n * Generic Pinia store for OpenRegister object CRUD operations.\r\n *\r\n * Provides a unified interface for managing objects across registers and schemas.\r\n * Apps register their object types with schema/register IDs, then use type slugs\r\n * for all operations. Supports plugins for sub-resources (files, audit trails, etc.).\r\n *\r\n * @example\r\n * // Basic usage (CRUD only)\r\n * import { useObjectStore } from '@conduction/nextcloud-vue'\r\n * const store = useObjectStore()\r\n *\r\n * @example\r\n * // With plugins\r\n * import { createObjectStore, filesPlugin, auditTrailsPlugin } from '@conduction/nextcloud-vue'\r\n * const useMyStore = createObjectStore('object', {\r\n * plugins: [filesPlugin(), auditTrailsPlugin()],\r\n * })\r\n */\r\n\r\nconst DEFAULT_STORE_ID = 'conduction-objects'\r\nconst DEFAULT_BASE_URL = '/apps/openregister/api/objects'\r\n\r\n/**\r\n * Capitalize the first letter of a string.\r\n *\r\n * @param {string} str Input string\r\n * @return {string} Capitalized string\r\n */\r\nfunction capitalize(str) {\r\n\treturn str.charAt(0).toUpperCase() + str.slice(1)\r\n}\r\n\r\n/**\r\n * Merge plugin state factories into a single state object.\r\n *\r\n * @param {Array} plugins Array of plugin definitions\r\n * @return {object} Merged state object\r\n */\r\nfunction mergePluginState(plugins) {\r\n\tconst merged = {}\r\n\tfor (const plugin of plugins) {\r\n\t\tif (plugin.state) {\r\n\t\t\tObject.assign(merged, plugin.state())\r\n\t\t}\r\n\t}\r\n\treturn merged\r\n}\r\n\r\n/**\r\n * Merge plugin getters into a single getters object.\r\n *\r\n * @param {Array} plugins Array of plugin definitions\r\n * @return {object} Merged getters object\r\n */\r\nfunction mergePluginGetters(plugins) {\r\n\tconst merged = {}\r\n\tfor (const plugin of plugins) {\r\n\t\tif (plugin.getters) {\r\n\t\t\tObject.assign(merged, plugin.getters)\r\n\t\t}\r\n\t}\r\n\treturn merged\r\n}\r\n\r\n/**\r\n * Merge plugin actions into a single actions object.\r\n *\r\n * @param {Array} plugins Array of plugin definitions\r\n * @return {object} Merged actions object\r\n */\r\nfunction mergePluginActions(plugins) {\r\n\tconst merged = {}\r\n\tfor (const plugin of plugins) {\r\n\t\tif (plugin.actions) {\r\n\t\t\tObject.assign(merged, plugin.actions)\r\n\t\t}\r\n\t}\r\n\treturn merged\r\n}\r\n\r\n// ── Base state ──────────────────────────────────────────────────────────\r\n\r\nfunction baseState() {\r\n\treturn {\r\n\t\t/** @type {Object<string, {schema: string, register: string}>} */\r\n\t\tobjectTypeRegistry: {},\r\n\t\t/** @type {Object<string, Array>} */\r\n\t\tcollections: {},\r\n\t\t/** @type {Object<string, Object<string, object>>} */\r\n\t\tobjects: {},\r\n\t\t/** @type {Object<string, boolean>} */\r\n\t\tloading: {},\r\n\t\t/** @type {Object<string, import('../utils/errors.js').ApiError|null>} */\r\n\t\terrors: {},\r\n\t\t/** @type {Object<string, {total: number, page: number, pages: number, limit: number}>} */\r\n\t\tpagination: {},\r\n\t\t/** @type {Object<string, string>} */\r\n\t\tsearchTerms: {},\r\n\t\t/** @type {Object<string, object|null>} */\r\n\t\tschemas: {},\r\n\t\t/** @type {Object<string, object>} Facet data per type for CnIndexSidebar: { fieldName: { values: [{value, count}] } } */\r\n\t\tfacets: {},\r\n\t\t/** @type {{baseUrl: string}} */\r\n\t\t_options: {\r\n\t\t\tbaseUrl: DEFAULT_BASE_URL,\r\n\t\t},\r\n\t}\r\n}\r\n\r\n// ── Base getters ────────────────────────────────────────────────────────\r\n\r\nconst baseGetters = {\r\n\t/**\r\n\t * Get all registered object type slugs.\r\n\t * @return {string[]}\r\n\t */\r\n\tobjectTypes: (state) => Object.keys(state.objectTypeRegistry),\r\n\r\n\t/**\r\n\t * Get the collection array for a type.\r\n\t * @return {Function} (type: string) => Array\r\n\t */\r\n\tgetCollection: (state) => (type) => state.collections[type] || [],\r\n\r\n\t/**\r\n\t * Get a single cached object by type and ID.\r\n\t * @return {Function} (type: string, id: string) => object|null\r\n\t */\r\n\tgetObject: (state) => (type, id) => state.objects[type]?.[id] || null,\r\n\r\n\t/**\r\n\t * Alias for getObject — check cache without fetching.\r\n\t * @return {Function} (type: string, id: string) => object|null\r\n\t */\r\n\tgetCachedObject: (state) => (type, id) => state.objects[type]?.[id] || null,\r\n\r\n\t/**\r\n\t * Check if a type is currently loading.\r\n\t * @return {Function} (type: string) => boolean\r\n\t */\r\n\tisLoading: (state) => (type) => state.loading[type] || false,\r\n\r\n\t/**\r\n\t * Get the current error for a type.\r\n\t * @return {Function} (type: string) => ApiError|null\r\n\t */\r\n\tgetError: (state) => (type) => state.errors[type] || null,\r\n\r\n\t/**\r\n\t * Get pagination state for a type.\r\n\t * @return {Function} (type: string) => {total, page, pages, limit}\r\n\t */\r\n\tgetPagination: (state) => (type) =>\r\n\t\tstate.pagination[type] || { total: 0, page: 1, pages: 1, limit: 20 },\r\n\r\n\t/**\r\n\t * Get the current search term for a type.\r\n\t * @return {Function} (type: string) => string\r\n\t */\r\n\tgetSearchTerm: (state) => (type) => state.searchTerms[type] || '',\r\n\r\n\t/**\r\n\t * Get a cached schema for a type.\r\n\t * @return {Function} (type: string) => object|null\r\n\t */\r\n\tgetSchema: (state) => (type) => state.schemas[type] || null,\r\n\r\n\t/**\r\n\t * Get facet data for a type (CnIndexSidebar-compatible format).\r\n\t * @return {Function} (type: string) => object\r\n\t */\r\n\tgetFacets: (state) => (type) => state.facets[type] || {},\r\n}\r\n\r\n// ── Base actions ────────────────────────────────────────────────────────\r\n\r\nconst baseActions = {\r\n\t/**\r\n\t * Configure the store with custom options.\r\n\t * Call once before using the store if you need a custom base URL.\r\n\t *\r\n\t * @param {object} options Configuration options\r\n\t * @param {string} [options.baseUrl] Custom base URL for API calls\r\n\t */\r\n\tconfigure(options) {\r\n\t\tObject.assign(this._options, options)\r\n\t},\r\n\r\n\t/**\r\n\t * Register an object type for CRUD operations.\r\n\t *\r\n\t * @param {string} slug Short name for the type (e.g. 'client', 'case')\r\n\t * @param {string} schemaId OpenRegister schema ID\r\n\t * @param {string} registerId OpenRegister register ID\r\n\t */\r\n\tregisterObjectType(slug, schemaId, registerId) {\r\n\t\t// Replace entire objects so Vue 2 reactivity detects the change\r\n\t\t// (Vue 2 cannot track new properties added to existing reactive objects)\r\n\t\tthis.objectTypeRegistry = { ...this.objectTypeRegistry, [slug]: { schema: schemaId, register: registerId } }\r\n\t\tthis.collections = { ...this.collections, [slug]: [] }\r\n\t\tthis.objects = { ...this.objects, [slug]: {} }\r\n\t\tthis.loading = { ...this.loading, [slug]: false }\r\n\t\tthis.errors = { ...this.errors, [slug]: null }\r\n\t\tthis.pagination = { ...this.pagination, [slug]: { total: 0, page: 1, pages: 1, limit: 20 } }\r\n\t\tthis.searchTerms = { ...this.searchTerms, [slug]: '' }\r\n\t\tthis.schemas = { ...this.schemas, [slug]: null }\r\n\t\tthis.facets = { ...this.facets, [slug]: {} }\r\n\t},\r\n\r\n\t/**\r\n\t * Unregister an object type and clean up all its state.\r\n\t *\r\n\t * @param {string} slug The type slug to unregister\r\n\t */\r\n\tunregisterObjectType(slug) {\r\n\t\tdelete this.objectTypeRegistry[slug]\r\n\t\tdelete this.collections[slug]\r\n\t\tdelete this.objects[slug]\r\n\t\tdelete this.loading[slug]\r\n\t\tdelete this.errors[slug]\r\n\t\tdelete this.pagination[slug]\r\n\t\tdelete this.searchTerms[slug]\r\n\t\tdelete this.schemas[slug]\r\n\t\tdelete this.facets[slug]\r\n\t},\r\n\r\n\t/**\r\n\t * Get the type config or throw if not registered.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t * @return {{schema: string, register: string}} Type configuration\r\n\t * @throws {Error} If the type is not registered\r\n\t */\r\n\t_getTypeConfig(type) {\r\n\t\tconst config = this.objectTypeRegistry[type]\r\n\t\tif (!config) {\r\n\t\t\tthrow new Error(`Object type \"${type}\" is not registered in the store. Call registerObjectType('${type}', schemaId, registerId) first.`)\r\n\t\t}\r\n\t\treturn config\r\n\t},\r\n\r\n\t/**\r\n\t * Build the API URL for a type and optional object ID.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t * @param {string|null} [id=null] Optional object ID\r\n\t * @return {string} Full API URL path\r\n\t */\r\n\t_buildUrl(type, id = null) {\r\n\t\tconst config = this._getTypeConfig(type)\r\n\t\tlet url = `${this._options.baseUrl}/${config.register}/${config.schema}`\r\n\t\tif (id) {\r\n\t\t\turl += `/${id}`\r\n\t\t}\r\n\t\treturn url\r\n\t},\r\n\r\n\t/**\r\n\t * Clear the error state for a type.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t */\r\n\tclearError(type) {\r\n\t\tthis.errors = { ...this.errors, [type]: null }\r\n\t},\r\n\r\n\t/**\r\n\t * Set the search term for a type.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t * @param {string} term The search term\r\n\t */\r\n\tsetSearchTerm(type, term) {\r\n\t\tthis.searchTerms = { ...this.searchTerms, [type]: term }\r\n\t},\r\n\r\n\t/**\r\n\t * Clear the search term for a type.\r\n\t *\r\n\t * @param {string} type The type slug\r\n\t */\r\n\tclearSearchTerm(type) {\r\n\t\tthis.searchTerms = { ...this.searchTerms, [type]: '' }\r\n\t},\r\n\r\n\t/**\r\n\t * Fetch the schema definition for a registered type.\r\n\t * Uses cache — only fetches once per type per session.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @return {Promise<object|null>} The schema object or null on error\r\n\t */\r\n\tasync fetchSchema(type) {\r\n\t\tconst config = this._getTypeConfig(type)\r\n\r\n\t\tif (this.schemas[type]) {\r\n\t\t\treturn this.schemas[type]\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await fetch(\r\n\t\t\t\t`/apps/openregister/api/schemas/${config.schema}`,\r\n\t\t\t\t{ method: 'GET', headers: buildHeaders() },\r\n\t\t\t)\r\n\r\n\t\t\tif (!response.ok) return null\r\n\r\n\t\t\tconst schema = await response.json()\r\n\t\t\tthis.schemas = { ...this.schemas, [type]: schema }\r\n\t\t\treturn schema\r\n\t\t} catch {\r\n\t\t\treturn null\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Fetch a collection of objects for a registered type.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {object} [params={}] Query parameters (_limit, _page, _search, _order, filters)\r\n\t * @return {Promise<Array>} The fetched collection (also stored in state)\r\n\t */\r\n\tasync fetchCollection(type, params = {}) {\r\n\t\tthis.loading = { ...this.loading, [type]: true }\r\n\t\tthis.errors = { ...this.errors, [type]: null }\r\n\r\n\t\ttry {\r\n\t\t\t// Auto-include _facets=extend when schema has facetable properties\r\n\t\t\tconst fetchParams = { ...params }\r\n\t\t\tif (!fetchParams._facets) {\r\n\t\t\t\tconst schema = this.schemas[type]\r\n\t\t\t\tconst hasFacetable = schema\r\n\t\t\t\t\t&& schema.properties\r\n\t\t\t\t\t&& Object.values(schema.properties).some((p) => p.facetable)\r\n\t\t\t\tif (hasFacetable) {\r\n\t\t\t\t\tfetchParams._facets = 'extend'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst url = this._buildUrl(type) + buildQueryString(fetchParams)\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthis.errors = { ...this.errors, [type]: await parseResponseError(response, type) }\r\n\t\t\t\tconsole.error(`Error fetching ${type} collection:`, this.errors[type])\r\n\t\t\t\treturn []\r\n\t\t\t}\r\n\r\n\t\t\tconst data = await response.json()\r\n\t\t\tconst results = data.results || data\r\n\r\n\t\t\tthis.collections = { ...this.collections, [type]: results }\r\n\t\t\tthis.pagination = {\r\n\t\t\t\t...this.pagination,\r\n\t\t\t\t[type]: {\r\n\t\t\t\t\ttotal: data.total || results.length,\r\n\t\t\t\t\tpage: data.page || 1,\r\n\t\t\t\t\tpages: data.pages || 1,\r\n\t\t\t\t\tlimit: params._limit || 20,\r\n\t\t\t\t},\r\n\t\t\t}\r\n\r\n\t\t\t// Parse facet data from API response and transform to CnIndexSidebar format\r\n\t\t\tif (data.facets) {\r\n\t\t\t\tconst transformed = {}\r\n\t\t\t\tfor (const [key, facet] of Object.entries(data.facets)) {\r\n\t\t\t\t\tif (facet.buckets || facet.data?.buckets) {\r\n\t\t\t\t\t\tconst buckets = facet.buckets || facet.data.buckets\r\n\t\t\t\t\t\ttransformed[key] = {\r\n\t\t\t\t\t\t\tvalues: buckets.map((b) => ({\r\n\t\t\t\t\t\t\t\tvalue: b.key ?? b.value,\r\n\t\t\t\t\t\t\t\tcount: b.count || 0,\r\n\t\t\t\t\t\t\t})),\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.facets = { ...this.facets, [type]: transformed }\r\n\t\t\t}\r\n\r\n\t\t\treturn results\r\n\t\t} catch (error) {\r\n\t\t\tthis.errors = {\r\n\t\t\t\t...this.errors,\r\n\t\t\t\t[type]: error.name === 'TypeError'\r\n\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t: genericError(error),\r\n\t\t\t}\r\n\t\t\tconsole.error(`Error fetching ${type} collection:`, error)\r\n\t\t\treturn []\r\n\t\t} finally {\r\n\t\t\tthis.loading = { ...this.loading, [type]: false }\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Fetch a single object by type and ID.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {string} id The object ID or UUID\r\n\t * @return {Promise<object|null>} The fetched object (also cached in state)\r\n\t */\r\n\tasync fetchObject(type, id) {\r\n\t\tthis.loading = { ...this.loading, [type]: true }\r\n\t\tthis.errors = { ...this.errors, [type]: null }\r\n\r\n\t\ttry {\r\n\t\t\tconst url = this._buildUrl(type, id)\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthis.errors = { ...this.errors, [type]: await parseResponseError(response, type) }\r\n\t\t\t\tconsole.error(`Error fetching ${type}/${id}:`, this.errors[type])\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\tconst data = await response.json()\r\n\r\n\t\t\tthis.objects = {\r\n\t\t\t\t...this.objects,\r\n\t\t\t\t[type]: { ...(this.objects[type] || {}), [id]: data },\r\n\t\t\t}\r\n\r\n\t\t\treturn data\r\n\t\t} catch (error) {\r\n\t\t\tthis.errors = {\r\n\t\t\t\t...this.errors,\r\n\t\t\t\t[type]: error.name === 'TypeError'\r\n\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t: genericError(error),\r\n\t\t\t}\r\n\t\t\tconsole.error(`Error fetching ${type}/${id}:`, error)\r\n\t\t\treturn null\r\n\t\t} finally {\r\n\t\t\tthis.loading = { ...this.loading, [type]: false }\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Create or update an object. Uses POST for new objects, PUT for updates.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {object} objectData The object data (include `id` for updates)\r\n\t * @return {Promise<object|null>} The saved object or null on error\r\n\t */\r\n\tasync saveObject(type, objectData) {\r\n\t\tthis.loading = { ...this.loading, [type]: true }\r\n\t\tthis.errors = { ...this.errors, [type]: null }\r\n\r\n\t\ttry {\r\n\t\t\tconst isUpdate = !!objectData.id\r\n\t\t\tconst url = isUpdate\r\n\t\t\t\t? this._buildUrl(type, objectData.id)\r\n\t\t\t\t: this._buildUrl(type)\r\n\t\t\tconst method = isUpdate ? 'PUT' : 'POST'\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod,\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\tbody: JSON.stringify(objectData),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthis.errors = { ...this.errors, [type]: await parseResponseError(response, type) }\r\n\t\t\t\tconsole.error(`Error saving ${type}:`, this.errors[type])\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\tconst data = await response.json()\r\n\t\t\tconst savedId = data.id || objectData.id\r\n\r\n\t\t\tthis.objects = {\r\n\t\t\t\t...this.objects,\r\n\t\t\t\t[type]: { ...(this.objects[type] || {}), [savedId]: data },\r\n\t\t\t}\r\n\r\n\t\t\treturn data\r\n\t\t} catch (error) {\r\n\t\t\tthis.errors = {\r\n\t\t\t\t...this.errors,\r\n\t\t\t\t[type]: error.name === 'TypeError'\r\n\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t: genericError(error),\r\n\t\t\t}\r\n\t\t\tconsole.error(`Error saving ${type}:`, error)\r\n\t\t\treturn null\r\n\t\t} finally {\r\n\t\t\tthis.loading = { ...this.loading, [type]: false }\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Delete an object by type and ID.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {string} id The object ID\r\n\t * @return {Promise<boolean>} True if deleted successfully\r\n\t */\r\n\tasync deleteObject(type, id) {\r\n\t\tthis.loading = { ...this.loading, [type]: true }\r\n\t\tthis.errors = { ...this.errors, [type]: null }\r\n\r\n\t\ttry {\r\n\t\t\tconst url = this._buildUrl(type, id)\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod: 'DELETE',\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthis.errors = { ...this.errors, [type]: await parseResponseError(response, type) }\r\n\t\t\t\tconsole.error(`Error deleting ${type}/${id}:`, this.errors[type])\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\r\n\t\t\tif (this.objects[type]) {\r\n\t\t\t\tconst { [id]: _, ...remaining } = this.objects[type]\r\n\t\t\t\tthis.objects = { ...this.objects, [type]: remaining }\r\n\t\t\t}\r\n\t\t\tif (this.collections[type]) {\r\n\t\t\t\tthis.collections = {\r\n\t\t\t\t\t...this.collections,\r\n\t\t\t\t\t[type]: this.collections[type].filter((obj) => obj.id !== id),\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn true\r\n\t\t} catch (error) {\r\n\t\t\tthis.errors = {\r\n\t\t\t\t...this.errors,\r\n\t\t\t\t[type]: error.name === 'TypeError'\r\n\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t: genericError(error),\r\n\t\t\t}\r\n\t\t\tconsole.error(`Error deleting ${type}/${id}:`, error)\r\n\t\t\treturn false\r\n\t\t} finally {\r\n\t\t\tthis.loading = { ...this.loading, [type]: false }\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Batch-resolve references by fetching multiple objects by their IDs.\r\n\t * Uses the cache first, only fetches uncached objects.\r\n\t *\r\n\t * @param {string} type The registered type slug\r\n\t * @param {string[]} ids Array of object IDs to resolve\r\n\t * @return {Promise<Object<string, object>>} Map of id -> object\r\n\t */\r\n\tasync resolveReferences(type, ids) {\r\n\t\tif (!ids || ids.length === 0) return {}\r\n\r\n\t\tconst uniqueIds = [...new Set(ids.filter(Boolean))]\r\n\t\tconst result = {}\r\n\t\tconst toFetch = []\r\n\r\n\t\tfor (const id of uniqueIds) {\r\n\t\t\tconst cached = this.objects[type]?.[id]\r\n\t\t\tif (cached) {\r\n\t\t\t\tresult[id] = cached\r\n\t\t\t} else {\r\n\t\t\t\ttoFetch.push(id)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (toFetch.length > 0) {\r\n\t\t\tconst fetches = toFetch.map(async (id) => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, id)\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'GET',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\t\t\t\t\tif (response.ok) {\r\n\t\t\t\t\t\tconst data = await response.json()\r\n\t\t\t\t\t\tthis.objects = {\r\n\t\t\t\t\t\t\t...this.objects,\r\n\t\t\t\t\t\t\t[type]: { ...(this.objects[type] || {}), [id]: data },\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tresult[id] = data\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch {\r\n\t\t\t\t\t// Non-blocking — leave unresolved\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\tawait Promise.all(fetches)\r\n\t\t}\r\n\r\n\t\treturn result\r\n\t},\r\n}\r\n\r\n// ── Store factory ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Create the object store definition with a given store ID and optional plugins.\r\n *\r\n * Plugins are merged into the store at definition time. Each plugin provides\r\n * additional state, getters, and actions (e.g. for sub-resources like files,\r\n * audit trails, relations).\r\n *\r\n * @param {string} storeId Pinia store identifier\r\n * @param {Array} [plugins=[]] Array of plugin definitions\r\n * @return {Function} Pinia store composable\r\n */\r\nfunction defineObjectStore(storeId, plugins = []) {\r\n\tconst pluginState = mergePluginState(plugins)\r\n\tconst pluginGetters = mergePluginGetters(plugins)\r\n\tconst pluginActions = mergePluginActions(plugins)\r\n\r\n\treturn defineStore(storeId, {\r\n\t\tstate: () => ({\r\n\t\t\t...baseState(),\r\n\t\t\t...pluginState,\r\n\t\t}),\r\n\r\n\t\tgetters: {\r\n\t\t\t...baseGetters,\r\n\t\t\t...pluginGetters,\r\n\t\t},\r\n\r\n\t\tactions: {\r\n\t\t\t...baseActions,\r\n\t\t\t...pluginActions,\r\n\r\n\t\t\t/**\r\n\t\t\t * Clear all sub-resource data from active plugins.\r\n\t\t\t * Calls each plugin's clear method (e.g. clearFiles, clearAuditTrails).\r\n\t\t\t */\r\n\t\t\tclearAllSubResources() {\r\n\t\t\t\tfor (const plugin of plugins) {\r\n\t\t\t\t\tconst clearFn = `clear${capitalize(plugin.name)}`\r\n\t\t\t\t\tif (typeof this[clearFn] === 'function') {\r\n\t\t\t\t\t\tthis[clearFn]()\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t})\r\n}\r\n\r\n/**\r\n * Default object store instance with ID 'conduction-objects'.\r\n *\r\n * @example\r\n * import { useObjectStore } from '@conduction/nextcloud-vue'\r\n * const store = useObjectStore()\r\n */\r\nexport const useObjectStore = defineObjectStore(DEFAULT_STORE_ID)\r\n\r\n/**\r\n * Factory function to create an object store with a custom Pinia store ID\r\n * and optional plugins for sub-resources.\r\n *\r\n * @param {string} storeId Custom Pinia store identifier\r\n * @param {object} [options={}] Configuration options\r\n * @param {Array} [options.plugins=[]] Array of sub-resource plugins\r\n * @return {Function} Pinia store composable\r\n *\r\n * @example\r\n * // Basic (backwards compatible)\r\n * const useMyStore = createObjectStore('object')\r\n *\r\n * @example\r\n * // With plugins\r\n * import { filesPlugin, auditTrailsPlugin } from '@conduction/nextcloud-vue'\r\n * const useMyStore = createObjectStore('object', {\r\n * plugins: [filesPlugin(), auditTrailsPlugin()],\r\n * })\r\n */\r\nexport function createObjectStore(storeId, options = {}) {\r\n\treturn defineObjectStore(storeId, options.plugins || [])\r\n}\r\n","import { buildHeaders, buildQueryString } from '../utils/headers.js'\r\nimport { parseResponseError, networkError } from '../utils/errors.js'\r\n\r\n/**\r\n * Standard empty paginated response shape used by all sub-resource plugins.\r\n *\r\n * @param {number} [limit=20] Default page size\r\n * @return {object} Empty paginated state\r\n */\r\nexport function emptyPaginated(limit = 20) {\r\n\treturn { results: [], total: 0, page: 1, pages: 0, limit, offset: 0 }\r\n}\r\n\r\n/**\r\n * Capitalize the first letter of a string.\r\n *\r\n * @param {string} str Input string\r\n * @return {string} Capitalized string\r\n */\r\nfunction capitalize(str) {\r\n\treturn str.charAt(0).toUpperCase() + str.slice(1)\r\n}\r\n\r\n/**\r\n * Create a sub-resource plugin for the object store.\r\n *\r\n * Generates state, getters, and actions for a standard OpenRegister sub-resource\r\n * endpoint that returns paginated results. The generated plugin follows the\r\n * naming convention: fetch{Name}, clear{Name}, get{Name}, is{Name}Loading, etc.\r\n *\r\n * @param {string} name Camel-case name for the sub-resource (e.g. 'auditTrails')\r\n * @param {string} endpoint URL path segment appended to the object URL (e.g. 'audit-trails')\r\n * @param {object} [options={}] Plugin options\r\n * @param {number} [options.limit=20] Default page size\r\n * @return {Function} Plugin factory that returns the plugin definition\r\n *\r\n * @example\r\n * // Simple read-only sub-resource\r\n * export const auditTrailsPlugin = createSubResourcePlugin('auditTrails', 'audit-trails')\r\n *\r\n * @example\r\n * // With custom limit\r\n * export const contractsPlugin = createSubResourcePlugin('contracts', 'contracts', { limit: 50 })\r\n *\r\n * @example\r\n * // Usage in store creation\r\n * const useStore = createObjectStore('object', {\r\n * plugins: [auditTrailsPlugin()],\r\n * })\r\n * const store = useStore()\r\n * await store.fetchAuditTrails('case', caseId)\r\n * console.log(store.auditTrails.results)\r\n */\r\nexport function createSubResourcePlugin(name, endpoint, options = {}) {\r\n\tconst cap = capitalize(name)\r\n\tconst limit = options.limit || 20\r\n\r\n\treturn () => ({\r\n\t\tname,\r\n\r\n\t\tstate: () => ({\r\n\t\t\t[name]: emptyPaginated(limit),\r\n\t\t\t[`${name}Loading`]: false,\r\n\t\t\t[`${name}Error`]: null,\r\n\t\t}),\r\n\r\n\t\tgetters: {\r\n\t\t\t[`get${cap}`]: (state) => state[name],\r\n\t\t\t[`is${cap}Loading`]: (state) => state[`${name}Loading`],\r\n\t\t\t[`get${cap}Error`]: (state) => state[`${name}Error`],\r\n\t\t},\r\n\r\n\t\tactions: {\r\n\t\t\t/**\r\n\t\t\t * Fetch the sub-resource collection for an object.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {object} [params={}] Query parameters (_search, _limit, _page)\r\n\t\t\t * @return {Promise<Array>} The fetched results\r\n\t\t\t */\r\n\t\t\tasync [`fetch${cap}`](type, objectId, params = {}) {\r\n\t\t\t\tthis[`${name}Loading`] = true\r\n\t\t\t\tthis[`${name}Error`] = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId)\r\n\t\t\t\t\t\t+ '/' + endpoint\r\n\t\t\t\t\t\t+ buildQueryString(params)\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'GET',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis[`${name}Error`] = await parseResponseError(response, name)\r\n\t\t\t\t\t\tconsole.error(`Error fetching ${name} for ${type}/${objectId}:`, this[`${name}Error`])\r\n\t\t\t\t\t\treturn []\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst data = await response.json()\r\n\r\n\t\t\t\t\tthis[name] = {\r\n\t\t\t\t\t\tresults: data.results || data,\r\n\t\t\t\t\t\ttotal: data.total || (data.results || data).length,\r\n\t\t\t\t\t\tpage: data.page || 1,\r\n\t\t\t\t\t\tpages: data.pages || 0,\r\n\t\t\t\t\t\tlimit: params._limit || limit,\r\n\t\t\t\t\t\toffset: data.offset || 0,\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn this[name].results\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis[`${name}Error`] = error.name === 'TypeError'\r\n\t\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t\t: { status: null, message: error.message, details: null, isValidation: false, fields: null, toString() { return this.message } }\r\n\t\t\t\t\tconsole.error(`Error fetching ${name} for ${type}/${objectId}:`, error)\r\n\t\t\t\t\treturn []\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis[`${name}Loading`] = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Clear all sub-resource state back to empty defaults.\r\n\t\t\t */\r\n\t\t\t[`clear${cap}`]() {\r\n\t\t\t\tthis[name] = emptyPaginated(limit)\r\n\t\t\t\tthis[`${name}Loading`] = false\r\n\t\t\t\tthis[`${name}Error`] = null\r\n\t\t\t},\r\n\t\t},\r\n\t})\r\n}\r\n","import { createSubResourcePlugin } from '../createSubResourcePlugin.js'\r\n\r\n/**\r\n * Audit trails plugin for the object store.\r\n *\r\n * Adds state, getters, and actions for fetching audit trail records\r\n * for an object. Read-only — no create/update/delete.\r\n *\r\n * State: auditTrails, auditTrailsLoading, auditTrailsError\r\n * Actions: fetchAuditTrails(type, objectId, params), clearAuditTrails()\r\n * Getters: getAuditTrails, isAuditTrailsLoading, getAuditTrailsError\r\n *\r\n * @param {object} [options={}] Plugin options\r\n * @param {number} [options.limit=20] Default page size\r\n * @return {Function} Plugin factory\r\n */\r\nexport const auditTrailsPlugin = createSubResourcePlugin('auditTrails', 'audit-trails')\r\n","import { createSubResourcePlugin } from '../createSubResourcePlugin.js'\r\n\r\n/**\r\n * Relations plugin for the object store.\r\n *\r\n * Adds three sub-resources for object relations:\r\n * - contracts: contractual relations between objects\r\n * - uses: outgoing references (this object uses other objects)\r\n * - used: incoming references (other objects use this object)\r\n *\r\n * Each sub-resource gets its own state, loading, error, fetch, and clear.\r\n */\r\n\r\nconst contractsBase = createSubResourcePlugin('contracts', 'contracts')\r\nconst usesBase = createSubResourcePlugin('uses', 'uses')\r\nconst usedBase = createSubResourcePlugin('used', 'used')\r\n\r\n/**\r\n * Combined relations plugin that registers contracts, uses, and used sub-resources.\r\n *\r\n * @param {object} [options={}] Plugin options\r\n * @return {Function} Plugin factory\r\n *\r\n * @example\r\n * const useStore = createObjectStore('object', {\r\n * plugins: [relationsPlugin()],\r\n * })\r\n * const store = useStore()\r\n * await store.fetchContracts('case', caseId)\r\n * await store.fetchUses('case', caseId)\r\n * await store.fetchUsed('case', caseId)\r\n */\r\nexport function relationsPlugin(options = {}) {\r\n\tconst contracts = contractsBase(options)\r\n\tconst uses = usesBase(options)\r\n\tconst used = usedBase(options)\r\n\r\n\treturn {\r\n\t\tname: 'Relations',\r\n\r\n\t\tstate: () => ({\r\n\t\t\t...contracts.state(),\r\n\t\t\t...uses.state(),\r\n\t\t\t...used.state(),\r\n\t\t}),\r\n\r\n\t\tgetters: {\r\n\t\t\t...contracts.getters,\r\n\t\t\t...uses.getters,\r\n\t\t\t...used.getters,\r\n\t\t},\r\n\r\n\t\tactions: {\r\n\t\t\t...contracts.actions,\r\n\t\t\t...uses.actions,\r\n\t\t\t...used.actions,\r\n\r\n\t\t\t/**\r\n\t\t\t * Clear all relation sub-resources.\r\n\t\t\t */\r\n\t\t\tclearRelations() {\r\n\t\t\t\tthis.clearContracts()\r\n\t\t\t\tthis.clearUses()\r\n\t\t\t\tthis.clearUsed()\r\n\t\t\t},\r\n\t\t},\r\n\t}\r\n}\r\n","import { createSubResourcePlugin } from '../createSubResourcePlugin.js'\r\nimport { buildHeaders } from '../../utils/headers.js'\r\nimport { parseResponseError, networkError } from '../../utils/errors.js'\r\n\r\n/**\r\n * Files plugin for the object store.\r\n *\r\n * Extends the generic sub-resource with file-specific actions:\r\n * upload (multipart), publish, unpublish, and delete.\r\n *\r\n * State: files, filesLoading, filesError\r\n * Actions: fetchFiles, uploadFiles, publishFile, unpublishFile, deleteFile, clearFiles\r\n * Getters: getFiles, isFilesLoading, getFilesError\r\n *\r\n * @param {object} [options={}] Plugin options\r\n * @param {number} [options.limit=20] Default page size\r\n * @return {Function} Plugin factory\r\n *\r\n * @example\r\n * const useStore = createObjectStore('object', {\r\n * plugins: [filesPlugin()],\r\n * })\r\n * const store = useStore()\r\n * await store.fetchFiles('case', caseId)\r\n * await store.uploadFiles('case', caseId, formData)\r\n * await store.publishFile('case', caseId, fileId)\r\n */\r\nexport function filesPlugin(options = {}) {\r\n\tconst base = createSubResourcePlugin('files', 'files', options)()\r\n\r\n\treturn {\r\n\t\t...base,\r\n\r\n\t\tactions: {\r\n\t\t\t...base.actions,\r\n\r\n\t\t\t/**\r\n\t\t\t * Upload files to an object via multipart form data.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {FormData} formData FormData with files[] and optional tags/share fields\r\n\t\t\t * @return {Promise<object|null>} Upload response or null on error\r\n\t\t\t */\r\n\t\t\tasync uploadFiles(type, objectId, formData) {\r\n\t\t\t\tthis.filesLoading = true\r\n\t\t\t\tthis.filesError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + '/filesMultipart'\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\t\theaders: buildHeaders(null),\r\n\t\t\t\t\t\tbody: formData,\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.filesError = await parseResponseError(response, 'files')\r\n\t\t\t\t\t\tconsole.error(`Error uploading files for ${type}/${objectId}:`, this.filesError)\r\n\t\t\t\t\t\treturn null\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst data = await response.json()\r\n\r\n\t\t\t\t\tawait this.fetchFiles(type, objectId)\r\n\r\n\t\t\t\t\treturn data\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.filesError = error.name === 'TypeError'\r\n\t\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t\t: { status: null, message: error.message, details: null, isValidation: false, fields: null, toString() { return this.message } }\r\n\t\t\t\t\tconsole.error(`Error uploading files for ${type}/${objectId}:`, error)\r\n\t\t\t\t\treturn null\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.filesLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Publish a file (make it publicly accessible).\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {string} fileId The file ID to publish\r\n\t\t\t * @return {Promise<boolean>} True if published successfully\r\n\t\t\t */\r\n\t\t\tasync publishFile(type, objectId, fileId) {\r\n\t\t\t\tthis.filesLoading = true\r\n\t\t\t\tthis.filesError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + `/files/${fileId}/publish`\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.filesError = await parseResponseError(response, 'files')\r\n\t\t\t\t\t\treturn false\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tawait this.fetchFiles(type, objectId)\r\n\t\t\t\t\treturn true\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.filesError = networkError(error)\r\n\t\t\t\t\treturn false\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.filesLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unpublish a file (revoke public access).\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {string} fileId The file ID to unpublish\r\n\t\t\t * @return {Promise<boolean>} True if unpublished successfully\r\n\t\t\t */\r\n\t\t\tasync unpublishFile(type, objectId, fileId) {\r\n\t\t\t\tthis.filesLoading = true\r\n\t\t\t\tthis.filesError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + `/files/${fileId}/depublish`\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.filesError = await parseResponseError(response, 'files')\r\n\t\t\t\t\t\treturn false\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tawait this.fetchFiles(type, objectId)\r\n\t\t\t\t\treturn true\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.filesError = networkError(error)\r\n\t\t\t\t\treturn false\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.filesLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delete a file from an object.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The parent object ID\r\n\t\t\t * @param {string} fileId The file ID to delete\r\n\t\t\t * @return {Promise<boolean>} True if deleted successfully\r\n\t\t\t */\r\n\t\t\tasync deleteFile(type, objectId, fileId) {\r\n\t\t\t\tthis.filesLoading = true\r\n\t\t\t\tthis.filesError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + `/files/${fileId}`\r\n\r\n\t\t\t\t\tconst response = await fetch(url, {\r\n\t\t\t\t\t\tmethod: 'DELETE',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.filesError = await parseResponseError(response, 'files')\r\n\t\t\t\t\t\treturn false\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tawait this.fetchFiles(type, objectId)\r\n\t\t\t\t\treturn true\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.filesError = networkError(error)\r\n\t\t\t\t\treturn false\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.filesLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t}\r\n}\r\n","import { buildHeaders } from '../../utils/headers.js'\r\nimport { parseResponseError, networkError } from '../../utils/errors.js'\r\n\r\n/**\r\n * Lifecycle plugin for the object store.\r\n *\r\n * Adds object lifecycle actions: lock, unlock, publish, depublish, revert, merge.\r\n * These operate on the object itself (not sub-resources) but share the same\r\n * URL pattern: POST /{register}/{schema}/{objectId}/{action}\r\n *\r\n * State: lifecycleLoading, lifecycleError\r\n * Actions: lockObject, unlockObject, publishObject, depublishObject, revertObject, mergeObjects\r\n *\r\n * @return {Function} Plugin factory\r\n *\r\n * @example\r\n * const useStore = createObjectStore('object', {\r\n * plugins: [lifecyclePlugin()],\r\n * })\r\n * const store = useStore()\r\n * await store.lockObject('case', caseId, { process: 'review', duration: 3600 })\r\n * await store.publishObject('case', caseId, { date: '2025-01-01' })\r\n */\r\nexport function lifecyclePlugin() {\r\n\treturn {\r\n\t\tname: 'Lifecycle',\r\n\r\n\t\tstate: () => ({\r\n\t\t\tlifecycleLoading: false,\r\n\t\t\tlifecycleError: null,\r\n\t\t}),\r\n\r\n\t\tgetters: {\r\n\t\t\tisLifecycleLoading: (state) => state.lifecycleLoading,\r\n\t\t\tgetLifecycleError: (state) => state.lifecycleError,\r\n\t\t},\r\n\r\n\t\tactions: {\r\n\t\t\t/**\r\n\t\t\t * Perform a lifecycle action on an object.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {string} action The lifecycle action endpoint (e.g. 'lock', 'publish')\r\n\t\t\t * @param {object} [body=null] Optional request body\r\n\t\t\t * @return {Promise<object|null>} Response data or null on error\r\n\t\t\t */\r\n\t\t\tasync _lifecycleAction(type, objectId, action, body = null) {\r\n\t\t\t\tthis.lifecycleLoading = true\r\n\t\t\t\tthis.lifecycleError = null\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst url = this._buildUrl(type, objectId) + '/' + action\r\n\t\t\t\t\tconst options = {\r\n\t\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\t\theaders: buildHeaders(),\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (body) {\r\n\t\t\t\t\t\toptions.body = JSON.stringify(body)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst response = await fetch(url, options)\r\n\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthis.lifecycleError = await parseResponseError(response, action)\r\n\t\t\t\t\t\tconsole.error(`Error performing ${action} on ${type}/${objectId}:`, this.lifecycleError)\r\n\t\t\t\t\t\treturn null\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst data = await response.json()\r\n\r\n\t\t\t\t\tif (this.objects[type] && data.id) {\r\n\t\t\t\t\t\tthis.objects[type][data.id] = data\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn data\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.lifecycleError = error.name === 'TypeError'\r\n\t\t\t\t\t\t? networkError(error)\r\n\t\t\t\t\t\t: { status: null, message: error.message, details: null, isValidation: false, fields: null, toString() { return this.message } }\r\n\t\t\t\t\tconsole.error(`Error performing ${action} on ${type}/${objectId}:`, error)\r\n\t\t\t\t\treturn null\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tthis.lifecycleLoading = false\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Lock an object to prevent concurrent edits.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {object} options Lock options\r\n\t\t\t * @param {string} [options.process] Lock reason/process name\r\n\t\t\t * @param {number} [options.duration] Lock duration in seconds\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync lockObject(type, objectId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'lock', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unlock an object.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync unlockObject(type, objectId) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'unlock')\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Publish an object (make it publicly accessible).\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {object} [options={}] Publish options\r\n\t\t\t * @param {string} [options.date] Publish date (ISO 8601)\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync publishObject(type, objectId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'publish', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Depublish an object (revoke public access).\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {object} [options={}] Depublish options\r\n\t\t\t * @param {string} [options.date] Depublish date (ISO 8601)\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync depublishObject(type, objectId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'depublish', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Revert an object to a previous version.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} objectId The object ID\r\n\t\t\t * @param {object} options Revert options\r\n\t\t\t * @param {string} [options.datetime] Target datetime\r\n\t\t\t * @param {string} [options.auditTrailId] Audit trail entry ID to revert to\r\n\t\t\t * @param {number} [options.version] Target version number\r\n\t\t\t * @param {boolean} [options.overwriteVersion] Overwrite current version\r\n\t\t\t * @return {Promise<object|null>} Updated object or null on error\r\n\t\t\t */\r\n\t\t\tasync revertObject(type, objectId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, objectId, 'revert', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Merge two objects together.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The registered object type slug\r\n\t\t\t * @param {string} sourceId The source object ID (will be merged into target)\r\n\t\t\t * @param {object} options Merge options\r\n\t\t\t * @param {string} options.target Target object ID\r\n\t\t\t * @param {string} [options.fileAction] How to handle files ('move'|'copy'|'skip')\r\n\t\t\t * @param {string} [options.relationAction] How to handle relations\r\n\t\t\t * @param {string} [options.referenceAction] How to handle references\r\n\t\t\t * @return {Promise<object|null>} Merge result or null on error\r\n\t\t\t */\r\n\t\t\tasync mergeObjects(type, sourceId, options = {}) {\r\n\t\t\t\treturn this._lifecycleAction(type, sourceId, 'merge', options)\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Clear lifecycle state.\r\n\t\t\t */\r\n\t\t\tclearLifecycle() {\r\n\t\t\t\tthis.lifecycleLoading = false\r\n\t\t\t\tthis.lifecycleError = null\r\n\t\t\t},\r\n\t\t},\r\n\t}\r\n}\r\n","import { buildHeaders } from '../../utils/headers.js'\n\n/**\n * Register mapping plugin for the object store.\n *\n * Adds state and actions for fetching OpenRegister registers and their\n * schemas, used by CnRegisterMapping to populate dropdowns.\n *\n * State: registers, registerSchemas, registersLoading, registersError\n * Actions: fetchRegisters, fetchSchemasForRegister, clearRegisterMapping\n * Getters: getRegisters, registerOptions, schemaOptions, isRegistersLoading, getRegistersError\n *\n * @return {Function} Plugin factory\n *\n * @example\n * const useStore = createObjectStore('object', {\n * plugins: [registerMappingPlugin()],\n * })\n * const store = useStore()\n * await store.fetchRegisters()\n * const options = store.registerOptions // [{ label, value }]\n * const schemas = store.schemaOptions('5') // [{ label, value }]\n */\nexport function registerMappingPlugin() {\n\treturn {\n\t\tname: 'RegisterMapping',\n\n\t\tstate: () => ({\n\t\t\t/** @type {Array} All available registers from OpenRegister */\n\t\t\tregisters: [],\n\t\t\t/** @type {Object<string, Array>} Schemas keyed by register ID */\n\t\t\tregisterSchemas: {},\n\t\t\t/** @type {boolean} Whether registers are being fetched */\n\t\t\tregistersLoading: false,\n\t\t\t/** @type {string|null} Error message from last fetch */\n\t\t\tregistersError: null,\n\t\t}),\n\n\t\tgetters: {\n\t\t\t/** @return {Array} Raw register list */\n\t\t\tgetRegisters: (state) => state.registers,\n\n\t\t\t/** @return {boolean} Whether registers are loading */\n\t\t\tisRegistersLoading: (state) => state.registersLoading,\n\n\t\t\t/** @return {string|null} Last error */\n\t\t\tgetRegistersError: (state) => state.registersError,\n\n\t\t\t/**\n\t\t\t * Registers as NcSelect-compatible options.\n\t\t\t *\n\t\t\t * @return {Array<{label: string, value: string}>}\n\t\t\t */\n\t\t\tregisterOptions: (state) => state.registers.map((r) => ({\n\t\t\t\tlabel: r.title || r.slug || `Register ${r.id}`,\n\t\t\t\tvalue: String(r.id),\n\t\t\t})),\n\t\t},\n\n\t\tactions: {\n\t\t\t/**\n\t\t\t * Get schemas for a register as NcSelect options.\n\t\t\t *\n\t\t\t * @param {string|number} registerId Register ID\n\t\t\t * @return {Array<{label: string, value: string}>}\n\t\t\t */\n\t\t\tschemaOptions(registerId) {\n\t\t\t\tconst id = String(registerId)\n\t\t\t\treturn (this.registerSchemas[id] || []).map((s) => ({\n\t\t\t\t\tlabel: s.title || s.slug || `Schema ${s.id}`,\n\t\t\t\t\tvalue: String(s.id),\n\t\t\t\t}))\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Fetch all registers from OpenRegister with expanded schemas.\n\t\t\t *\n\t\t\t * @param {boolean} [withSchemas=true] Include schemas in response\n\t\t\t * @return {Promise<Array>} Fetched registers\n\t\t\t */\n\t\t\tasync fetchRegisters(withSchemas = true) {\n\t\t\t\tthis.registersLoading = true\n\t\t\t\tthis.registersError = null\n\n\t\t\t\ttry {\n\t\t\t\t\tlet url = '/apps/openregister/api/registers'\n\t\t\t\t\tif (withSchemas) {\n\t\t\t\t\t\turl += '?_extend[]=schemas'\n\t\t\t\t\t}\n\n\t\t\t\t\tconst response = await fetch(url, {\n\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthis.registersError = `Failed to fetch registers: ${response.statusText}`\n\t\t\t\t\t\treturn []\n\t\t\t\t\t}\n\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tconst results = data.results || data\n\t\t\t\t\tthis.registers = Array.isArray(results) ? results : []\n\n\t\t\t\t\t// Cache expanded schemas by register ID\n\t\t\t\t\tif (withSchemas) {\n\t\t\t\t\t\tfor (const reg of this.registers) {\n\t\t\t\t\t\t\tif (Array.isArray(reg.schemas) && reg.schemas.length > 0) {\n\t\t\t\t\t\t\t\tthis.registerSchemas = {\n\t\t\t\t\t\t\t\t\t...this.registerSchemas,\n\t\t\t\t\t\t\t\t\t[String(reg.id)]: reg.schemas.filter(\n\t\t\t\t\t\t\t\t\t\t(s) => s && typeof s === 'object' && s.id,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this.registers\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.registersError = error.message || 'Network error fetching registers'\n\t\t\t\t\treturn []\n\t\t\t\t} finally {\n\t\t\t\t\tthis.registersLoading = false\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Fetch schemas for a specific register.\n\t\t\t * Returns cached data if already fetched via expanded registers.\n\t\t\t *\n\t\t\t * @param {string|number} registerId Register ID\n\t\t\t * @return {Promise<Array>} Schemas for the register\n\t\t\t */\n\t\t\tasync fetchSchemasForRegister(registerId) {\n\t\t\t\tconst id = String(registerId)\n\n\t\t\t\t// Return cached if available and non-empty\n\t\t\t\tif (this.registerSchemas[id]?.length > 0) {\n\t\t\t\t\treturn this.registerSchemas[id]\n\t\t\t\t}\n\n\t\t\t\t// Check registers array for expanded schemas\n\t\t\t\tconst register = this.registers.find((r) => String(r.id) === id)\n\t\t\t\tif (register?.schemas?.length > 0) {\n\t\t\t\t\tconst schemas = register.schemas.filter(\n\t\t\t\t\t\t(s) => s && typeof s === 'object' && s.id,\n\t\t\t\t\t)\n\t\t\t\t\tif (schemas.length > 0) {\n\t\t\t\t\t\tthis.registerSchemas = { ...this.registerSchemas, [id]: schemas }\n\t\t\t\t\t\treturn schemas\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fetch from API as fallback\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await fetch(\n\t\t\t\t\t\t`/apps/openregister/api/registers/${id}?_extend[]=schemas`,\n\t\t\t\t\t\t{ method: 'GET', headers: buildHeaders() },\n\t\t\t\t\t)\n\t\t\t\t\tif (!response.ok) return []\n\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tconst schemas = (data.schemas || []).filter(\n\t\t\t\t\t\t(s) => s && typeof s === 'object' && s.id,\n\t\t\t\t\t)\n\t\t\t\t\tthis.registerSchemas = { ...this.registerSchemas, [id]: schemas }\n\t\t\t\t\treturn schemas\n\t\t\t\t} catch {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Clear all register mapping state.\n\t\t\t */\n\t\t\tclearRegisterMapping() {\n\t\t\t\tthis.registers = []\n\t\t\t\tthis.registerSchemas = {}\n\t\t\t\tthis.registersLoading = false\n\t\t\t\tthis.registersError = null\n\t\t\t},\n\t\t},\n\t}\n}\n","import { ref, onBeforeUnmount } from 'vue'\r\n\r\n/**\r\n * Composable for managing list view state: search, filters, sorting, pagination.\r\n *\r\n * Extracts the search-debounce + filter + sort + pagination pattern\r\n * found in every list view across Pipelinq and Procest.\r\n *\r\n * @param {object} options Configuration options\r\n * @param {string} options.objectType The registered object type slug\r\n * @param {Function} options.fetchFn Function to call: (type, params) => Promise<Array>\r\n * @param {number} [options.debounceMs=300] Search debounce in milliseconds\r\n * @param {number} [options.pageSize=20] Default page size\r\n * @param {object} [options.defaultSort] Default sort: { key: string, order: 'asc'|'desc' }\r\n * @return {object} Reactive state and methods\r\n *\r\n * @example\r\n * import { useListView } from '@conduction/nextcloud-vue'\r\n *\r\n * const { searchTerm, sortKey, sortOrder, currentPage, onSearchInput, toggleSort, fetch } = useListView({\r\n * objectType: 'client',\r\n * fetchFn: (type, params) => objectStore.fetchCollection(type, params),\r\n * defaultSort: { key: 'name', order: 'asc' },\r\n * })\r\n */\r\nexport function useListView(options) {\r\n\tconst searchTerm = ref('')\r\n\tconst filters = ref({})\r\n\tconst sortKey = ref(options.defaultSort?.key || null)\r\n\tconst sortOrder = ref(options.defaultSort?.order || 'asc')\r\n\tconst currentPage = ref(1)\r\n\tconst pageSize = ref(options.pageSize || 20)\r\n\r\n\tlet searchTimeout = null\r\n\r\n\t/**\r\n\t * Build fetch parameters from current state.\r\n\t * @return {object} Parameters for the fetch function\r\n\t */\r\n\tfunction buildFetchParams() {\r\n\t\tconst params = {\r\n\t\t\t_limit: pageSize.value,\r\n\t\t\t_page: currentPage.value,\r\n\t\t}\r\n\r\n\t\tif (searchTerm.value) {\r\n\t\t\tparams._search = searchTerm.value\r\n\t\t}\r\n\r\n\t\tif (sortKey.value) {\r\n\t\t\tparams._order = { [sortKey.value]: sortOrder.value }\r\n\t\t}\r\n\r\n\t\t// Merge active filters\r\n\t\tfor (const [key, value] of Object.entries(filters.value)) {\r\n\t\t\tif (value !== null && value !== '' && value !== false) {\r\n\t\t\t\tparams[key] = value\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn params\r\n\t}\r\n\r\n\t/**\r\n\t * Execute a fetch with current state.\r\n\t * @param {number} [page] Optional page override\r\n\t * @return {Promise<Array>} Fetched results\r\n\t */\r\n\tasync function fetchData(page) {\r\n\t\tif (page !== undefined) {\r\n\t\t\tcurrentPage.value = page\r\n\t\t}\r\n\t\tconst params = buildFetchParams()\r\n\t\treturn options.fetchFn(options.objectType, params)\r\n\t}\r\n\r\n\t/**\r\n\t * Handle search input with debouncing.\r\n\t * @param {string} value New search value\r\n\t */\r\n\tfunction onSearchInput(value) {\r\n\t\tsearchTerm.value = value\r\n\t\tclearTimeout(searchTimeout)\r\n\t\tsearchTimeout = setTimeout(() => fetchData(1), options.debounceMs || 300)\r\n\t}\r\n\r\n\t/**\r\n\t * Toggle sort on a column. Cycles: asc -> desc -> null.\r\n\t * @param {string} key Column key\r\n\t */\r\n\tfunction toggleSort(key) {\r\n\t\tif (sortKey.value === key) {\r\n\t\t\tif (sortOrder.value === 'asc') {\r\n\t\t\t\tsortOrder.value = 'desc'\r\n\t\t\t} else {\r\n\t\t\t\tsortKey.value = null\r\n\t\t\t\tsortOrder.value = 'asc'\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tsortKey.value = key\r\n\t\t\tsortOrder.value = 'asc'\r\n\t\t}\r\n\t\tfetchData(1)\r\n\t}\r\n\r\n\t/**\r\n\t * Set a filter value and re-fetch.\r\n\t * @param {string} key Filter key\r\n\t * @param {*} value Filter value\r\n\t */\r\n\tfunction setFilter(key, value) {\r\n\t\tfilters.value = { ...filters.value, [key]: value }\r\n\t\tfetchData(1)\r\n\t}\r\n\r\n\t/**\r\n\t * Clear all filters and search, then re-fetch.\r\n\t */\r\n\tfunction clearAllFilters() {\r\n\t\tsearchTerm.value = ''\r\n\t\tfilters.value = {}\r\n\t\tsortKey.value = options.defaultSort?.key || null\r\n\t\tsortOrder.value = options.defaultSort?.order || 'asc'\r\n\t\tfetchData(1)\r\n\t}\r\n\r\n\t/**\r\n\t * Navigate to a specific page.\r\n\t * @param {number} page Page number\r\n\t */\r\n\tfunction goToPage(page) {\r\n\t\tcurrentPage.value = page\r\n\t\tfetchData()\r\n\t}\r\n\r\n\tonBeforeUnmount(() => clearTimeout(searchTimeout))\r\n\r\n\treturn {\r\n\t\tsearchTerm,\r\n\t\tfilters,\r\n\t\tsortKey,\r\n\t\tsortOrder,\r\n\t\tcurrentPage,\r\n\t\tpageSize,\r\n\t\tonSearchInput,\r\n\t\ttoggleSort,\r\n\t\tsetFilter,\r\n\t\tclearAllFilters,\r\n\t\tgoToPage,\r\n\t\tfetch: fetchData,\r\n\t\tbuildFetchParams,\r\n\t}\r\n}\r\n","import { ref } from 'vue'\r\n\r\n/**\r\n * Composable for managing detail view state: loading, editing, deleting.\r\n *\r\n * Extracts the load/edit/delete pattern found in every detail view\r\n * across Pipelinq and Procest.\r\n *\r\n * @param {object} options Configuration options\r\n * @param {string} options.objectType The registered object type slug\r\n * @param {Function} options.fetchFn (type, id) => Promise<object>\r\n * @param {Function} options.saveFn (type, data) => Promise<object>\r\n * @param {Function} options.deleteFn (type, id) => Promise<boolean>\r\n * @param {Function} [options.onSaved] Callback after successful save\r\n * @param {Function} [options.onDeleted] Callback after successful delete\r\n * @return {object} Reactive state and methods\r\n *\r\n * @example\r\n * import { useDetailView } from '@conduction/nextcloud-vue'\r\n *\r\n * const { objectData, editing, loading, showDeleteDialog, load, save, confirmDelete, executeDelete } = useDetailView({\r\n * objectType: 'client',\r\n * fetchFn: (type, id) => objectStore.fetchObject(type, id),\r\n * saveFn: (type, data) => objectStore.saveObject(type, data),\r\n * deleteFn: (type, id) => objectStore.deleteObject(type, id),\r\n * onSaved: (result) => router.push(`/clients/${result.id}`),\r\n * onDeleted: () => router.push('/clients'),\r\n * })\r\n */\r\nexport function useDetailView(options) {\r\n\tconst objectData = ref({})\r\n\tconst editing = ref(false)\r\n\tconst loading = ref(false)\r\n\tconst saving = ref(false)\r\n\tconst showDeleteDialog = ref(false)\r\n\tconst error = ref(null)\r\n\r\n\t/**\r\n\t * Load an object by ID.\r\n\t * @param {string} id Object ID\r\n\t * @return {Promise<object|null>}\r\n\t */\r\n\tasync function load(id) {\r\n\t\tloading.value = true\r\n\t\terror.value = null\r\n\t\ttry {\r\n\t\t\tconst result = await options.fetchFn(options.objectType, id)\r\n\t\t\tif (result) {\r\n\t\t\t\tobjectData.value = { ...result }\r\n\t\t\t}\r\n\t\t\treturn result\r\n\t\t} catch (err) {\r\n\t\t\terror.value = err.message || 'Failed to load'\r\n\t\t\treturn null\r\n\t\t} finally {\r\n\t\t\tloading.value = false\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Save the current object data (create or update).\r\n\t * @param {object} [formData] Optional form data override (defaults to objectData)\r\n\t * @return {Promise<object|null>}\r\n\t */\r\n\tasync function save(formData) {\r\n\t\tsaving.value = true\r\n\t\terror.value = null\r\n\t\ttry {\r\n\t\t\tconst data = formData || objectData.value\r\n\t\t\tconst result = await options.saveFn(options.objectType, data)\r\n\t\t\tif (result) {\r\n\t\t\t\tobjectData.value = { ...result }\r\n\t\t\t\tediting.value = false\r\n\t\t\t\tif (options.onSaved) {\r\n\t\t\t\t\toptions.onSaved(result)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result\r\n\t\t} catch (err) {\r\n\t\t\terror.value = err.message || 'Failed to save'\r\n\t\t\treturn null\r\n\t\t} finally {\r\n\t\t\tsaving.value = false\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Show the delete confirmation dialog.\r\n\t */\r\n\tfunction confirmDelete() {\r\n\t\tshowDeleteDialog.value = true\r\n\t}\r\n\r\n\t/**\r\n\t * Execute the delete operation.\r\n\t * @param {string} [id] Object ID (defaults to objectData.id)\r\n\t * @return {Promise<boolean>}\r\n\t */\r\n\tasync function executeDelete(id) {\r\n\t\tconst deleteId = id || objectData.value.id\r\n\t\tloading.value = true\r\n\t\terror.value = null\r\n\t\ttry {\r\n\t\t\tconst success = await options.deleteFn(options.objectType, deleteId)\r\n\t\t\tif (success) {\r\n\t\t\t\tshowDeleteDialog.value = false\r\n\t\t\t\tif (options.onDeleted) {\r\n\t\t\t\t\toptions.onDeleted()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn success\r\n\t\t} catch (err) {\r\n\t\t\terror.value = err.message || 'Failed to delete'\r\n\t\t\treturn false\r\n\t\t} finally {\r\n\t\t\tloading.value = false\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tobjectData,\r\n\t\tediting,\r\n\t\tloading,\r\n\t\tsaving,\r\n\t\tshowDeleteDialog,\r\n\t\terror,\r\n\t\tload,\r\n\t\tsave,\r\n\t\tconfirmDelete,\r\n\t\texecuteDelete,\r\n\t}\r\n}\r\n","import { ref, reactive } from 'vue'\r\nimport { buildHeaders, buildQueryString } from '../utils/headers.js'\r\nimport { parseResponseError, networkError } from '../utils/errors.js'\r\n\r\n/**\r\n * Standalone composable for fetching sub-resources outside the Pinia store.\r\n *\r\n * Use this for app-specific sub-resources that don't follow the standard\r\n * OpenRegister pattern or don't need shared state (e.g. CalDAV tasks,\r\n * ICommentsManager notes). State is scoped to the component lifecycle.\r\n *\r\n * For sub-resources that need shared state across components, use store\r\n * plugins (filesPlugin, auditTrailsPlugin, etc.) instead.\r\n *\r\n * @param {object} store The object store instance (must have objectTypeRegistry and _options)\r\n * @param {string} endpoint URL path segment appended to the object URL (e.g. 'tasks')\r\n * @param {object} [options={}] Composable options\r\n * @param {Function} [options.transform] Transform function applied to each result item\r\n * @param {number} [options.limit=20] Default page size\r\n * @return {object} Reactive state and methods\r\n *\r\n * @example\r\n * // Basic usage\r\n * const tasks = useSubResource(store, 'tasks')\r\n * await tasks.fetch('case', caseId)\r\n * console.log(tasks.data.results)\r\n *\r\n * @example\r\n * // With transform function (e.g. CalDAV task normalization)\r\n * const tasks = useSubResource(store, 'tasks', {\r\n * transform: (task) => ({\r\n * id: task.uid || task.id,\r\n * title: task.summary,\r\n * deadline: task.due,\r\n * status: task.status,\r\n * }),\r\n * })\r\n */\r\nexport function useSubResource(store, endpoint, options = {}) {\r\n\tconst limit = options.limit || 20\r\n\tconst transform = options.transform || null\r\n\r\n\tconst data = reactive({\r\n\t\tresults: [],\r\n\t\ttotal: 0,\r\n\t\tpage: 1,\r\n\t\tpages: 0,\r\n\t\tlimit,\r\n\t\toffset: 0,\r\n\t})\r\n\tconst loading = ref(false)\r\n\tconst error = ref(null)\r\n\r\n\t/**\r\n\t * Build the sub-resource URL for a given object type and ID.\r\n\t *\r\n\t * @param {string} type The registered object type slug\r\n\t * @param {string} objectId The parent object ID\r\n\t * @return {string} Full URL path\r\n\t */\r\n\tfunction buildUrl(type, objectId) {\r\n\t\tconst config = store.objectTypeRegistry[type]\r\n\t\tif (!config) {\r\n\t\t\tthrow new Error(`Object type \"${type}\" is not registered in the store.`)\r\n\t\t}\r\n\t\treturn `${store._options.baseUrl}/${config.register}/${config.schema}/${objectId}/${endpoint}`\r\n\t}\r\n\r\n\t/**\r\n\t * Fetch the sub-resource collection for an object.\r\n\t *\r\n\t * @param {string} type The registered object type slug\r\n\t * @param {string} objectId The parent object ID\r\n\t * @param {object} [params={}] Query parameters (_search, _limit, _page)\r\n\t * @return {Promise<Array>} The fetched results\r\n\t */\r\n\tasync function fetchData(type, objectId, params = {}) {\r\n\t\tloading.value = true\r\n\t\terror.value = null\r\n\r\n\t\ttry {\r\n\t\t\tconst url = buildUrl(type, objectId) + buildQueryString(params)\r\n\r\n\t\t\tconst response = await fetch(url, {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\theaders: buildHeaders(),\r\n\t\t\t})\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\terror.value = await parseResponseError(response, endpoint)\r\n\t\t\t\tconsole.error(`Error fetching ${endpoint} for ${type}/${objectId}:`, error.value)\r\n\t\t\t\treturn []\r\n\t\t\t}\r\n\r\n\t\t\tconst responseData = await response.json()\r\n\t\t\tlet results = responseData.results || responseData\r\n\r\n\t\t\tif (Array.isArray(results) && transform) {\r\n\t\t\t\tresults = results.map(transform)\r\n\t\t\t}\r\n\r\n\t\t\tdata.results = results\r\n\t\t\tdata.total = responseData.total || results.length\r\n\t\t\tdata.page = responseData.page || 1\r\n\t\t\tdata.pages = responseData.pages || 0\r\n\t\t\tdata.limit = params._limit || limit\r\n\t\t\tdata.offset = responseData.offset || 0\r\n\r\n\t\t\treturn data.results\r\n\t\t} catch (err) {\r\n\t\t\terror.value = err.name === 'TypeError'\r\n\t\t\t\t? networkError(err)\r\n\t\t\t\t: { status: null, message: err.message, details: null, isValidation: false, fields: null, toString() { return this.message } }\r\n\t\t\tconsole.error(`Error fetching ${endpoint} for ${type}/${objectId}:`, err)\r\n\t\t\treturn []\r\n\t\t} finally {\r\n\t\t\tloading.value = false\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Clear all state back to defaults.\r\n\t */\r\n\tfunction clear() {\r\n\t\tdata.results = []\r\n\t\tdata.total = 0\r\n\t\tdata.page = 1\r\n\t\tdata.pages = 0\r\n\t\tdata.limit = limit\r\n\t\tdata.offset = 0\r\n\t\tloading.value = false\r\n\t\terror.value = null\r\n\t}\r\n\r\n\treturn {\r\n\t\tdata,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tfetch: fetchData,\r\n\t\tclear,\r\n\t}\r\n}\r\n"],"names":["__vue_script__","script","CnStatusBadge","NcLoadingIcon","NcCheckboxRadioSwitch","CnCellRenderer","NcTextField","NcSelect","NcButton","NcSettingsSection","CnSettingsSection","NcEmptyContent","CnObjectCard","NcActions","NcActionButton","CnIcon","NcActionSeparator","NcDialog","NcNoteCard","ExportIcon","ImportIcon","CnPageHeader","CnActionsBar","CnDataTable","CnCardGrid","CnPagination","CnRowActions","CnMassDeleteDialog","CnMassCopyDialog","CnMassExportDialog","CnMassImportDialog","CnDeleteDialog","CnCopyDialog","CnFormDialog","NcAppSidebar","NcAppSidebarTab","NcPopover","capitalize","defineStore","ref","onBeforeUnmount","reactive"],"mappings":"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","x_google_ignoreList":[2]}
|