@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.
Files changed (135) hide show
  1. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +9 -0
  2. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js.map +1 -0
  3. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js +338 -0
  4. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -0
  5. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +249 -0
  6. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -0
  7. package/dist/esm/components/CnAdvancedFormDialog/CnPropertiesTab.vue2.js +2 -2
  8. package/dist/esm/components/CnAdvancedFormDialog/CnPropertiesTab.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  10. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +145 -138
  11. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  12. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +102 -2
  13. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  14. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  15. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  16. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +83 -6
  17. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  18. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +4 -2
  19. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  20. package/dist/esm/components/CnIcon/semanticIcons.js +2 -2
  21. package/dist/esm/components/CnIcon/semanticIcons.js.map +1 -1
  22. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +389 -20
  23. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  24. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +68 -35
  25. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  26. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +22 -2
  27. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  28. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +69 -5
  29. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  30. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +38 -5
  31. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  32. package/dist/esm/components/CnMapWidget/CnMapWidget.vue.js +1 -1
  33. package/dist/esm/components/CnMapWidget/CnMapWidget.vue2.js +7 -1
  34. package/dist/esm/components/CnMapWidget/CnMapWidget.vue2.js.map +1 -1
  35. package/dist/esm/components/CnMapWidget/CnMapWidget.vue3.js.map +1 -1
  36. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue.js +8 -0
  37. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue.js.map +1 -0
  38. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue2.js +297 -0
  39. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue2.js.map +1 -0
  40. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue3.js +24 -0
  41. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue3.js.map +1 -0
  42. package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue.js +9 -0
  43. package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue.js.map +1 -0
  44. package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue2.js +95 -0
  45. package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue2.js.map +1 -0
  46. package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue3.js +123 -0
  47. package/dist/esm/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue3.js.map +1 -0
  48. package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue.js +1 -1
  49. package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue2.js +13 -5
  50. package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue2.js.map +1 -1
  51. package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue3.js +3 -1
  52. package/dist/esm/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue3.js.map +1 -1
  53. package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue.js +1 -1
  54. package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue2.js +49 -23
  55. package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue2.js.map +1 -1
  56. package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue3.js +74 -27
  57. package/dist/esm/components/CnSavedViewShareFields/CnSavedViewShareFields.vue3.js.map +1 -1
  58. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue.js +0 -1
  59. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue.js.map +1 -1
  60. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +18 -413
  61. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  62. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js +27 -214
  63. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  64. package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue.js +9 -0
  65. package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue.js.map +1 -0
  66. package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue2.js +190 -0
  67. package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue2.js.map +1 -0
  68. package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue3.js +270 -0
  69. package/dist/esm/components/CnSavedViewsPanel/CnSavedViewsPanel.vue3.js.map +1 -0
  70. package/dist/esm/index.js +4 -0
  71. package/dist/esm/index.js.map +1 -1
  72. package/dist/esm/l10n/en.json.js +56 -1
  73. package/dist/esm/l10n/en.json.js.map +1 -1
  74. package/dist/esm/l10n/nl.json.js +56 -1
  75. package/dist/esm/l10n/nl.json.js.map +1 -1
  76. package/dist/esm/library-style.js +1 -1
  77. package/dist/esm/mixins/savedViewsList.js +235 -0
  78. package/dist/esm/mixins/savedViewsList.js.map +1 -0
  79. package/dist/esm/nextcloud-vue.css +348 -108
  80. package/dist/esm/utils/actionsDispatcher.js +2 -2
  81. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  82. package/dist/esm/utils/builtInModals.js +39 -0
  83. package/dist/esm/utils/builtInModals.js.map +1 -0
  84. package/dist/esm/utils/mapMarkerColor.js +121 -0
  85. package/dist/esm/utils/mapMarkerColor.js.map +1 -0
  86. package/dist/esm/utils/mergeManifestDelta.js +4 -0
  87. package/dist/esm/utils/mergeManifestDelta.js.map +1 -1
  88. package/dist/esm/utils/savedViewHelpers.js +59 -7
  89. package/dist/esm/utils/savedViewHelpers.js.map +1 -1
  90. package/dist/esm/utils/savedViewMenu.js +154 -0
  91. package/dist/esm/utils/savedViewMenu.js.map +1 -0
  92. package/dist/esm/utils/searchGroupSharees.js +50 -15
  93. package/dist/esm/utils/searchGroupSharees.js.map +1 -1
  94. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  95. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  96. package/dist/nextcloud-vue.cjs.js +13351 -10855
  97. package/dist/nextcloud-vue.cjs.js.map +2 -2
  98. package/dist/nextcloud-vue.css +348 -108
  99. package/l10n/en.json +56 -1
  100. package/l10n/nl.json +56 -1
  101. package/package.json +1 -1
  102. package/src/components/CnActionDialog/CnActionDialog.vue +545 -0
  103. package/src/components/CnActionDialog/index.js +12 -0
  104. package/src/components/CnAppNav/CnAppNav.vue +17 -0
  105. package/src/components/CnAppRoot/CnAppRoot.vue +102 -2
  106. package/src/components/CnDashboardPage/CnDashboardPage.vue +86 -7
  107. package/src/components/CnIndexPage/CnIndexPage.vue +409 -23
  108. package/src/components/CnIndexPage/useSelfFetchList.js +21 -1
  109. package/src/components/CnIndexSidebar/CnIndexSidebar.md +2 -0
  110. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +91 -1
  111. package/src/components/CnMapWidget/CnMapWidget.vue +16 -1
  112. package/src/components/CnPartyPicker/CnPartyPicker.vue +317 -0
  113. package/src/components/CnPartyPicker/index.js +11 -0
  114. package/src/components/CnSavedViewEditDialog/CnSavedViewEditDialog.vue +192 -0
  115. package/src/components/CnSavedViewEditDialog/index.js +11 -0
  116. package/src/components/CnSavedViewShareDialog/CnSavedViewShareDialog.vue +21 -6
  117. package/src/components/CnSavedViewShareFields/CnSavedViewShareFields.vue +130 -37
  118. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +36 -599
  119. package/src/components/CnSavedViewsPanel/CnSavedViewsPanel.vue +459 -0
  120. package/src/components/CnSavedViewsPanel/index.js +11 -0
  121. package/src/components/index.js +4 -0
  122. package/src/css/index-page.css +16 -0
  123. package/src/css/look-board-index.css +5 -3
  124. package/src/css/look-board.css +18 -3
  125. package/src/index.js +4 -0
  126. package/src/mixins/savedViewsList.js +231 -0
  127. package/src/schemas/app-manifest-v2.schema.json +98 -3
  128. package/src/utils/actionsDispatcher.js +2 -2
  129. package/src/utils/builtInModals.js +35 -0
  130. package/src/utils/mapMarkerColor.js +117 -0
  131. package/src/utils/mergeManifestDelta.js +4 -0
  132. package/src/utils/savedViewHelpers.js +58 -6
  133. package/src/utils/savedViewMenu.js +150 -0
  134. package/src/utils/searchGroupSharees.js +49 -14
  135. 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 { searchGroupSharees } from '../../utils/searchGroupSharees.js';
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 groups
7
- * from Nextcloud's sharee API and choose, per group, whether members may only
8
- * read the view or also edit it. Used by `CnSaveViewDialog` and the share
9
- * dialog of `CnIndexPage`. Renders nothing when the sharee API answers no
10
- * groups (sharing off, or no group the user may share with).
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 }]` with `mode` `read` or `write`.
26
+ * The chosen audience, `[{ group, mode }]` and `[{ user, mode }]` with
27
+ * `mode` `read` or `write`.
25
28
  *
26
- * @type {Array<{group: string, mode: 'read'|'write'}>}
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 group. */
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.group, label: this.labelOf(e.group) }))
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
- labelOf(group) {
70
- return this.known[group] || group
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 searchGroupSharees(query || '');
89
+ const found = await searchUserAndGroupSharees(query || '');
76
90
  this.loading = false;
77
- this.options = found;
78
- found.forEach((g) => {
79
- this.known = { ...this.known, [g.id]: g.label };
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.group === g.id);
90
- return existing || { group: g.id, mode: 'read' }
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 no group is picked. */
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
- onMode(group, mode) {
97
- this.$emit('update:modelValue', this.modelValue.map((e) => (e.group === group ? { ...e, mode } : e)));
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, Fragment, renderList, createElementVNode, toDisplayString, withCtx, createTextVNode, createCommentVNode } from 'vue';
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
- key: 0,
10
- class: "cn-saved-view-share__modes"
11
- };
12
- const _hoisted_3 = { class: "cn-saved-view-share__group" };
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 groups'),
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("ul", _hoisted_2, [
35
- (openBlock(true), createElementBlock(Fragment, null, renderList($props.modelValue, (entry) => {
36
- return (openBlock(), createElementBlock("li", {
37
- key: entry.group,
38
- class: "cn-saved-view-share__mode"
39
- }, [
40
- createElementVNode("span", _hoisted_3, toDisplayString($options.labelOf(entry.group)), 1 /* TEXT */),
41
- createVNode(_component_NcCheckboxRadioSwitch, {
42
- modelValue: entry.mode === 'write',
43
- disabled: $props.disabled,
44
- "data-testid": `cn-saved-view-share-mode-${entry.group}`,
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
- _: 1 /* STABLE */
51
- }, 8 /* PROPS */, ["modelValue", "disabled", "data-testid", "onUpdate:modelValue"])
52
- ]))
53
- }), 128 /* KEYED_FRAGMENT */))
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":";;;;AASoB,EAAA,KAAA,EAAA,qBAAA;AAAA,EAAA,aAAA,EAAA,qBAAA;;AAaf,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,2BAA2B,GAAA;AAI9B,MAAA,UAAA,GAAA,EAAA,KAAI,EAAC,8BAA8B,GAAA;AAGpC,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,4BAA4B,GAAA;AAEhC,MAAA,UAAA,GAAA,EAAA,KAAA,EAAA,0BAAA,GAAA;AACG,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,4BAAsB,GAAA;AAC5B,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,2BAAI,GAAA;;AAsChB,MAAA,UAAA,GAAA,EAAA,KAAA,EAAA,2BAAA,GAAA;;;;;;;;UA9DM,KAAQ,CAAA,SAAA;AAAjB,OAAAA,SAAA,EAAA,EAAAC,kBAAA,QAAA;QACAC,WAWiC,CAAA,mBAAA,EAAA;AAVhC,UAAA,UAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,YAAA,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;AACX,UAAA,QAAC,EAAA,QAAA,CAAA,QAAA;AACD,UAAA,qBAAiB,EAAE,QAAQ,CAAA,QAAA;;QAC5BC,kBAEG,CAAA,GAAA,EAFH,UAEG,EAAAC,eAAA,CADC,QAAA,CAAA,CAAA,CAAA,eAAA,EAAA,gEAAA,CAAA,CAAA,EAAA,CAAA,YAAA;AAEW,QAAA,CAAA,MAAA,CAAA,UAAU,CAAC,MAAM,GAAA,CAAA;0BAAhCH;cACCE,kBAEI,CAAA,IAAA,EAFJ,UAEI,EAAAC,eAAA,CADD,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,aAAA,CAAA,CAAA,EAAA,CAAA,YAAA;iCA2CA,gBAAA,EAAA;kCAxCHH,kBAuCC,CAAAI,QAAA,EAAA,IAAA,EAAAC,UAAA,CAvCK,MAAA,CAAA,UAAA,EAAA,CAAA,KAAA,KAAA;uCAANL,kBAuCC,CAAA,IAAA,EAAA;oBAvCK,GAAA,EAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA;AAAA,oBAAA,KAAA,EAAA,2BAAA;;AACN,oBAAAE,kBAAA,CAGO,QAHP,UAGO,EAAA;AAFN,sBAAAA,kBAAA,CAAkC,QAAlC,UAAkC,EAAAC,eAAA,CAAA,gBAAA,CAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA,EAAA,CAAA,YAAA;sBAClCD,kBAAgB,CAAA,MAAA,EAAhB,UAAgB,EAAAC,eAAA,CAAA,KAAA,CAAA,IAAA,GAAA,QAAA,CAAA,CAAA,CAAA,eAAA,EAAA,QAAA,CAAA,GAAA,QAAA,CAAA,CAAA,CAAA,eAAA,EAAA,OAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;sCAyBV,CAAA,MAAA,EAAA;AAtBN,sBAAA,KAAK,EAAC,6BAAe;0BACjB,EAAC,YAAO;AACX,sBAAA,YAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAyB,gBAAA,CAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA;sBACtC,aAAW,EAAA,CAAA,yBAAA,EAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA;;iCASC,CAAA,gCAAA,EAAA;AAPZ,wBAAA,IAAI,EAAC,OAAO;wBACX,IAAI,EAAA,CAAA,cAAA,EAAmB,QAAK,CAAA,KAAA,CAAC,KAAK,CAAA,CAAA,CAAA;AACnC,wBAAA,KAAK,EAAC,MAAM;wBACX,UAAU,EAAE,KAAK,CAAC,IAAG,KAAA,OAAA,GAAA,OAAA,GAAA,MAAA;AACrB,wBAAA,QAAQ,EAAE,MAAQ,CAAA,QAAA;AAClB,wBAAA,qBAAU,EAAA,MAAA,KAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,EAAA,MAAA,CAAA,CAAA;;yCACX,MAAmC;0DAAhC,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,SAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;iCAUmB,CAAA,gCAAA,EAAA;AAPvB,wBAAA,IAAI,EAAC,OAAO;wBACX,IAAI,EAAA,CAAA,cAAA,EAAmB,QAAK,CAAA,KAAA,CAAC,KAAK,CAAA,CAAA,CAAA;AACnC,wBAAA,KAAK,EAAC,OAAO;wBACZ,UAAU,EAAE,KAAK,CAAC,IAAG,KAAA,OAAA,GAAA,OAAA,GAAA,MAAA;AACrB,wBAAA,QAAG,EAAA,MAAA,CAAA,QAAA;AACH,wBAAA,qBAAK,EAAA,MAAA,KAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,EAAA,OAAA,CAAA,CAAA;;yCACN,MAAgB;0DAAb,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,YAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;+BAYK,CAAA,mBAAA,EAAA;AARV,sBAAA,OAAO,EAAC,UAAU;AACjB,sBAAA,YAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,0BAAA,EAAA,EAAA,IAAA,EAAC,gBAAA,CAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA;AACd,sBAAA,QAAQ,EAAE,MAAQ,CAAA,QAAA;sBAClB,aAAS,EAAA,CAAA,2BAAA,EAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA;AACT,sBAAA,OAAK,EAAE,MAAA,KAAA,QAAA,CAAA,QAAC,CAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA;;AACP,sBAAA,IAAA,UACD,MAAA;wBAAAF,WAAA,CAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;;;;;;;cAKJC,wBAAA;;;;;;;;;"}
@@ -2,7 +2,6 @@ import script from './CnSavedViewsControl.vue2.js';
2
2
  import { render } from './CnSavedViewsControl.vue3.js';
3
3
 
4
4
  script.render = render;
5
- script.__scopeId = "data-v-55facfc2";
6
5
  const __sfc_main = script;
7
6
 
8
7
  export { __sfc_main as default };
@@ -1 +1 @@
1
- {"version":3,"file":"CnSavedViewsControl.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
1
+ {"version":3,"file":"CnSavedViewsControl.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}