@conduction/nextcloud-vue 2.106.0 → 2.107.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/CnActionDialog/CnActionDialog.vue.js +9 -0
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js.map +1 -0
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js +338 -0
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -0
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +249 -0
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -0
- package/dist/esm/components/CnAdvancedFormDialog/CnPropertiesTab.vue2.js +2 -2
- package/dist/esm/components/CnAdvancedFormDialog/CnPropertiesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +145 -138
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +102 -2
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +83 -6
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +4 -2
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIcon/semanticIcons.js +2 -2
- package/dist/esm/components/CnIcon/semanticIcons.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +389 -20
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +68 -35
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js +22 -2
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +69 -5
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +38 -5
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnMapWidget/CnMapWidget.vue.js +1 -1
- package/dist/esm/components/CnMapWidget/CnMapWidget.vue2.js +7 -1
- package/dist/esm/components/CnMapWidget/CnMapWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnMapWidget/CnMapWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue.js +8 -0
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue.js.map +1 -0
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue2.js +297 -0
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue2.js.map +1 -0
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue3.js +24 -0
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue3.js.map +1 -0
- package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue.js +9 -0
- package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue.js.map +1 -0
- package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue2.js +95 -0
- package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue2.js.map +1 -0
- package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue3.js +123 -0
- package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue3.js.map +1 -0
- package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue.js +1 -1
- package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue2.js +13 -5
- package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue3.js +3 -1
- package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue.js +1 -1
- package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue2.js +49 -23
- package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue2.js.map +1 -1
- package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue3.js +74 -27
- package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue.js +0 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +18 -413
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js +27 -214
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue.js +9 -0
- package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue.js.map +1 -0
- package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue2.js +190 -0
- package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue2.js.map +1 -0
- package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue3.js +270 -0
- package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue3.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +56 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +56 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/mixins/savedViewsList.js +235 -0
- package/dist/esm/mixins/savedViewsList.js.map +1 -0
- package/dist/esm/nextcloud-vue.css +348 -108
- package/dist/esm/utils/actionsDispatcher.js +2 -2
- package/dist/esm/utils/actionsDispatcher.js.map +1 -1
- package/dist/esm/utils/builtInModals.js +39 -0
- package/dist/esm/utils/builtInModals.js.map +1 -0
- package/dist/esm/utils/mapMarkerColor.js +121 -0
- package/dist/esm/utils/mapMarkerColor.js.map +1 -0
- package/dist/esm/utils/mergeManifestDelta.js +4 -0
- package/dist/esm/utils/mergeManifestDelta.js.map +1 -1
- package/dist/esm/utils/savedViewHelpers.js +59 -7
- package/dist/esm/utils/savedViewHelpers.js.map +1 -1
- package/dist/esm/utils/savedViewMenu.js +154 -0
- package/dist/esm/utils/savedViewMenu.js.map +1 -0
- package/dist/esm/utils/searchGroupSharees.js +50 -15
- package/dist/esm/utils/searchGroupSharees.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 +13351 -10855
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +348 -108
- package/l10n/en.json +56 -1
- package/l10n/nl.json +56 -1
- package/package.json +1 -1
- package/src/components/CnActionDialog/CnActionDialog.vue +545 -0
- package/src/components/CnActionDialog/index.js +12 -0
- package/src/components/CnAppNav/CnAppNav.vue +17 -0
- package/src/components/CnAppRoot/CnAppRoot.vue +102 -2
- package/src/components/CnDashboardPage/CnDashboardPage.vue +86 -7
- package/src/components/CnIndexPage/CnIndexPage.vue +409 -23
- package/src/components/CnIndexPage/useSelfFetchList.js +21 -1
- package/src/components/CnIndexSidebar/CnIndexSidebar.md +2 -0
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +91 -1
- package/src/components/CnMapWidget/CnMapWidget.vue +16 -1
- package/src/components/CnPartyPicker/CnPartyPicker.vue +317 -0
- package/src/components/CnPartyPicker/index.js +11 -0
- package/src/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue +192 -0
- package/src/components/CnSavedViewEditDialog/index.js +11 -0
- package/src/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue +21 -6
- package/src/components/CnSavedViewShareFields/CnSavedViewShareFields.vue +130 -37
- package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +36 -599
- package/src/components/CnSavedViewsPanel/CnSavedViewsPanel.vue +459 -0
- package/src/components/CnSavedViewsPanel/index.js +11 -0
- package/src/components/index.js +4 -0
- package/src/css/index-page.css +16 -0
- package/src/css/look-board-index.css +5 -3
- package/src/css/look-board.css +18 -3
- package/src/index.js +4 -0
- package/src/mixins/savedViewsList.js +231 -0
- package/src/schemas/app-manifest-v2.schema.json +98 -3
- package/src/utils/actionsDispatcher.js +2 -2
- package/src/utils/builtInModals.js +35 -0
- package/src/utils/mapMarkerColor.js +117 -0
- package/src/utils/mergeManifestDelta.js +4 -0
- package/src/utils/savedViewHelpers.js +58 -6
- package/src/utils/savedViewMenu.js +150 -0
- package/src/utils/searchGroupSharees.js +49 -14
- package/src/utils/validateManifestV2.compiled.js +3 -3
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { translate } from '@nextcloud/l10n';
|
|
2
|
-
import { NcCheckboxRadioSwitch, NcSelect } from '@nextcloud/vue';
|
|
3
|
-
import
|
|
2
|
+
import { NcButton, NcCheckboxRadioSwitch, NcSelect } from '@nextcloud/vue';
|
|
3
|
+
import Close from 'vue-material-design-icons/Close.vue';
|
|
4
|
+
import { searchUserAndGroupSharees } from '../../utils/searchGroupSharees.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
|
-
* CnSavedViewShareFields — the sharing section of a saved view: pick
|
|
7
|
-
* from Nextcloud's sharee API
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* CnSavedViewShareFields — the sharing section of a saved view: pick people
|
|
8
|
+
* and groups from Nextcloud's sharee API, within the instance's own sharing
|
|
9
|
+
* settings, and choose per entry whether it may only read the view or also
|
|
10
|
+
* edit it. Used by `CnSaveViewDialog` and the share dialog of `CnIndexPage`.
|
|
11
|
+
* Renders nothing when the sharee API answers nobody (sharing off, or nobody
|
|
12
|
+
* the user may share with). A group is keyed by its id, a user by `user:<uid>`.
|
|
11
13
|
*
|
|
12
14
|
* Example:
|
|
13
15
|
* ```vue
|
|
@@ -17,13 +19,14 @@ import { searchGroupSharees } from '../../utils/searchGroupSharees.js';
|
|
|
17
19
|
var script = {
|
|
18
20
|
name: 'CnSavedViewShareFields',
|
|
19
21
|
|
|
20
|
-
components: { NcCheckboxRadioSwitch, NcSelect },
|
|
22
|
+
components: { Close, NcButton, NcCheckboxRadioSwitch, NcSelect },
|
|
21
23
|
|
|
22
24
|
props: {
|
|
23
25
|
/**
|
|
24
|
-
* The chosen audience, `[{ group, mode }]`
|
|
26
|
+
* The chosen audience, `[{ group, mode }]` and `[{ user, mode }]` with
|
|
27
|
+
* `mode` `read` or `write`.
|
|
25
28
|
*
|
|
26
|
-
* @type {Array<{group
|
|
29
|
+
* @type {Array<{group?: string, user?: string, mode: 'read'|'write'}>}
|
|
27
30
|
*/
|
|
28
31
|
modelValue: {
|
|
29
32
|
type: Array,
|
|
@@ -44,14 +47,14 @@ var script = {
|
|
|
44
47
|
options: [],
|
|
45
48
|
known: {},
|
|
46
49
|
loading: false,
|
|
47
|
-
/** False until the first search came back with at least one
|
|
50
|
+
/** False until the first search came back with at least one sharee. */
|
|
48
51
|
available: false,
|
|
49
52
|
}
|
|
50
53
|
},
|
|
51
54
|
|
|
52
55
|
computed: {
|
|
53
56
|
selectedOptions() {
|
|
54
|
-
return this.modelValue.map((e) => ({ id: e
|
|
57
|
+
return this.modelValue.map((e) => ({ id: this.keyOf(e), label: this.labelOf(this.keyOf(e)) }))
|
|
55
58
|
},
|
|
56
59
|
},
|
|
57
60
|
|
|
@@ -66,17 +69,28 @@ var script = {
|
|
|
66
69
|
methods: {
|
|
67
70
|
t: translate,
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
/**
|
|
73
|
+
* The key an audience entry or option goes by: the group id, or `user:<uid>`.
|
|
74
|
+
*
|
|
75
|
+
* @param {{group?: string, user?: string}} entry The entry.
|
|
76
|
+
* @return {string}
|
|
77
|
+
* @spec openspec/changes/saved-views-manage-and-defaults/tasks.md#task-5
|
|
78
|
+
*/
|
|
79
|
+
keyOf(entry) {
|
|
80
|
+
return typeof entry.user === 'string' && entry.user !== '' ? `user:${entry.user}` : entry.group
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
labelOf(key) {
|
|
84
|
+
return this.known[key] || (key.startsWith('user:') ? key.slice(5) : key)
|
|
71
85
|
},
|
|
72
86
|
|
|
73
87
|
async onSearch(query) {
|
|
74
88
|
this.loading = true;
|
|
75
|
-
const found = await
|
|
89
|
+
const found = await searchUserAndGroupSharees(query || '');
|
|
76
90
|
this.loading = false;
|
|
77
|
-
this.options = found;
|
|
78
|
-
|
|
79
|
-
this.known = { ...this.known, [
|
|
91
|
+
this.options = found.map((s) => ({ id: s.kind === 'user' ? `user:${s.id}` : s.id, label: s.label }));
|
|
92
|
+
this.options.forEach((o) => {
|
|
93
|
+
this.known = { ...this.known, [o.id]: o.label };
|
|
80
94
|
});
|
|
81
95
|
if (found.length > 0) {
|
|
82
96
|
this.available = true;
|
|
@@ -86,15 +100,27 @@ var script = {
|
|
|
86
100
|
onGroups(list) {
|
|
87
101
|
const groups = Array.isArray(list) ? list : [];
|
|
88
102
|
const next = groups.map((g) => {
|
|
89
|
-
const existing = this.modelValue.find((e) => e
|
|
90
|
-
|
|
103
|
+
const existing = this.modelValue.find((e) => this.keyOf(e) === g.id);
|
|
104
|
+
if (existing) {
|
|
105
|
+
return existing
|
|
106
|
+
}
|
|
107
|
+
return g.id.startsWith('user:') ? { user: g.id.slice(5), mode: 'read' } : { group: g.id, mode: 'read' }
|
|
91
108
|
});
|
|
92
|
-
/** @event update:modelValue The audience, `[{ group, mode }]`; `[]` when
|
|
109
|
+
/** @event update:modelValue The audience, `[{ group, mode }]` and `[{ user, mode }]`; `[]` when nobody is picked. */
|
|
93
110
|
this.$emit('update:modelValue', next);
|
|
94
111
|
},
|
|
95
112
|
|
|
96
|
-
|
|
97
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Stop sharing with one person or group.
|
|
115
|
+
*
|
|
116
|
+
* @param {string} key The entry's key.
|
|
117
|
+
*/
|
|
118
|
+
onRemove(key) {
|
|
119
|
+
this.$emit('update:modelValue', this.modelValue.filter((e) => this.keyOf(e) !== key));
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
onMode(key, mode) {
|
|
123
|
+
this.$emit('update:modelValue', this.modelValue.map((e) => (this.keyOf(e) === key ? { ...e, mode } : e)));
|
|
98
124
|
},
|
|
99
125
|
},
|
|
100
126
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnSavedViewShareFields.vue2.js","sources":["../../../../src/components/CnSavedViewShareFields/CnSavedViewShareFields.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div v-if=\"available\" class=\"cn-saved-view-share\" data-testid=\"cn-saved-view-share\">\n\t\t<NcSelect\n\t\t\t:inputLabel=\"t('nextcloud-vue', 'Share with groups')\"\n\t\t\t:modelValue=\"selectedOptions\"\n\t\t\t:options=\"options\"\n\t\t\t:multiple=\"true\"\n\t\t\t:loading=\"loading\"\n\t\t\t:filterable=\"false\"\n\t\t\t:disabled=\"disabled\"\n\t\t\tlabel=\"label\"\n\t\t\tdata-testid=\"cn-saved-view-share-groups\"\n\t\t\t@search=\"onSearch\"\n\t\t\t@update:modelValue=\"onGroups\" />\n\t\t<ul v-if=\"modelValue.length > 0\" class=\"cn-saved-view-share__modes\">\n\t\t\t<li v-for=\"entry in modelValue\" :key=\"entry.group\" class=\"cn-saved-view-share__mode\">\n\t\t\t\t<span class=\"cn-saved-view-share__group\">{{ labelOf(entry.group) }}</span>\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t:modelValue=\"entry.mode === 'write'\"\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t:data-testid=\"`cn-saved-view-share-mode-${entry.group}`\"\n\t\t\t\t\t@update:modelValue=\"(on) => onMode(entry.group, on ? 'write' : 'read')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'May edit') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcCheckboxRadioSwitch, NcSelect } from '@nextcloud/vue'\nimport { searchGroupSharees } from '../../utils/searchGroupSharees.js'\n\n/**\n * CnSavedViewShareFields — the sharing section of a saved view: pick groups\n * from Nextcloud's sharee API and choose, per group, whether members may only\n * read the view or also edit it. Used by `CnSaveViewDialog` and the share\n * dialog of `CnIndexPage`. Renders nothing when the sharee API answers no\n * groups (sharing off, or no group the user may share with).\n *\n * Example:\n * ```vue\n * <CnSavedViewShareFields v-model=\"sharedWith\" />\n * ```\n */\nexport default {\n\tname: 'CnSavedViewShareFields',\n\n\tcomponents: { NcCheckboxRadioSwitch, NcSelect },\n\n\tprops: {\n\t\t/**\n\t\t * The chosen audience, `[{ group, mode }]` with `mode` `read` or `write`.\n\t\t *\n\t\t * @type {Array<{group: string, mode: 'read'|'write'}>}\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Disable the fields. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['update:modelValue'],\n\n\tdata() {\n\t\treturn {\n\t\t\toptions: [],\n\t\t\tknown: {},\n\t\t\tloading: false,\n\t\t\t/** False until the first search came back with at least one group. */\n\t\t\tavailable: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tselectedOptions() {\n\t\t\treturn this.modelValue.map((e) => ({ id: e.group, label: this.labelOf(e.group) }))\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.onSearch('')\n\t\t// Groups already on the view keep the section on, even if the search came back empty.\n\t\tif (this.modelValue.length > 0) {\n\t\t\tthis.available = true\n\t\t}\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tlabelOf(group) {\n\t\t\treturn this.known[group] || group\n\t\t},\n\n\t\tasync onSearch(query) {\n\t\t\tthis.loading = true\n\t\t\tconst found = await searchGroupSharees(query || '')\n\t\t\tthis.loading = false\n\t\t\tthis.options = found\n\t\t\tfound.forEach((g) => {\n\t\t\t\tthis.known = { ...this.known, [g.id]: g.label }\n\t\t\t})\n\t\t\tif (found.length > 0) {\n\t\t\t\tthis.available = true\n\t\t\t}\n\t\t},\n\n\t\tonGroups(list) {\n\t\t\tconst groups = Array.isArray(list) ? list : []\n\t\t\tconst next = groups.map((g) => {\n\t\t\t\tconst existing = this.modelValue.find((e) => e.group === g.id)\n\t\t\t\treturn existing || { group: g.id, mode: 'read' }\n\t\t\t})\n\t\t\t/** @event update:modelValue The audience, `[{ group, mode }]`; `[]` when no group is picked. */\n\t\t\tthis.$emit('update:modelValue', next)\n\t\t},\n\n\t\tonMode(group, mode) {\n\t\t\tthis.$emit('update:modelValue', this.modelValue.map((e) => (e.group === group ? { ...e, mode } : e)))\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-saved-view-share__modes {\n\tlist-style: none;\n\tmargin: 8px 0 0;\n\tpadding: 0;\n}\n\n.cn-saved-view-share__mode {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n}\n</style>\n"],"names":["t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnSavedViewShareFields.vue2.js","sources":["../../../../src/components/CnSavedViewShareFields/CnSavedViewShareFields.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div v-if=\"available\" class=\"cn-saved-view-share\" data-testid=\"cn-saved-view-share\">\n\t\t<NcSelect\n\t\t\t:inputLabel=\"t('nextcloud-vue', 'Share with')\"\n\t\t\t:modelValue=\"selectedOptions\"\n\t\t\t:options=\"options\"\n\t\t\t:multiple=\"true\"\n\t\t\t:loading=\"loading\"\n\t\t\t:filterable=\"false\"\n\t\t\t:disabled=\"disabled\"\n\t\t\tlabel=\"label\"\n\t\t\tdata-testid=\"cn-saved-view-share-groups\"\n\t\t\t@search=\"onSearch\"\n\t\t\t@update:modelValue=\"onGroups\" />\n\t\t<p class=\"cn-saved-view-share__hint\">\n\t\t\t{{ t('nextcloud-vue', 'People and groups from your Nextcloud, as when sharing a file.') }}\n\t\t</p>\n\t\t<template v-if=\"modelValue.length > 0\">\n\t\t\t<h4 class=\"cn-saved-view-share__caption\">\n\t\t\t\t{{ t('nextcloud-vue', 'Shared with') }}\n\t\t\t</h4>\n\t\t\t<ul class=\"cn-saved-view-share__modes\">\n\t\t\t\t<li v-for=\"entry in modelValue\" :key=\"keyOf(entry)\" class=\"cn-saved-view-share__mode\">\n\t\t\t\t\t<span class=\"cn-saved-view-share__who\">\n\t\t\t\t\t\t<span class=\"cn-saved-view-share__group\">{{ labelOf(keyOf(entry)) }}</span>\n\t\t\t\t\t\t<span class=\"cn-saved-view-share__kind\">{{ entry.user ? t('nextcloud-vue', 'Person') : t('nextcloud-vue', 'Group') }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"cn-saved-view-share__rights\"\n\t\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Rights of {name}', { name: labelOf(keyOf(entry)) })\"\n\t\t\t\t\t\t:data-testid=\"`cn-saved-view-share-mode-${keyOf(entry)}`\">\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t:name=\"`cn-share-mode-${keyOf(entry)}`\"\n\t\t\t\t\t\t\tvalue=\"read\"\n\t\t\t\t\t\t\t:modelValue=\"entry.mode === 'write' ? 'write' : 'read'\"\n\t\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t\t@update:modelValue=\"onMode(keyOf(entry), 'read')\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'May use') }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t:name=\"`cn-share-mode-${keyOf(entry)}`\"\n\t\t\t\t\t\t\tvalue=\"write\"\n\t\t\t\t\t\t\t:modelValue=\"entry.mode === 'write' ? 'write' : 'read'\"\n\t\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t\t@update:modelValue=\"onMode(keyOf(entry), 'write')\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'May update') }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t</span>\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Stop sharing with {name}', { name: labelOf(keyOf(entry)) })\"\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t:data-testid=\"`cn-saved-view-share-remove-${keyOf(entry)}`\"\n\t\t\t\t\t\t@click=\"onRemove(keyOf(entry))\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<p class=\"cn-saved-view-share__hint\">\n\t\t\t\t{{ t('nextcloud-vue', 'May use: sees the view under Shared with me. May update: can also replace the criteria. Deleting and sharing stay with you.') }}\n\t\t\t</p>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcSelect } from '@nextcloud/vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport { searchUserAndGroupSharees } from '../../utils/searchGroupSharees.js'\n\n/**\n * CnSavedViewShareFields — the sharing section of a saved view: pick people\n * and groups from Nextcloud's sharee API, within the instance's own sharing\n * settings, and choose per entry whether it may only read the view or also\n * edit it. Used by `CnSaveViewDialog` and the share dialog of `CnIndexPage`.\n * Renders nothing when the sharee API answers nobody (sharing off, or nobody\n * the user may share with). A group is keyed by its id, a user by `user:<uid>`.\n *\n * Example:\n * ```vue\n * <CnSavedViewShareFields v-model=\"sharedWith\" />\n * ```\n */\nexport default {\n\tname: 'CnSavedViewShareFields',\n\n\tcomponents: { Close, NcButton, NcCheckboxRadioSwitch, NcSelect },\n\n\tprops: {\n\t\t/**\n\t\t * The chosen audience, `[{ group, mode }]` and `[{ user, mode }]` with\n\t\t * `mode` `read` or `write`.\n\t\t *\n\t\t * @type {Array<{group?: string, user?: string, mode: 'read'|'write'}>}\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Disable the fields. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['update:modelValue'],\n\n\tdata() {\n\t\treturn {\n\t\t\toptions: [],\n\t\t\tknown: {},\n\t\t\tloading: false,\n\t\t\t/** False until the first search came back with at least one sharee. */\n\t\t\tavailable: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tselectedOptions() {\n\t\t\treturn this.modelValue.map((e) => ({ id: this.keyOf(e), label: this.labelOf(this.keyOf(e)) }))\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.onSearch('')\n\t\t// Groups already on the view keep the section on, even if the search came back empty.\n\t\tif (this.modelValue.length > 0) {\n\t\t\tthis.available = true\n\t\t}\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * The key an audience entry or option goes by: the group id, or `user:<uid>`.\n\t\t *\n\t\t * @param {{group?: string, user?: string}} entry The entry.\n\t\t * @return {string}\n\t\t * @spec openspec/changes/saved-views-manage-and-defaults/tasks.md#task-5\n\t\t */\n\t\tkeyOf(entry) {\n\t\t\treturn typeof entry.user === 'string' && entry.user !== '' ? `user:${entry.user}` : entry.group\n\t\t},\n\n\t\tlabelOf(key) {\n\t\t\treturn this.known[key] || (key.startsWith('user:') ? key.slice(5) : key)\n\t\t},\n\n\t\tasync onSearch(query) {\n\t\t\tthis.loading = true\n\t\t\tconst found = await searchUserAndGroupSharees(query || '')\n\t\t\tthis.loading = false\n\t\t\tthis.options = found.map((s) => ({ id: s.kind === 'user' ? `user:${s.id}` : s.id, label: s.label }))\n\t\t\tthis.options.forEach((o) => {\n\t\t\t\tthis.known = { ...this.known, [o.id]: o.label }\n\t\t\t})\n\t\t\tif (found.length > 0) {\n\t\t\t\tthis.available = true\n\t\t\t}\n\t\t},\n\n\t\tonGroups(list) {\n\t\t\tconst groups = Array.isArray(list) ? list : []\n\t\t\tconst next = groups.map((g) => {\n\t\t\t\tconst existing = this.modelValue.find((e) => this.keyOf(e) === g.id)\n\t\t\t\tif (existing) {\n\t\t\t\t\treturn existing\n\t\t\t\t}\n\t\t\t\treturn g.id.startsWith('user:') ? { user: g.id.slice(5), mode: 'read' } : { group: g.id, mode: 'read' }\n\t\t\t})\n\t\t\t/** @event update:modelValue The audience, `[{ group, mode }]` and `[{ user, mode }]`; `[]` when nobody is picked. */\n\t\t\tthis.$emit('update:modelValue', next)\n\t\t},\n\n\t\t/**\n\t\t * Stop sharing with one person or group.\n\t\t *\n\t\t * @param {string} key The entry's key.\n\t\t */\n\t\tonRemove(key) {\n\t\t\tthis.$emit('update:modelValue', this.modelValue.filter((e) => this.keyOf(e) !== key))\n\t\t},\n\n\t\tonMode(key, mode) {\n\t\t\tthis.$emit('update:modelValue', this.modelValue.map((e) => (this.keyOf(e) === key ? { ...e, mode } : e)))\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-saved-view-share__modes {\n\tlist-style: none;\n\tmargin: 8px 0 0;\n\tpadding: 0;\n}\n\n.cn-saved-view-share__mode {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tflex-wrap: wrap;\n\tgap: 8px 12px;\n}\n\n.cn-saved-view-share__who {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 160px;\n\tmin-width: 0;\n}\n\n.cn-saved-view-share__kind,\n.cn-saved-view-share__hint {\n\tmargin: 0;\n\tfont-size: var(--font-size-small, 13px);\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-saved-view-share__rights {\n\tdisplay: flex;\n\tgap: 8px;\n}\n\n.cn-saved-view-share__caption {\n\tmargin: 8px 0 0;\n\tfont-size: var(--default-font-size);\n\tfont-weight: bold;\n}\n</style>\n"],"names":["t"],"mappings":"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"}
|
|
@@ -1,24 +1,29 @@
|
|
|
1
|
-
import { resolveComponent, openBlock, createElementBlock, createVNode,
|
|
1
|
+
import { resolveComponent, openBlock, createElementBlock, createVNode, createElementVNode, toDisplayString, Fragment, renderList, withCtx, createTextVNode, createCommentVNode } from 'vue';
|
|
2
2
|
|
|
3
3
|
const _hoisted_1 = {
|
|
4
4
|
key: 0,
|
|
5
5
|
class: "cn-saved-view-share",
|
|
6
6
|
"data-testid": "cn-saved-view-share"
|
|
7
7
|
};
|
|
8
|
-
const _hoisted_2 = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
const
|
|
8
|
+
const _hoisted_2 = { class: "cn-saved-view-share__hint" };
|
|
9
|
+
const _hoisted_3 = { class: "cn-saved-view-share__caption" };
|
|
10
|
+
const _hoisted_4 = { class: "cn-saved-view-share__modes" };
|
|
11
|
+
const _hoisted_5 = { class: "cn-saved-view-share__who" };
|
|
12
|
+
const _hoisted_6 = { class: "cn-saved-view-share__group" };
|
|
13
|
+
const _hoisted_7 = { class: "cn-saved-view-share__kind" };
|
|
14
|
+
const _hoisted_8 = ["aria-label", "data-testid"];
|
|
15
|
+
const _hoisted_9 = { class: "cn-saved-view-share__hint" };
|
|
13
16
|
|
|
14
17
|
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
15
18
|
const _component_NcSelect = resolveComponent("NcSelect");
|
|
16
19
|
const _component_NcCheckboxRadioSwitch = resolveComponent("NcCheckboxRadioSwitch");
|
|
20
|
+
const _component_Close = resolveComponent("Close");
|
|
21
|
+
const _component_NcButton = resolveComponent("NcButton");
|
|
17
22
|
|
|
18
23
|
return ($data.available)
|
|
19
24
|
? (openBlock(), createElementBlock("div", _hoisted_1, [
|
|
20
25
|
createVNode(_component_NcSelect, {
|
|
21
|
-
inputLabel: $options.t('nextcloud-vue', 'Share with
|
|
26
|
+
inputLabel: $options.t('nextcloud-vue', 'Share with'),
|
|
22
27
|
modelValue: $options.selectedOptions,
|
|
23
28
|
options: $data.options,
|
|
24
29
|
multiple: true,
|
|
@@ -30,28 +35,70 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
30
35
|
onSearch: $options.onSearch,
|
|
31
36
|
"onUpdate:modelValue": $options.onGroups
|
|
32
37
|
}, null, 8 /* PROPS */, ["inputLabel", "modelValue", "options", "loading", "disabled", "onSearch", "onUpdate:modelValue"]),
|
|
38
|
+
createElementVNode("p", _hoisted_2, toDisplayString($options.t('nextcloud-vue', 'People and groups from your Nextcloud, as when sharing a file.')), 1 /* TEXT */),
|
|
33
39
|
($props.modelValue.length > 0)
|
|
34
|
-
? (openBlock(), createElementBlock(
|
|
35
|
-
(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"onUpdate:modelValue": (on) => $options.onMode(entry.group, on ? 'write' : 'read')
|
|
46
|
-
}, {
|
|
47
|
-
default: withCtx(() => [
|
|
48
|
-
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'May edit')), 1 /* TEXT */)
|
|
40
|
+
? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
|
41
|
+
createElementVNode("h4", _hoisted_3, toDisplayString($options.t('nextcloud-vue', 'Shared with')), 1 /* TEXT */),
|
|
42
|
+
createElementVNode("ul", _hoisted_4, [
|
|
43
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($props.modelValue, (entry) => {
|
|
44
|
+
return (openBlock(), createElementBlock("li", {
|
|
45
|
+
key: $options.keyOf(entry),
|
|
46
|
+
class: "cn-saved-view-share__mode"
|
|
47
|
+
}, [
|
|
48
|
+
createElementVNode("span", _hoisted_5, [
|
|
49
|
+
createElementVNode("span", _hoisted_6, toDisplayString($options.labelOf($options.keyOf(entry))), 1 /* TEXT */),
|
|
50
|
+
createElementVNode("span", _hoisted_7, toDisplayString(entry.user ? $options.t('nextcloud-vue', 'Person') : $options.t('nextcloud-vue', 'Group')), 1 /* TEXT */)
|
|
49
51
|
]),
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
createElementVNode("span", {
|
|
53
|
+
class: "cn-saved-view-share__rights",
|
|
54
|
+
role: "radiogroup",
|
|
55
|
+
"aria-label": $options.t('nextcloud-vue', 'Rights of {name}', { name: $options.labelOf($options.keyOf(entry)) }),
|
|
56
|
+
"data-testid": `cn-saved-view-share-mode-${$options.keyOf(entry)}`
|
|
57
|
+
}, [
|
|
58
|
+
createVNode(_component_NcCheckboxRadioSwitch, {
|
|
59
|
+
type: "radio",
|
|
60
|
+
name: `cn-share-mode-${$options.keyOf(entry)}`,
|
|
61
|
+
value: "read",
|
|
62
|
+
modelValue: entry.mode === 'write' ? 'write' : 'read',
|
|
63
|
+
disabled: $props.disabled,
|
|
64
|
+
"onUpdate:modelValue": $event => ($options.onMode($options.keyOf(entry), 'read'))
|
|
65
|
+
}, {
|
|
66
|
+
default: withCtx(() => [
|
|
67
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'May use')), 1 /* TEXT */)
|
|
68
|
+
]),
|
|
69
|
+
_: 1 /* STABLE */
|
|
70
|
+
}, 8 /* PROPS */, ["name", "modelValue", "disabled", "onUpdate:modelValue"]),
|
|
71
|
+
createVNode(_component_NcCheckboxRadioSwitch, {
|
|
72
|
+
type: "radio",
|
|
73
|
+
name: `cn-share-mode-${$options.keyOf(entry)}`,
|
|
74
|
+
value: "write",
|
|
75
|
+
modelValue: entry.mode === 'write' ? 'write' : 'read',
|
|
76
|
+
disabled: $props.disabled,
|
|
77
|
+
"onUpdate:modelValue": $event => ($options.onMode($options.keyOf(entry), 'write'))
|
|
78
|
+
}, {
|
|
79
|
+
default: withCtx(() => [
|
|
80
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'May update')), 1 /* TEXT */)
|
|
81
|
+
]),
|
|
82
|
+
_: 1 /* STABLE */
|
|
83
|
+
}, 8 /* PROPS */, ["name", "modelValue", "disabled", "onUpdate:modelValue"])
|
|
84
|
+
], 8 /* PROPS */, _hoisted_8),
|
|
85
|
+
createVNode(_component_NcButton, {
|
|
86
|
+
variant: "tertiary",
|
|
87
|
+
"aria-label": $options.t('nextcloud-vue', 'Stop sharing with {name}', { name: $options.labelOf($options.keyOf(entry)) }),
|
|
88
|
+
disabled: $props.disabled,
|
|
89
|
+
"data-testid": `cn-saved-view-share-remove-${$options.keyOf(entry)}`,
|
|
90
|
+
onClick: $event => ($options.onRemove($options.keyOf(entry)))
|
|
91
|
+
}, {
|
|
92
|
+
icon: withCtx(() => [
|
|
93
|
+
createVNode(_component_Close, { size: 20 })
|
|
94
|
+
]),
|
|
95
|
+
_: 1 /* STABLE */
|
|
96
|
+
}, 8 /* PROPS */, ["aria-label", "disabled", "data-testid", "onClick"])
|
|
97
|
+
]))
|
|
98
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
99
|
+
]),
|
|
100
|
+
createElementVNode("p", _hoisted_9, toDisplayString($options.t('nextcloud-vue', 'May use: sees the view under Shared with me. May update: can also replace the criteria. Deleting and sharing stay with you.')), 1 /* TEXT */)
|
|
101
|
+
], 64 /* STABLE_FRAGMENT */))
|
|
55
102
|
: createCommentVNode("v-if", true)
|
|
56
103
|
]))
|
|
57
104
|
: createCommentVNode("v-if", true)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnSavedViewShareFields.vue3.js","sources":["../../../../src/components/CnSavedViewShareFields/CnSavedViewShareFields.vue?vue&type=template&id=50093771&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div v-if=\"available\" class=\"cn-saved-view-share\" data-testid=\"cn-saved-view-share\">\n\t\t<NcSelect\n\t\t\t:inputLabel=\"t('nextcloud-vue', 'Share with groups')\"\n\t\t\t:modelValue=\"selectedOptions\"\n\t\t\t:options=\"options\"\n\t\t\t:multiple=\"true\"\n\t\t\t:loading=\"loading\"\n\t\t\t:filterable=\"false\"\n\t\t\t:disabled=\"disabled\"\n\t\t\tlabel=\"label\"\n\t\t\tdata-testid=\"cn-saved-view-share-groups\"\n\t\t\t@search=\"onSearch\"\n\t\t\t@update:modelValue=\"onGroups\" />\n\t\t<ul v-if=\"modelValue.length > 0\" class=\"cn-saved-view-share__modes\">\n\t\t\t<li v-for=\"entry in modelValue\" :key=\"entry.group\" class=\"cn-saved-view-share__mode\">\n\t\t\t\t<span class=\"cn-saved-view-share__group\">{{ labelOf(entry.group) }}</span>\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t:modelValue=\"entry.mode === 'write'\"\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t:data-testid=\"`cn-saved-view-share-mode-${entry.group}`\"\n\t\t\t\t\t@update:modelValue=\"(on) => onMode(entry.group, on ? 'write' : 'read')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'May edit') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcCheckboxRadioSwitch, NcSelect } from '@nextcloud/vue'\nimport { searchGroupSharees } from '../../utils/searchGroupSharees.js'\n\n/**\n * CnSavedViewShareFields — the sharing section of a saved view: pick groups\n * from Nextcloud's sharee API and choose, per group, whether members may only\n * read the view or also edit it. Used by `CnSaveViewDialog` and the share\n * dialog of `CnIndexPage`. Renders nothing when the sharee API answers no\n * groups (sharing off, or no group the user may share with).\n *\n * Example:\n * ```vue\n * <CnSavedViewShareFields v-model=\"sharedWith\" />\n * ```\n */\nexport default {\n\tname: 'CnSavedViewShareFields',\n\n\tcomponents: { NcCheckboxRadioSwitch, NcSelect },\n\n\tprops: {\n\t\t/**\n\t\t * The chosen audience, `[{ group, mode }]` with `mode` `read` or `write`.\n\t\t *\n\t\t * @type {Array<{group: string, mode: 'read'|'write'}>}\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Disable the fields. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['update:modelValue'],\n\n\tdata() {\n\t\treturn {\n\t\t\toptions: [],\n\t\t\tknown: {},\n\t\t\tloading: false,\n\t\t\t/** False until the first search came back with at least one group. */\n\t\t\tavailable: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tselectedOptions() {\n\t\t\treturn this.modelValue.map((e) => ({ id: e.group, label: this.labelOf(e.group) }))\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.onSearch('')\n\t\t// Groups already on the view keep the section on, even if the search came back empty.\n\t\tif (this.modelValue.length > 0) {\n\t\t\tthis.available = true\n\t\t}\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tlabelOf(group) {\n\t\t\treturn this.known[group] || group\n\t\t},\n\n\t\tasync onSearch(query) {\n\t\t\tthis.loading = true\n\t\t\tconst found = await searchGroupSharees(query || '')\n\t\t\tthis.loading = false\n\t\t\tthis.options = found\n\t\t\tfound.forEach((g) => {\n\t\t\t\tthis.known = { ...this.known, [g.id]: g.label }\n\t\t\t})\n\t\t\tif (found.length > 0) {\n\t\t\t\tthis.available = true\n\t\t\t}\n\t\t},\n\n\t\tonGroups(list) {\n\t\t\tconst groups = Array.isArray(list) ? list : []\n\t\t\tconst next = groups.map((g) => {\n\t\t\t\tconst existing = this.modelValue.find((e) => e.group === g.id)\n\t\t\t\treturn existing || { group: g.id, mode: 'read' }\n\t\t\t})\n\t\t\t/** @event update:modelValue The audience, `[{ group, mode }]`; `[]` when no group is picked. */\n\t\t\tthis.$emit('update:modelValue', next)\n\t\t},\n\n\t\tonMode(group, mode) {\n\t\t\tthis.$emit('update:modelValue', this.modelValue.map((e) => (e.group === group ? { ...e, mode } : e)))\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-saved-view-share__modes {\n\tlist-style: none;\n\tmargin: 8px 0 0;\n\tpadding: 0;\n}\n\n.cn-saved-view-share__mode {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createVNode","_toDisplayString"],"mappings":";;;;AASoB,EAAA,KAAA,EAAA,qBAAA;AAAA,EAAA,aAAA,EAAA,qBAAA;;;;AAae,EAAA,KAAK,EAAA,4BAAA;;AAE9B,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,4BAA4B,GAAA;;;;;;UAfhC,KAAQ,CAAA,SAAA;AAAjB,OAAAA,SAAA,EAAA,EAAAC,kBAAA,QAAA;QACAC,WAWsB,CAAA,mBAAA,EAAA;AAVrB,UAAA,UAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,mBAAA,CAAA;AACb,UAAA,UAAU,EAAE,QAAK,CAAA,eAAA;AACjB,UAAA,OAAO,EAAE,KAAO,CAAA,OAAA;AAChB,UAAA,QAAQ,EAAE,IAAC;AACX,UAAA,OAAO,EAAE,KAAO,CAAA,OAAA;AAChB,UAAA,UAAU,EAAE,KAAI;AAChB,UAAA,QAAQ,EAAE,MAAQ,CAAA,QAAA;AACnB,UAAA,KAAK,EAAC,OAAO;AACb,UAAA,aAAW,EAAC,4BAA4B;AACvC,UAAA,QAAM,EAAE,QAAQ,CAAA,QAAA;AAChB,UAAA,qBAAiB,EAAE,QAAE,CAAA,QAAA;;AACb,QAAA,CAAA,MAAA,CAAA,UAAU,CAAC,MAAM,GAAA,CAAA;AAAxB,aAAAF,SAAA,EAAA,EAAAC,kBAAA,OAAA;gCACAA,8CAAkB,MAAC,CAAA,UAAA,EAAA,CAAV,KAAK,KAAA;qCAAdA;kBAAmB,GAAA,EAAA,KAAA,CAAA,KAAA;AAAA,kBAAA,KAAA,EAAA,2BAAA;;qCACoC,kBAAA,EAAAE,eAAA,CAAZ,gBAAO,CAAC,KAAI,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA,YAAA;kBACvDD;oBACC,UAAU,EAAE,KAAK,CAAC,IAAI,KAAA,OAAA;AACtB,oBAAA,QAAQ,EAAE,MAAQ,CAAA,QAAA;oBAClB,aAAC,EAAA,CAAA,yBAAA,EAAA,KAAA,CAAA,KAAA,CAAA,CAAA;oBACD,qBAAA,EAAA,CAAA,EAAA,KAAA,QAAA,CAAA,MAAA,CAAA,KAAA,CAAA,KAAA,EAAA,EAAA,GAAA,OAAA,GAAA,MAAA,CAAA;;qCACD,MAAC;sDAAA,QAAA,CAAA,CAAA,CAAA,eAAA,EAAA,UAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"CnSavedViewShareFields.vue3.js","sources":["../../../../src/components/CnSavedViewShareFields/CnSavedViewShareFields.vue?vue&type=template&id=1ffd06b8&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div v-if=\"available\" class=\"cn-saved-view-share\" data-testid=\"cn-saved-view-share\">\n\t\t<NcSelect\n\t\t\t:inputLabel=\"t('nextcloud-vue', 'Share with')\"\n\t\t\t:modelValue=\"selectedOptions\"\n\t\t\t:options=\"options\"\n\t\t\t:multiple=\"true\"\n\t\t\t:loading=\"loading\"\n\t\t\t:filterable=\"false\"\n\t\t\t:disabled=\"disabled\"\n\t\t\tlabel=\"label\"\n\t\t\tdata-testid=\"cn-saved-view-share-groups\"\n\t\t\t@search=\"onSearch\"\n\t\t\t@update:modelValue=\"onGroups\" />\n\t\t<p class=\"cn-saved-view-share__hint\">\n\t\t\t{{ t('nextcloud-vue', 'People and groups from your Nextcloud, as when sharing a file.') }}\n\t\t</p>\n\t\t<template v-if=\"modelValue.length > 0\">\n\t\t\t<h4 class=\"cn-saved-view-share__caption\">\n\t\t\t\t{{ t('nextcloud-vue', 'Shared with') }}\n\t\t\t</h4>\n\t\t\t<ul class=\"cn-saved-view-share__modes\">\n\t\t\t\t<li v-for=\"entry in modelValue\" :key=\"keyOf(entry)\" class=\"cn-saved-view-share__mode\">\n\t\t\t\t\t<span class=\"cn-saved-view-share__who\">\n\t\t\t\t\t\t<span class=\"cn-saved-view-share__group\">{{ labelOf(keyOf(entry)) }}</span>\n\t\t\t\t\t\t<span class=\"cn-saved-view-share__kind\">{{ entry.user ? t('nextcloud-vue', 'Person') : t('nextcloud-vue', 'Group') }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"cn-saved-view-share__rights\"\n\t\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Rights of {name}', { name: labelOf(keyOf(entry)) })\"\n\t\t\t\t\t\t:data-testid=\"`cn-saved-view-share-mode-${keyOf(entry)}`\">\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t:name=\"`cn-share-mode-${keyOf(entry)}`\"\n\t\t\t\t\t\t\tvalue=\"read\"\n\t\t\t\t\t\t\t:modelValue=\"entry.mode === 'write' ? 'write' : 'read'\"\n\t\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t\t@update:modelValue=\"onMode(keyOf(entry), 'read')\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'May use') }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t:name=\"`cn-share-mode-${keyOf(entry)}`\"\n\t\t\t\t\t\t\tvalue=\"write\"\n\t\t\t\t\t\t\t:modelValue=\"entry.mode === 'write' ? 'write' : 'read'\"\n\t\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t\t@update:modelValue=\"onMode(keyOf(entry), 'write')\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'May update') }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t</span>\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Stop sharing with {name}', { name: labelOf(keyOf(entry)) })\"\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t:data-testid=\"`cn-saved-view-share-remove-${keyOf(entry)}`\"\n\t\t\t\t\t\t@click=\"onRemove(keyOf(entry))\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<p class=\"cn-saved-view-share__hint\">\n\t\t\t\t{{ t('nextcloud-vue', 'May use: sees the view under Shared with me. May update: can also replace the criteria. Deleting and sharing stay with you.') }}\n\t\t\t</p>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcSelect } from '@nextcloud/vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport { searchUserAndGroupSharees } from '../../utils/searchGroupSharees.js'\n\n/**\n * CnSavedViewShareFields — the sharing section of a saved view: pick people\n * and groups from Nextcloud's sharee API, within the instance's own sharing\n * settings, and choose per entry whether it may only read the view or also\n * edit it. Used by `CnSaveViewDialog` and the share dialog of `CnIndexPage`.\n * Renders nothing when the sharee API answers nobody (sharing off, or nobody\n * the user may share with). A group is keyed by its id, a user by `user:<uid>`.\n *\n * Example:\n * ```vue\n * <CnSavedViewShareFields v-model=\"sharedWith\" />\n * ```\n */\nexport default {\n\tname: 'CnSavedViewShareFields',\n\n\tcomponents: { Close, NcButton, NcCheckboxRadioSwitch, NcSelect },\n\n\tprops: {\n\t\t/**\n\t\t * The chosen audience, `[{ group, mode }]` and `[{ user, mode }]` with\n\t\t * `mode` `read` or `write`.\n\t\t *\n\t\t * @type {Array<{group?: string, user?: string, mode: 'read'|'write'}>}\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Disable the fields. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['update:modelValue'],\n\n\tdata() {\n\t\treturn {\n\t\t\toptions: [],\n\t\t\tknown: {},\n\t\t\tloading: false,\n\t\t\t/** False until the first search came back with at least one sharee. */\n\t\t\tavailable: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tselectedOptions() {\n\t\t\treturn this.modelValue.map((e) => ({ id: this.keyOf(e), label: this.labelOf(this.keyOf(e)) }))\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.onSearch('')\n\t\t// Groups already on the view keep the section on, even if the search came back empty.\n\t\tif (this.modelValue.length > 0) {\n\t\t\tthis.available = true\n\t\t}\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * The key an audience entry or option goes by: the group id, or `user:<uid>`.\n\t\t *\n\t\t * @param {{group?: string, user?: string}} entry The entry.\n\t\t * @return {string}\n\t\t * @spec openspec/changes/saved-views-manage-and-defaults/tasks.md#task-5\n\t\t */\n\t\tkeyOf(entry) {\n\t\t\treturn typeof entry.user === 'string' && entry.user !== '' ? `user:${entry.user}` : entry.group\n\t\t},\n\n\t\tlabelOf(key) {\n\t\t\treturn this.known[key] || (key.startsWith('user:') ? key.slice(5) : key)\n\t\t},\n\n\t\tasync onSearch(query) {\n\t\t\tthis.loading = true\n\t\t\tconst found = await searchUserAndGroupSharees(query || '')\n\t\t\tthis.loading = false\n\t\t\tthis.options = found.map((s) => ({ id: s.kind === 'user' ? `user:${s.id}` : s.id, label: s.label }))\n\t\t\tthis.options.forEach((o) => {\n\t\t\t\tthis.known = { ...this.known, [o.id]: o.label }\n\t\t\t})\n\t\t\tif (found.length > 0) {\n\t\t\t\tthis.available = true\n\t\t\t}\n\t\t},\n\n\t\tonGroups(list) {\n\t\t\tconst groups = Array.isArray(list) ? list : []\n\t\t\tconst next = groups.map((g) => {\n\t\t\t\tconst existing = this.modelValue.find((e) => this.keyOf(e) === g.id)\n\t\t\t\tif (existing) {\n\t\t\t\t\treturn existing\n\t\t\t\t}\n\t\t\t\treturn g.id.startsWith('user:') ? { user: g.id.slice(5), mode: 'read' } : { group: g.id, mode: 'read' }\n\t\t\t})\n\t\t\t/** @event update:modelValue The audience, `[{ group, mode }]` and `[{ user, mode }]`; `[]` when nobody is picked. */\n\t\t\tthis.$emit('update:modelValue', next)\n\t\t},\n\n\t\t/**\n\t\t * Stop sharing with one person or group.\n\t\t *\n\t\t * @param {string} key The entry's key.\n\t\t */\n\t\tonRemove(key) {\n\t\t\tthis.$emit('update:modelValue', this.modelValue.filter((e) => this.keyOf(e) !== key))\n\t\t},\n\n\t\tonMode(key, mode) {\n\t\t\tthis.$emit('update:modelValue', this.modelValue.map((e) => (this.keyOf(e) === key ? { ...e, mode } : e)))\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-saved-view-share__modes {\n\tlist-style: none;\n\tmargin: 8px 0 0;\n\tpadding: 0;\n}\n\n.cn-saved-view-share__mode {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tflex-wrap: wrap;\n\tgap: 8px 12px;\n}\n\n.cn-saved-view-share__who {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 160px;\n\tmin-width: 0;\n}\n\n.cn-saved-view-share__kind,\n.cn-saved-view-share__hint {\n\tmargin: 0;\n\tfont-size: var(--font-size-small, 13px);\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-saved-view-share__rights {\n\tdisplay: flex;\n\tgap: 8px;\n}\n\n.cn-saved-view-share__caption {\n\tmargin: 8px 0 0;\n\tfont-size: var(--default-font-size);\n\tfont-weight: bold;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createVNode","_createElementVNode","_toDisplayString","_Fragment","_renderList"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnSavedViewsControl.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CnSavedViewsControl.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|