@conduction/nextcloud-vue 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +169 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +88 -4
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +38 -25
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +21 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +4 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +40 -8
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +40 -15
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +2 -2
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +6 -5
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +3 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue.js +10 -0
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue.js.map +1 -0
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue2.js +316 -0
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue2.js.map +1 -0
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js +105 -0
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js.map +1 -0
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +53 -0
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +22 -5
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/pageTypes.js +1 -0
- package/dist/esm/components/CnPageRenderer/pageTypes.js.map +1 -1
- package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnStorePage/CnStorePage.vue2.js.map +1 -1
- package/dist/esm/components/CnStorePage/CnStorePage.vue3.js.map +1 -1
- package/dist/esm/components/CnWikiPage/CnWikiPage.vue2.js.map +1 -1
- package/dist/esm/components/CnWikiPage/CnWikiPage.vue3.js.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +6 -0
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +6 -0
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +198 -9
- package/dist/esm/utils/headers.js +28 -2
- package/dist/esm/utils/headers.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +9162 -8283
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +198 -9
- package/l10n/en.json +6 -0
- package/l10n/nl.json +6 -0
- package/package.json +3 -2
- package/scripts/.jsdoc-baselines.json +1 -0
- package/scripts/manifest-schema-hash.js +41 -0
- package/scripts/record-manifest-schema-hash.js +52 -0
- package/src/components/CnAppNav/CnAppNav.vue +169 -1
- package/src/components/CnBannerWidget/CnBannerWidget.vue +122 -4
- package/src/components/CnBrandStripe/CnBrandStripe.md +16 -0
- package/src/components/CnBrandStripe/CnBrandStripe.vue +58 -5
- package/src/components/CnDashboardPage/CnDashboardPage.vue +40 -8
- package/src/components/CnDataTable/CnDataTable.md +1 -1
- package/src/components/CnDataTable/CnDataTable.vue +42 -17
- package/src/components/CnDetailPage/CnDetailPage.vue +4 -1
- package/src/components/CnHeaderWidget/CnHeaderWidget.vue +3 -1
- package/src/components/CnLinkCardsPage/CnLinkCardsPage.vue +517 -0
- package/src/components/CnLinkCardsPage/index.js +4 -0
- package/src/components/CnObjectSidebar/CnFilesTab.vue +65 -0
- package/src/components/CnPageRenderer/pageTypes.js +1 -0
- package/src/components/CnReportsPage/CnReportsPage.vue +7 -0
- package/src/components/CnStorePage/CnStorePage.vue +7 -0
- package/src/components/CnWikiPage/CnWikiPage.vue +7 -0
- package/src/components/index.js +1 -0
- package/src/css/detail-page.css +10 -2
- package/src/css/table.css +1 -2
- package/src/index.js +7 -0
- package/src/public/index.js +5 -0
- package/src/schemas/app-manifest-v2.schema.json +45 -3
- package/src/types/manifest.d.ts +1 -1
- package/src/utils/headers.js +28 -2
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers.js","sources":["../../../src/utils/headers.js"],"sourcesContent":["import { generateUrl } from '@nextcloud/router'\n\n/**\n * Prefix an app-absolute URL path the way `generateUrl()` would: the instance\n * webroot, plus `/index.php` unless Nextcloud reports working URL rewriting.\n *\n * On an instance without pretty URLs the bare `/apps/<app>/api/...` form is\n * not routed at all and answers the web server's own 404, which is why every\n * internal API path has to pass through here or through `generateUrl()`.\n *\n * Only the PREFIX comes from `generateUrl()`: the path itself is appended\n * untouched, because `generateUrl()` URL-encodes any `{placeholder}` it cannot\n * fill, and callers pass templates filled later and JSON query values.\n *\n * Idempotent, and inert on anything that is not an app-absolute path, since it\n * is wrapped around hundreds of call sites: an absolute or protocol-relative\n * URL, a scheme (`data:`, `blob:`, `mailto:`), a document-relative path, or a\n * path already carrying the webroot or `/index.php` comes back unchanged.\n * `/ocs/`, `/remote.php` and `/public.php` get the webroot only, as they are\n * never served behind `/index.php`.\n *\n * @param {string} path URL path (e.g. '/apps/openregister/api/objects')\n * @return {string} The path as the instance routes it\n */\nexport function prefixUrl(path) {\n\tif (typeof path !== 'string' || path === '') {\n\t\treturn path\n\t}\n\t// Absolute URL, protocol-relative URL, or any scheme (data:, blob:, mailto:).\n\tif (/^[a-z][a-z0-9+.-]*:/i.test(path) || path.startsWith('//')) {\n\t\treturn path\n\t}\n\t// Only app-absolute paths are ours to prefix.\n\tif (!path.startsWith('/')) {\n\t\treturn path\n\t}\n\t// `generateUrl('/')` is `<webroot>[/index.php]/`; the webroot is that minus `/index.php`.\n\tconst prefix = generateUrl('/', {}).replace(/\\/$/, '')\n\tconst root = prefix.replace(/\\/index\\.php$/, '')\n\tif (path.startsWith('/index.php') || (root && (path === root || path.startsWith(root + '/')))) {\n\t\treturn path\n\t}\n\tif (/^\\/(ocs|remote\\.php|public\\.php)(\\/|$)/.test(path)) {\n\t\treturn root + path\n\t}\n\treturn prefix + path\n}\n\n/**\n * Build standard Nextcloud request headers for API calls.\n *\n * Includes the CSRF request token and OCS API request header\n * required by Nextcloud's API layer.\n *\n * Two call shapes are supported:\n *\n * 1. **Positional (back-compat)** — `buildHeaders(contentType)`.\n * Returns the same object the v1 signature did.\n *\n * 2. **Options object** — `buildHeaders({ contentType?, organisationUuid?, targetLanguage? })`.\n * When `organisationUuid` is a non-empty string the returned object\n * includes `X-OpenRegister-Organisation: <uuid>`. The header is the\n * FE side of the `multi-tenancy-context` capability and is consumed\n * by OR's MultiTenancyTrait.\n * When `targetLanguage` is a non-empty BCP-47 string the returned\n * object includes `X-Translation-Target-Language: <bcp47>`. The\n * header is the FE side of the `i18n-source-of-truth` write\n * contract — OR stamps the value into `_translations[<bcp47>]`\n * instead of overwriting the source row. See the\n * `i18n-language-negotiation-getters` change.\n *\n * @param {string|object} [opts] Content-Type string (back-compat) or options object.\n * @param {string} [opts.contentType] Content-Type header value\n * @param {string} [opts.organisationUuid] Active organisation UUID for the request\n * @param {string} [opts.targetLanguage] BCP-47 target language for translation writes\n * @return {object} Headers object for use with fetch()\n */\nexport function buildHeaders(opts = 'application/json') {\n\tlet contentType = 'application/json'\n\tlet organisationUuid = null\n\tlet targetLanguage = null\n\n\tif (typeof opts === 'string') {\n\t\t// v1 positional signature: buildHeaders(contentType)\n\t\tcontentType = opts\n\t} else if (opts === null) {\n\t\t// v1 positional signature: buildHeaders(null) — explicit \"no Content-Type\"\n\t\tcontentType = null\n\t} else if (opts && typeof opts === 'object') {\n\t\t// Options-object signature\n\t\tif (Object.hasOwn(opts, 'contentType')) {\n\t\t\tcontentType = opts.contentType\n\t\t}\n\t\tif (typeof opts.organisationUuid === 'string' && opts.organisationUuid.length > 0) {\n\t\t\torganisationUuid = opts.organisationUuid\n\t\t}\n\t\tif (typeof opts.targetLanguage === 'string' && opts.targetLanguage.length > 0) {\n\t\t\ttargetLanguage = opts.targetLanguage\n\t\t}\n\t}\n\n\tconst headers = {\n\t\trequesttoken: typeof OC !== 'undefined' ? OC.requestToken : '',\n\t\t'OCS-APIREQUEST': 'true',\n\t}\n\tif (contentType) {\n\t\theaders['Content-Type'] = contentType\n\t}\n\tif (organisationUuid) {\n\t\theaders['X-OpenRegister-Organisation'] = organisationUuid\n\t}\n\tif (targetLanguage) {\n\t\theaders['X-Translation-Target-Language'] = targetLanguage\n\t}\n\treturn headers\n}\n\n/**\n * Capitalize the first letter of a string.\n *\n * @param {string} str Input string\n * @return {string} Capitalized string\n */\nexport function capitalize(str) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1)\n}\n\n/**\n * Build a query string from a params object.\n *\n * Array values are serialized with PHP bracket notation (`key[]=a&key[]=b`)\n * so the Nextcloud/OpenRegister backend parses them as an array — a plain\n * repeated `key=a&key=b` collapses to the last value in PHP. Also handles\n * _order serialization (JSON.stringify for objects) and skips\n * null/undefined/empty values.\n *\n * @param {object} params Key-value pairs for query parameters\n * @return {string} Query string including leading '?' or empty string\n */\nexport function buildQueryString(params = {}) {\n\tconst queryParams = new URLSearchParams()\n\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tif (value === undefined || value === null || value === '') {\n\t\t\tcontinue\n\t\t}\n\t\tif (Array.isArray(value) && value.length === 0) {\n\t\t\tcontinue\n\t\t}\n\t\tif (typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0) {\n\t\t\tcontinue\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\t// PHP needs `key[]` to receive repeated params as an array;\n\t\t\t// without the brackets only the last value survives server-side.\n\t\t\tconst arrayKey = key.endsWith('[]') ? key : `${key}[]`\n\t\t\tfor (const item of value) {\n\t\t\t\tif (item !== undefined && item !== null && item !== '') {\n\t\t\t\t\tqueryParams.append(arrayKey, String(item))\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof value === 'object') {\n\t\t\tqueryParams.set(key, JSON.stringify(value))\n\t\t} else {\n\t\t\tqueryParams.set(key, String(value))\n\t\t}\n\t}\n\n\tconst str = queryParams.toString()\n\treturn str ? '?' + str : ''\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"headers.js","sources":["../../../src/utils/headers.js"],"sourcesContent":["import { generateUrl } from '@nextcloud/router'\n\n/**\n * Prefix an app-absolute URL path the way `generateUrl()` would: the instance\n * webroot, plus `/index.php` unless Nextcloud reports working URL rewriting.\n *\n * On an instance without pretty URLs the bare `/apps/<app>/api/...` form is\n * not routed at all and answers the web server's own 404, which is why every\n * internal API path has to pass through here or through `generateUrl()`.\n *\n * Only the PREFIX comes from `generateUrl()`: the path itself is appended\n * untouched, because `generateUrl()` URL-encodes any `{placeholder}` it cannot\n * fill, and callers pass templates filled later and JSON query values.\n *\n * Idempotent, and inert on anything that is not an app-absolute path, since it\n * is wrapped around hundreds of call sites: an absolute or protocol-relative\n * URL, a scheme (`data:`, `blob:`, `mailto:`), a document-relative path, or a\n * path already carrying the webroot or `/index.php` comes back unchanged.\n * `/ocs/`, `/remote.php` and `/public.php` get the webroot only, as they are\n * never served behind `/index.php`.\n *\n * @param {string} path URL path (e.g. '/apps/openregister/api/objects')\n * @return {string} The path as the instance routes it\n */\nexport function prefixUrl(path) {\n\tif (typeof path !== 'string' || path === '') {\n\t\treturn path\n\t}\n\t// Absolute URL, protocol-relative URL, or any scheme (data:, blob:, mailto:).\n\tif (/^[a-z][a-z0-9+.-]*:/i.test(path) || path.startsWith('//')) {\n\t\treturn path\n\t}\n\t// Only app-absolute paths are ours to prefix.\n\tif (!path.startsWith('/')) {\n\t\treturn path\n\t}\n\t// `generateUrl('/')` is `<webroot>[/index.php]/`; the webroot is that minus `/index.php`.\n\tconst prefix = generateUrl('/', {}).replace(/\\/$/, '')\n\tconst root = prefix.replace(/\\/index\\.php$/, '')\n\tif (path.startsWith('/index.php') || (root && (path === root || path.startsWith(root + '/')))) {\n\t\treturn path\n\t}\n\tif (/^\\/(ocs|remote\\.php|public\\.php)(\\/|$)/.test(path)) {\n\t\treturn root + path\n\t}\n\treturn prefix + path\n}\n\n/**\n * Build standard Nextcloud request headers for API calls.\n *\n * Includes the CSRF request token and OCS API request header\n * required by Nextcloud's API layer.\n *\n * Two call shapes are supported:\n *\n * 1. **Positional (back-compat)** — `buildHeaders(contentType)`.\n * Returns the same object the v1 signature did.\n *\n * 2. **Options object** — `buildHeaders({ contentType?, organisationUuid?, targetLanguage? })`.\n * When `organisationUuid` is a non-empty string the returned object\n * includes `X-OpenRegister-Organisation: <uuid>`. The header is the\n * FE side of the `multi-tenancy-context` capability and is consumed\n * by OR's MultiTenancyTrait.\n * When `targetLanguage` is a non-empty BCP-47 string the returned\n * object includes `X-Translation-Target-Language: <bcp47>`. The\n * header is the FE side of the `i18n-source-of-truth` write\n * contract — OR stamps the value into `_translations[<bcp47>]`\n * instead of overwriting the source row. See the\n * `i18n-language-negotiation-getters` change.\n *\n * @param {string|object} [opts] Content-Type string (back-compat) or options object.\n * @param {string} [opts.contentType] Content-Type header value\n * @param {string} [opts.organisationUuid] Active organisation UUID for the request\n * @param {string} [opts.targetLanguage] BCP-47 target language for translation writes\n * @return {object} Headers object for use with fetch()\n */\nexport function buildHeaders(opts = 'application/json') {\n\tlet contentType = 'application/json'\n\tlet organisationUuid = null\n\tlet targetLanguage = null\n\n\tif (typeof opts === 'string') {\n\t\t// v1 positional signature: buildHeaders(contentType)\n\t\tcontentType = opts\n\t} else if (opts === null) {\n\t\t// v1 positional signature: buildHeaders(null) — explicit \"no Content-Type\"\n\t\tcontentType = null\n\t} else if (opts && typeof opts === 'object') {\n\t\t// Options-object signature\n\t\tif (Object.hasOwn(opts, 'contentType')) {\n\t\t\tcontentType = opts.contentType\n\t\t}\n\t\tif (typeof opts.organisationUuid === 'string' && opts.organisationUuid.length > 0) {\n\t\t\torganisationUuid = opts.organisationUuid\n\t\t}\n\t\tif (typeof opts.targetLanguage === 'string' && opts.targetLanguage.length > 0) {\n\t\t\ttargetLanguage = opts.targetLanguage\n\t\t}\n\t}\n\n\tconst headers = {\n\t\trequesttoken: typeof OC !== 'undefined' ? OC.requestToken : '',\n\t\t'OCS-APIREQUEST': 'true',\n\t}\n\tif (contentType) {\n\t\theaders['Content-Type'] = contentType\n\t}\n\tif (organisationUuid) {\n\t\theaders['X-OpenRegister-Organisation'] = organisationUuid\n\t}\n\tif (targetLanguage) {\n\t\theaders['X-Translation-Target-Language'] = targetLanguage\n\t}\n\treturn headers\n}\n\n/**\n * Capitalize the first letter of a string.\n *\n * @param {string} str Input string\n * @return {string} Capitalized string\n */\nexport function capitalize(str) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1)\n}\n\n/**\n * Build a query string from a params object.\n *\n * Array values are serialized with PHP bracket notation (`key[]=a&key[]=b`)\n * so the Nextcloud/OpenRegister backend parses them as an array — a plain\n * repeated `key=a&key=b` collapses to the last value in PHP. A plain object\n * under a filter key is a set of operators and goes out in bracket form\n * (`{ deadline: { lt: 'x' } }` becomes `deadline[lt]=x`); a key already\n * written that way (`'deadline[lt]'`) passes through unchanged. Reserved keys\n * that start with `_` keep their JSON form (`_order`). Skips\n * null/undefined/empty values.\n *\n * @spec openspec/changes/link-cards-page/specs/link-cards-page/spec.md#requirement-a-filter-operator-is-serialised-in-bracket-form\n *\n * @param {object} params Key-value pairs for query parameters\n * @return {string} Query string including leading '?' or empty string\n */\nexport function buildQueryString(params = {}) {\n\tconst queryParams = new URLSearchParams()\n\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tif (value === undefined || value === null || value === '') {\n\t\t\tcontinue\n\t\t}\n\t\tif (Array.isArray(value) && value.length === 0) {\n\t\t\tcontinue\n\t\t}\n\t\tif (typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0) {\n\t\t\tcontinue\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\t// PHP needs `key[]` to receive repeated params as an array;\n\t\t\t// without the brackets only the last value survives server-side.\n\t\t\tconst arrayKey = key.endsWith('[]') ? key : `${key}[]`\n\t\t\tfor (const item of value) {\n\t\t\t\tif (item !== undefined && item !== null && item !== '') {\n\t\t\t\t\tqueryParams.append(arrayKey, String(item))\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof value === 'object' && !key.startsWith('_')) {\n\t\t\t// A filter operator: `{ deadline: { lt: '2026-10-06' } }` goes out\n\t\t\t// as `deadline[lt]=2026-10-06`, the form OpenRegister reads. As\n\t\t\t// JSON it reached the database as the literal value and a date\n\t\t\t// column answered 500. Reserved `_` keys (`_order`) keep JSON.\n\t\t\tfor (const [op, operand] of Object.entries(value)) {\n\t\t\t\tif (operand === undefined || operand === null || operand === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(operand)) {\n\t\t\t\t\tfor (const item of operand) {\n\t\t\t\t\t\tif (item !== undefined && item !== null && item !== '') {\n\t\t\t\t\t\t\tqueryParams.append(`${key}[${op}][]`, String(item))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof operand === 'object') {\n\t\t\t\t\tqueryParams.set(`${key}[${op}]`, JSON.stringify(operand))\n\t\t\t\t} else {\n\t\t\t\t\tqueryParams.set(`${key}[${op}]`, String(operand))\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof value === 'object') {\n\t\t\tqueryParams.set(key, JSON.stringify(value))\n\t\t} else {\n\t\t\tqueryParams.set(key, String(value))\n\t\t}\n\t}\n\n\tconst str = queryParams.toString()\n\treturn str ? '?' + str : ''\n}\n"],"names":[],"mappings":"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"}
|