@conduction/nextcloud-vue 2.140.0 → 2.141.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/CnAssignDialog/CnAssignDialog.vue.js +1 -1
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js +10 -2
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +11 -3
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +12 -0
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js +57 -40
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +1 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +5 -3
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +1 -0
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +65 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +120 -69
- 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 +47 -9
- 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/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +3 -3
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +2 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js +10 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue3.js +34 -26
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +2 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +2 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +652 -391
- package/dist/esm/utils/groupSublines.js +120 -0
- package/dist/esm/utils/groupSublines.js.map +1 -0
- package/dist/nextcloud-vue.cjs.js +974 -638
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +652 -391
- package/l10n/en.json +2 -1
- package/l10n/nl.json +2 -1
- package/package.json +1 -1
- package/src/components/CnAssignDialog/CnAssignDialog.vue +10 -2
- package/src/components/CnCellRenderer/CnCellRenderer.vue +11 -3
- package/src/components/CnChartWidget/CnChartWidget.md +1 -0
- package/src/components/CnChartWidget/CnChartWidget.vue +49 -4
- package/src/components/CnDashboardPage/CnDashboardPage.vue +1 -0
- package/src/components/CnDataTable/CnDataTable.vue +6 -3
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +101 -3
- package/src/components/CnMapWidget/CnMapWidget.vue +47 -9
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +3 -3
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +20 -1
- package/src/components/CnRecordListWidget/CnRecordNoteRows.vue +33 -9
- package/src/css/dialog.css +13 -1
- package/src/css/look-board-detail.css +12 -9
- package/src/css/look-board-index.css +90 -7
- package/src/css/look-board.css +92 -0
- package/src/css/table.css +12 -0
- package/src/utils/groupSublines.js +125 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import axios__default from '@nextcloud/axios';
|
|
2
|
+
import { translatePlural } from '@nextcloud/l10n';
|
|
3
|
+
import { generateOcsUrl } from '@nextcloud/router';
|
|
4
|
+
import { fetchReferenceObjects } from './boardReferenceColumns.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The line under a team in a picker: how many members it has and what it is
|
|
8
|
+
* for ("6 leden · bezwaar, beroep en Woo-advies", board DqOverdragen).
|
|
9
|
+
*
|
|
10
|
+
* The count comes from Nextcloud's group details; that endpoint answers
|
|
11
|
+
* administrators and group admins only, so for anyone else the count is left
|
|
12
|
+
* out rather than guessed. Nextcloud keeps no description for a group, so the
|
|
13
|
+
* text comes from an app's own records when the app names them (`describe`:
|
|
14
|
+
* `{ register, schema, groupField?, textField? }`, by default the record's
|
|
15
|
+
* `ncGroupId` and `description`).
|
|
16
|
+
*
|
|
17
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
18
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
19
|
+
*
|
|
20
|
+
* @module utils/groupSublines
|
|
21
|
+
* @spec openspec/changes/assign-team-option-subline/specs/assign-dialog/spec.md
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
const descriptionCache = new Map();
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Member counts by group id for the groups a search finds. Fails soft to `{}`.
|
|
29
|
+
*
|
|
30
|
+
* @param {string} query The search term.
|
|
31
|
+
* @return {Promise<Record<string, number>>} Counts by group id.
|
|
32
|
+
* @spec openspec/changes/assign-team-option-subline/specs/assign-dialog/spec.md
|
|
33
|
+
*/
|
|
34
|
+
async function memberCounts(query) {
|
|
35
|
+
try {
|
|
36
|
+
const response = await axios__default.get(generateOcsUrl('cloud/groups/details'), {
|
|
37
|
+
headers: { 'OCS-APIRequest': 'true', Accept: 'application/json' },
|
|
38
|
+
params: { search: query || '', limit: 50 },
|
|
39
|
+
});
|
|
40
|
+
const data = response && response.data && response.data.ocs ? response.data.ocs.data : (response && response.data);
|
|
41
|
+
const groups = data && Array.isArray(data.groups) ? data.groups : [];
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const group of groups) {
|
|
44
|
+
const count = Number(group && group.usercount);
|
|
45
|
+
if (group && group.id && Number.isFinite(count)) {
|
|
46
|
+
out[String(group.id)] = count;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return out
|
|
50
|
+
} catch {
|
|
51
|
+
return {}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Descriptions by group id from the app's records. Read once per source.
|
|
57
|
+
*
|
|
58
|
+
* @param {{register?: string, schema?: string, groupField?: string, textField?: string}|null} describe The source.
|
|
59
|
+
* @return {Promise<Record<string, string>>} Descriptions by group id.
|
|
60
|
+
* @spec openspec/changes/assign-team-option-subline/specs/assign-dialog/spec.md
|
|
61
|
+
*/
|
|
62
|
+
async function descriptions(describe) {
|
|
63
|
+
if (!describe || !describe.register || !describe.schema) {
|
|
64
|
+
return {}
|
|
65
|
+
}
|
|
66
|
+
const groupField = describe.groupField || 'ncGroupId';
|
|
67
|
+
const textField = describe.textField || 'description';
|
|
68
|
+
const key = [describe.register, describe.schema, groupField, textField].join('/');
|
|
69
|
+
if (!descriptionCache.has(key)) {
|
|
70
|
+
descriptionCache.set(key, fetchReferenceObjects({ register: describe.register, schema: describe.schema, limit: 500 })
|
|
71
|
+
.then((rows) => {
|
|
72
|
+
const out = {};
|
|
73
|
+
for (const row of rows) {
|
|
74
|
+
const gid = row && row[groupField];
|
|
75
|
+
const text = row && typeof row[textField] === 'string' ? row[textField].trim() : '';
|
|
76
|
+
if (gid && text && out[String(gid)] === undefined) {
|
|
77
|
+
out[String(gid)] = text;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return out
|
|
81
|
+
})
|
|
82
|
+
.catch(() => {
|
|
83
|
+
descriptionCache.delete(key);
|
|
84
|
+
return {}
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
return descriptionCache.get(key)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* The line under each group: its member count and its description, joined by
|
|
92
|
+
* " · ", either left out when unknown.
|
|
93
|
+
*
|
|
94
|
+
* @param {string[]} ids The group ids to describe.
|
|
95
|
+
* @param {string} query The search the groups came from.
|
|
96
|
+
* @param {object|null} [describe] Where the app keeps a group's description.
|
|
97
|
+
* @return {Promise<Record<string, string>>} The line by group id ('' when nothing is known).
|
|
98
|
+
* @spec openspec/changes/assign-team-option-subline/specs/assign-dialog/spec.md
|
|
99
|
+
*/
|
|
100
|
+
async function groupSublines(ids, query, describe = null) {
|
|
101
|
+
if (!Array.isArray(ids) || ids.length === 0) {
|
|
102
|
+
return {}
|
|
103
|
+
}
|
|
104
|
+
const [counts, texts] = await Promise.all([memberCounts(query), descriptions(describe)]);
|
|
105
|
+
const out = {};
|
|
106
|
+
for (const id of ids) {
|
|
107
|
+
const parts = [];
|
|
108
|
+
if (counts[id] !== undefined) {
|
|
109
|
+
parts.push(translatePlural('nextcloud-vue', '{count} member', '{count} members', counts[id], { count: counts[id] }));
|
|
110
|
+
}
|
|
111
|
+
if (texts[id]) {
|
|
112
|
+
parts.push(texts[id]);
|
|
113
|
+
}
|
|
114
|
+
out[id] = parts.join(' · ');
|
|
115
|
+
}
|
|
116
|
+
return out
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export { groupSublines };
|
|
120
|
+
//# sourceMappingURL=groupSublines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupSublines.js","sources":["../../../src/utils/groupSublines.js"],"sourcesContent":["/**\n * The line under a team in a picker: how many members it has and what it is\n * for (\"6 leden · bezwaar, beroep en Woo-advies\", board DqOverdragen).\n *\n * The count comes from Nextcloud's group details; that endpoint answers\n * administrators and group admins only, so for anyone else the count is left\n * out rather than guessed. Nextcloud keeps no description for a group, so the\n * text comes from an app's own records when the app names them (`describe`:\n * `{ register, schema, groupField?, textField? }`, by default the record's\n * `ncGroupId` and `description`).\n *\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * @module utils/groupSublines\n * @spec openspec/changes/assign-team-option-subline/specs/assign-dialog/spec.md\n */\n\nimport axios from '@nextcloud/axios'\nimport { translatePlural as n } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { fetchReferenceObjects } from './boardReferenceColumns.js'\n\nconst descriptionCache = new Map()\n\n/**\n * Member counts by group id for the groups a search finds. Fails soft to `{}`.\n *\n * @param {string} query The search term.\n * @return {Promise<Record<string, number>>} Counts by group id.\n * @spec openspec/changes/assign-team-option-subline/specs/assign-dialog/spec.md\n */\nasync function memberCounts(query) {\n\ttry {\n\t\tconst response = await axios.get(generateOcsUrl('cloud/groups/details'), {\n\t\t\theaders: { 'OCS-APIRequest': 'true', Accept: 'application/json' },\n\t\t\tparams: { search: query || '', limit: 50 },\n\t\t})\n\t\tconst data = response && response.data && response.data.ocs ? response.data.ocs.data : (response && response.data)\n\t\tconst groups = data && Array.isArray(data.groups) ? data.groups : []\n\t\tconst out = {}\n\t\tfor (const group of groups) {\n\t\t\tconst count = Number(group && group.usercount)\n\t\t\tif (group && group.id && Number.isFinite(count)) {\n\t\t\t\tout[String(group.id)] = count\n\t\t\t}\n\t\t}\n\t\treturn out\n\t} catch {\n\t\treturn {}\n\t}\n}\n\n/**\n * Descriptions by group id from the app's records. Read once per source.\n *\n * @param {{register?: string, schema?: string, groupField?: string, textField?: string}|null} describe The source.\n * @return {Promise<Record<string, string>>} Descriptions by group id.\n * @spec openspec/changes/assign-team-option-subline/specs/assign-dialog/spec.md\n */\nasync function descriptions(describe) {\n\tif (!describe || !describe.register || !describe.schema) {\n\t\treturn {}\n\t}\n\tconst groupField = describe.groupField || 'ncGroupId'\n\tconst textField = describe.textField || 'description'\n\tconst key = [describe.register, describe.schema, groupField, textField].join('/')\n\tif (!descriptionCache.has(key)) {\n\t\tdescriptionCache.set(key, fetchReferenceObjects({ register: describe.register, schema: describe.schema, limit: 500 })\n\t\t\t.then((rows) => {\n\t\t\t\tconst out = {}\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tconst gid = row && row[groupField]\n\t\t\t\t\tconst text = row && typeof row[textField] === 'string' ? row[textField].trim() : ''\n\t\t\t\t\tif (gid && text && out[String(gid)] === undefined) {\n\t\t\t\t\t\tout[String(gid)] = text\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn out\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tdescriptionCache.delete(key)\n\t\t\t\treturn {}\n\t\t\t}))\n\t}\n\treturn descriptionCache.get(key)\n}\n\n/**\n * The line under each group: its member count and its description, joined by\n * \" · \", either left out when unknown.\n *\n * @param {string[]} ids The group ids to describe.\n * @param {string} query The search the groups came from.\n * @param {object|null} [describe] Where the app keeps a group's description.\n * @return {Promise<Record<string, string>>} The line by group id ('' when nothing is known).\n * @spec openspec/changes/assign-team-option-subline/specs/assign-dialog/spec.md\n */\nexport async function groupSublines(ids, query, describe = null) {\n\tif (!Array.isArray(ids) || ids.length === 0) {\n\t\treturn {}\n\t}\n\tconst [counts, texts] = await Promise.all([memberCounts(query), descriptions(describe)])\n\tconst out = {}\n\tfor (const id of ids) {\n\t\tconst parts = []\n\t\tif (counts[id] !== undefined) {\n\t\t\tparts.push(n('nextcloud-vue', '{count} member', '{count} members', counts[id], { count: counts[id] }))\n\t\t}\n\t\tif (texts[id]) {\n\t\t\tparts.push(texts[id])\n\t\t}\n\t\tout[id] = parts.join(' · ')\n\t}\n\treturn out\n}\n\n/**\n * Forget the cached descriptions (tests, or after the source changed).\n *\n * @return {void}\n */\nexport function clearGroupSublineCache() {\n\tdescriptionCache.clear()\n}\n"],"names":["axios","n"],"mappings":"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"}
|