@conduction/nextcloud-vue 2.147.0 → 2.148.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/CnDetailPage/CnDetailPage.vue2.js +71 -8
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -2
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +6 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +8 -0
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStepper/CnStepper.vue.js +1 -1
- package/dist/esm/components/CnStepper/CnStepper.vue2.js.map +1 -1
- package/dist/esm/components/CnStepper/CnStepper.vue3.js.map +1 -1
- package/dist/esm/dialogs/CnAccessPurposeDialog.vue.js +1 -1
- package/dist/esm/dialogs/CnAccessPurposeDialog.vue2.js +3 -1
- package/dist/esm/dialogs/CnAccessPurposeDialog.vue2.js.map +1 -1
- package/dist/esm/dialogs/CnAccessPurposeDialog.vue3.js +26 -15
- package/dist/esm/dialogs/CnAccessPurposeDialog.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +2 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +2 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +160 -126
- package/dist/esm/utils/builtInFormatters.js +53 -1
- package/dist/esm/utils/builtInFormatters.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +1357 -1217
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +160 -126
- package/l10n/en.json +2 -1
- package/l10n/nl.json +2 -1
- package/package.json +1 -1
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +73 -10
- package/src/components/CnFactsWidget/CnFactsWidget.vue +6 -1
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -1
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +8 -0
- package/src/components/CnStepper/CnStepper.vue +10 -2
- package/src/css/dialog.css +5 -2
- package/src/css/look-board-index.css +14 -0
- package/src/css/look-board.css +3 -0
- package/src/dialogs/CnAccessPurposeDialog.vue +27 -12
- package/src/schemas/app-manifest-v2.schema.json +4 -2
- package/src/utils/builtInFormatters.js +52 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
|
@@ -1704,6 +1704,12 @@ var script = {
|
|
|
1704
1704
|
* browser session. A refusal keeps the record closed. `null` (the
|
|
1705
1705
|
* default) asks nothing.
|
|
1706
1706
|
*
|
|
1707
|
+
* `checkUrl` (GET, `{objectId}` filled in) is asked first: an answer
|
|
1708
|
+
* `{ required: false }` opens the record without the dialog (the app
|
|
1709
|
+
* recorded the purpose itself, as for the case's own handler); any
|
|
1710
|
+
* other answer, or a failure, shows the dialog. An option's `hint`
|
|
1711
|
+
* is a line under it saying what choosing it does besides recording it.
|
|
1712
|
+
*
|
|
1707
1713
|
* @spec openspec/changes/detail-access-purpose/specs/detail-access-purpose/spec.md#requirement-a-detail-page-can-ask-for-a-purpose-before-it-opens
|
|
1708
1714
|
* @type {object|null}
|
|
1709
1715
|
*/
|
|
@@ -2022,6 +2028,10 @@ var script = {
|
|
|
2022
2028
|
accessPurposeGranted: readGrantedPurposes(),
|
|
2023
2029
|
/** Whether the purpose dialog is open; closing it without a purpose keeps the record closed. */
|
|
2024
2030
|
accessPurposeAsking: true,
|
|
2031
|
+
/** Whether `accessPurpose.checkUrl` is being asked for the record in view. */
|
|
2032
|
+
accessPurposeChecking: false,
|
|
2033
|
+
/** The record the check last answered for, so it is asked once per record. */
|
|
2034
|
+
accessPurposeCheckedKey: '',
|
|
2025
2035
|
/** Whether a purpose is being recorded. */
|
|
2026
2036
|
accessPurposeBusy: false,
|
|
2027
2037
|
/** Why the last purpose was refused. */
|
|
@@ -2738,7 +2748,11 @@ var script = {
|
|
|
2738
2748
|
const options = Array.isArray(this.accessPurpose?.options) ? this.accessPurpose.options : [];
|
|
2739
2749
|
return options
|
|
2740
2750
|
.filter((option) => option && typeof option.value === 'string' && option.value !== '')
|
|
2741
|
-
.map((option) => ({
|
|
2751
|
+
.map((option) => ({
|
|
2752
|
+
value: option.value,
|
|
2753
|
+
label: this.cnTranslate(option.label || option.value),
|
|
2754
|
+
...(typeof option.hint === 'string' && option.hint !== '' ? { hint: this.cnTranslate(option.hint) } : {}),
|
|
2755
|
+
}))
|
|
2742
2756
|
},
|
|
2743
2757
|
|
|
2744
2758
|
/**
|
|
@@ -4441,6 +4455,17 @@ var script = {
|
|
|
4441
4455
|
this.accessPurposeError = '';
|
|
4442
4456
|
},
|
|
4443
4457
|
|
|
4458
|
+
/** Once the page knows the record asks a purpose, the app is asked first whether it must (`checkUrl`). */
|
|
4459
|
+
accessPurposeRequired: {
|
|
4460
|
+
handler(required) {
|
|
4461
|
+
if (required && this.contentWithheld) {
|
|
4462
|
+
this.checkAccessPurpose();
|
|
4463
|
+
}
|
|
4464
|
+
},
|
|
4465
|
+
|
|
4466
|
+
immediate: true,
|
|
4467
|
+
},
|
|
4468
|
+
|
|
4444
4469
|
// Deep, like `sidebarTabs` / `sidebarProps` below: the manifest editors
|
|
4445
4470
|
// mutate `page.config.sidebar` IN PLACE, so the reference CnPageRenderer
|
|
4446
4471
|
// forwards never changes. A shallow watcher missed every such edit —
|
|
@@ -4698,6 +4723,50 @@ var script = {
|
|
|
4698
4723
|
* @param {{purpose: string, note: string}} answer The chosen purpose.
|
|
4699
4724
|
* @return {Promise<void>}
|
|
4700
4725
|
*/
|
|
4726
|
+
/**
|
|
4727
|
+
* Ask the app whether the reader must state a purpose for this record
|
|
4728
|
+
* (`accessPurpose.checkUrl`); `{ required: false }` opens it at once.
|
|
4729
|
+
*
|
|
4730
|
+
* @spec openspec/changes/detail-access-purpose/specs/detail-access-purpose/spec.md#requirement-a-detail-page-can-ask-for-a-purpose-before-it-opens
|
|
4731
|
+
* @return {Promise<void>}
|
|
4732
|
+
*/
|
|
4733
|
+
async checkAccessPurpose() {
|
|
4734
|
+
const key = this.accessPurposeKey;
|
|
4735
|
+
const url = String(this.accessPurpose?.checkUrl || '').replace(/\{objectId\}/g, encodeURIComponent(String(this.objectId || '')));
|
|
4736
|
+
if (url === '' || this.accessPurposeCheckedKey === key) {
|
|
4737
|
+
return
|
|
4738
|
+
}
|
|
4739
|
+
this.accessPurposeCheckedKey = key;
|
|
4740
|
+
this.accessPurposeChecking = true;
|
|
4741
|
+
try {
|
|
4742
|
+
const { default: axios } = await import('@nextcloud/axios');
|
|
4743
|
+
const { data } = await axios.get(prefixUrl(url));
|
|
4744
|
+
if (data && data.required === false && this.accessPurposeKey === key) {
|
|
4745
|
+
this.grantAccessPurpose(key);
|
|
4746
|
+
}
|
|
4747
|
+
} catch {
|
|
4748
|
+
// The check is a shortcut: without an answer the reader is asked as before.
|
|
4749
|
+
} finally {
|
|
4750
|
+
this.accessPurposeChecking = false;
|
|
4751
|
+
}
|
|
4752
|
+
},
|
|
4753
|
+
|
|
4754
|
+
/**
|
|
4755
|
+
* Open the record and remember for this browser session that its
|
|
4756
|
+
* purpose is recorded.
|
|
4757
|
+
*
|
|
4758
|
+
* @param {string} key The record's session key.
|
|
4759
|
+
* @return {void}
|
|
4760
|
+
*/
|
|
4761
|
+
grantAccessPurpose(key) {
|
|
4762
|
+
this.accessPurposeGranted = [...new Set([...this.accessPurposeGranted, key])];
|
|
4763
|
+
try {
|
|
4764
|
+
window.sessionStorage.setItem(ACCESS_PURPOSE_SESSION_KEY, JSON.stringify(this.accessPurposeGranted));
|
|
4765
|
+
} catch {
|
|
4766
|
+
// Without session storage the purpose is asked again on the next visit.
|
|
4767
|
+
}
|
|
4768
|
+
},
|
|
4769
|
+
|
|
4701
4770
|
async recordAccessPurpose(answer) {
|
|
4702
4771
|
const url = String(this.accessPurpose?.url || '').replace(/\{objectId\}/g, encodeURIComponent(String(this.objectId || '')));
|
|
4703
4772
|
if (url === '') {
|
|
@@ -4709,13 +4778,7 @@ var script = {
|
|
|
4709
4778
|
try {
|
|
4710
4779
|
const { default: axios } = await import('@nextcloud/axios');
|
|
4711
4780
|
await axios.post(prefixUrl(url), { purpose: answer.purpose, note: answer.note });
|
|
4712
|
-
|
|
4713
|
-
this.accessPurposeGranted = [...new Set([...this.accessPurposeGranted, key])];
|
|
4714
|
-
try {
|
|
4715
|
-
window.sessionStorage.setItem(ACCESS_PURPOSE_SESSION_KEY, JSON.stringify(this.accessPurposeGranted));
|
|
4716
|
-
} catch {
|
|
4717
|
-
// Without session storage the purpose is asked again on the next visit.
|
|
4718
|
-
}
|
|
4781
|
+
this.grantAccessPurpose(this.accessPurposeKey);
|
|
4719
4782
|
} catch (error) {
|
|
4720
4783
|
const data = error?.response?.data;
|
|
4721
4784
|
this.accessPurposeError = (data && (data.message || data.error)) || translate('nextcloud-vue', 'Your purpose could not be recorded, so the record stays closed.');
|