@conduction/nextcloud-vue 0.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/nextcloud-vue.cjs.js +10710 -0
  2. package/dist/nextcloud-vue.cjs.js.map +1 -0
  3. package/dist/nextcloud-vue.css +803 -0
  4. package/dist/nextcloud-vue.esm.js +10665 -0
  5. package/dist/nextcloud-vue.esm.js.map +1 -0
  6. package/package.json +63 -0
  7. package/src/components/CnCardGrid/CnCardGrid.vue +152 -0
  8. package/src/components/CnCardGrid/index.js +1 -0
  9. package/src/components/CnCellRenderer/CnCellRenderer.vue +132 -0
  10. package/src/components/CnCellRenderer/index.js +1 -0
  11. package/src/components/CnConfigurationCard/CnConfigurationCard.vue +77 -0
  12. package/src/components/CnConfigurationCard/index.js +1 -0
  13. package/src/components/CnDataTable/CnDataTable.vue +354 -0
  14. package/src/components/CnDataTable/index.js +1 -0
  15. package/src/components/CnDetailViewLayout/CnDetailViewLayout.vue +88 -0
  16. package/src/components/CnDetailViewLayout/index.js +1 -0
  17. package/src/components/CnEmptyState/CnEmptyState.vue +78 -0
  18. package/src/components/CnEmptyState/index.js +1 -0
  19. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +223 -0
  20. package/src/components/CnFacetSidebar/index.js +1 -0
  21. package/src/components/CnFilterBar/CnFilterBar.vue +152 -0
  22. package/src/components/CnFilterBar/index.js +1 -0
  23. package/src/components/CnIndexPage/CnIndexPage.vue +682 -0
  24. package/src/components/CnIndexPage/index.js +1 -0
  25. package/src/components/CnKpiGrid/CnKpiGrid.vue +89 -0
  26. package/src/components/CnKpiGrid/index.js +1 -0
  27. package/src/components/CnListViewLayout/CnListViewLayout.vue +80 -0
  28. package/src/components/CnListViewLayout/index.js +1 -0
  29. package/src/components/CnMassActionBar/CnMassActionBar.vue +160 -0
  30. package/src/components/CnMassActionBar/index.js +1 -0
  31. package/src/components/CnMassCopyDialog/CnMassCopyDialog.vue +320 -0
  32. package/src/components/CnMassCopyDialog/index.js +1 -0
  33. package/src/components/CnMassDeleteDialog/CnMassDeleteDialog.vue +238 -0
  34. package/src/components/CnMassDeleteDialog/index.js +1 -0
  35. package/src/components/CnMassExportDialog/CnMassExportDialog.vue +190 -0
  36. package/src/components/CnMassExportDialog/index.js +1 -0
  37. package/src/components/CnMassImportDialog/CnMassImportDialog.vue +491 -0
  38. package/src/components/CnMassImportDialog/index.js +1 -0
  39. package/src/components/CnObjectCard/CnObjectCard.vue +292 -0
  40. package/src/components/CnObjectCard/index.js +1 -0
  41. package/src/components/CnPagination/CnPagination.vue +252 -0
  42. package/src/components/CnPagination/index.js +1 -0
  43. package/src/components/CnRowActions/CnRowActions.vue +73 -0
  44. package/src/components/CnRowActions/index.js +1 -0
  45. package/src/components/CnSettingsCard/CnSettingsCard.vue +92 -0
  46. package/src/components/CnSettingsCard/index.js +1 -0
  47. package/src/components/CnSettingsSection/CnSettingsSection.vue +266 -0
  48. package/src/components/CnSettingsSection/index.js +1 -0
  49. package/src/components/CnStatsBlock/CnStatsBlock.vue +366 -0
  50. package/src/components/CnStatsBlock/index.js +1 -0
  51. package/src/components/CnStatusBadge/CnStatusBadge.vue +77 -0
  52. package/src/components/CnStatusBadge/index.js +1 -0
  53. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +312 -0
  54. package/src/components/CnVersionInfoCard/index.js +1 -0
  55. package/src/components/CnViewModeToggle/CnViewModeToggle.vue +77 -0
  56. package/src/components/CnViewModeToggle/index.js +1 -0
  57. package/src/components/index.js +25 -0
  58. package/src/composables/index.js +3 -0
  59. package/src/composables/useDetailView.js +132 -0
  60. package/src/composables/useListView.js +153 -0
  61. package/src/composables/useSubResource.js +142 -0
  62. package/src/css/badge.css +51 -0
  63. package/src/css/card.css +128 -0
  64. package/src/css/detail.css +68 -0
  65. package/src/css/index.css +8 -0
  66. package/src/css/layout.css +90 -0
  67. package/src/css/pagination.css +72 -0
  68. package/src/css/table.css +143 -0
  69. package/src/css/utilities.css +46 -0
  70. package/src/index.js +50 -0
  71. package/src/store/createSubResourcePlugin.js +135 -0
  72. package/src/store/index.js +3 -0
  73. package/src/store/plugins/auditTrails.js +17 -0
  74. package/src/store/plugins/files.js +186 -0
  75. package/src/store/plugins/index.js +4 -0
  76. package/src/store/plugins/lifecycle.js +180 -0
  77. package/src/store/plugins/relations.js +68 -0
  78. package/src/store/useObjectStore.js +625 -0
  79. package/src/types/auditTrail.d.ts +32 -0
  80. package/src/types/file.d.ts +23 -0
  81. package/src/types/index.d.ts +35 -0
  82. package/src/types/notification.d.ts +36 -0
  83. package/src/types/object.d.ts +40 -0
  84. package/src/types/organisation.d.ts +41 -0
  85. package/src/types/register.d.ts +25 -0
  86. package/src/types/schema.d.ts +39 -0
  87. package/src/types/shared.d.ts +79 -0
  88. package/src/types/source.d.ts +14 -0
  89. package/src/types/task.d.ts +31 -0
  90. package/src/utils/errors.js +96 -0
  91. package/src/utils/headers.js +44 -0
  92. package/src/utils/index.js +3 -0
  93. package/src/utils/schema.js +287 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextcloud-vue.esm.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\">&rarr;</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","ExportIcon","ImportIcon","capitalize"],"mappings":"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","x_google_ignoreList":[2]}