@conduction/nextcloud-vue 2.91.0 → 2.93.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/CnAppRoot/CnAppRoot.vue2.js +57 -4
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +44 -17
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue.js +1 -1
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js +44 -2
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js.map +1 -1
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js +140 -59
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +20 -6
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +3 -2
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +10 -39
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +5 -3
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +6 -4
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue2.js +46 -0
- package/dist/esm/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue2.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue3.js +6 -2
- package/dist/esm/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue.js +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js +82 -9
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +104 -90
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js +9 -0
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js.map +1 -0
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js +355 -0
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js.map +1 -0
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js +462 -0
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js.map +1 -0
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue.js +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +39 -10
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +418 -399
- package/dist/esm/components/CnFormDialog/CnFormDialog.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/CnLinkCardsPage/CnLinkCardsPage.vue.js +1 -1
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue2.js +156 -3
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js +168 -52
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnModuleCard/CnModuleCard.vue.js +9 -0
- package/dist/esm/components/CnModuleCard/CnModuleCard.vue.js.map +1 -0
- package/dist/esm/components/CnModuleCard/CnModuleCard.vue2.js +83 -0
- package/dist/esm/components/CnModuleCard/CnModuleCard.vue2.js.map +1 -0
- package/dist/esm/components/CnModuleCard/CnModuleCard.vue3.js +119 -0
- package/dist/esm/components/CnModuleCard/CnModuleCard.vue3.js.map +1 -0
- package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue.js +1 -1
- package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js +22 -1
- package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js +20 -14
- package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue.js +1 -1
- package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue2.js +2 -0
- package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue2.js.map +1 -1
- package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue3.js +15 -5
- package/dist/esm/components/CnNotificationPreferences/CnNotificationPreferences.vue3.js.map +1 -1
- package/dist/esm/components/CnRoadmapTab/CnRoadmapTab.vue.js +1 -1
- package/dist/esm/components/CnRoadmapTab/CnRoadmapTab.vue2.js +8 -30
- package/dist/esm/components/CnRoadmapTab/CnRoadmapTab.vue2.js.map +1 -1
- package/dist/esm/components/CnRoadmapTab/CnRoadmapTab.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +33 -2
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTextWidget/CnTextWidget.vue.js +1 -1
- package/dist/esm/components/CnTextWidget/CnTextWidget.vue2.js +63 -4
- package/dist/esm/components/CnTextWidget/CnTextWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTextWidget/CnTextWidget.vue3.js +19 -2
- package/dist/esm/components/CnTextWidget/CnTextWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue.js +9 -0
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue.js.map +1 -0
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js +164 -0
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js.map +1 -0
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js +93 -0
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js.map +1 -0
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +12 -0
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +45 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +44 -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 +1182 -328
- package/dist/esm/utils/boardDate.js +35 -1
- package/dist/esm/utils/boardDate.js.map +1 -1
- package/dist/esm/utils/featureCatalog.js +135 -0
- package/dist/esm/utils/featureCatalog.js.map +1 -0
- package/dist/esm/utils/fillTemplate.js +84 -4
- package/dist/esm/utils/fillTemplate.js.map +1 -1
- package/dist/esm/utils/headerMeta.js +62 -12
- package/dist/esm/utils/headerMeta.js.map +1 -1
- package/dist/esm/utils/roadmapIssues.js +86 -0
- package/dist/esm/utils/roadmapIssues.js.map +1 -0
- package/dist/esm/utils/userDisplayName.js +47 -0
- package/dist/esm/utils/userDisplayName.js.map +1 -0
- 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 +15618 -13097
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +1182 -328
- package/l10n/en.json +45 -1
- package/l10n/nl.json +44 -1
- package/package.json +1 -1
- package/src/components/CnAppRoot/CnAppRoot.md +2 -0
- package/src/components/CnAppRoot/CnAppRoot.vue +66 -5
- package/src/components/CnChoiceCards/CnChoiceCards.md +27 -0
- package/src/components/CnChoiceCards/CnChoiceCards.vue +168 -3
- package/src/components/CnDashboardPage/CnDashboardPage.vue +45 -6
- package/src/components/CnDataTable/CnDataTable.vue +10 -39
- package/src/components/CnDetailPage/CnDetailPage.vue +5 -3
- package/src/components/CnFactsWidget/CnFactsWidget.vue +6 -4
- package/src/components/CnFeaturesAndRoadmapPage/CnFeaturesAndRoadmapPage.vue +51 -1
- package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +98 -13
- package/src/components/CnFeaturesBoard/CnFeaturesBoard.vue +1053 -0
- package/src/components/CnFormDialog/CnFormDialog.md +1 -0
- package/src/components/CnFormDialog/CnFormDialog.vue +619 -562
- package/src/components/CnLinkCardsPage/CnLinkCardsPage.vue +338 -5
- package/src/components/CnModuleCard/CnModuleCard.vue +258 -0
- package/src/components/CnNcWidgetWidget/CnNcWidgetWidget.vue +23 -2
- package/src/components/CnNotificationPreferences/CnNotificationPreferences.vue +5 -0
- package/src/components/CnRoadmapTab/CnRoadmapTab.vue +6 -28
- package/src/components/CnTabsWidget/CnTabsWidget.vue +33 -2
- package/src/components/CnTextWidget/CnTextWidget.vue +89 -4
- package/src/components/CnUserSettingsDialog/CnUserSettingsDialog.vue +305 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +12 -0
- package/src/css/dialog.css +47 -0
- package/src/css/look-board-detail.css +8 -0
- package/src/css/look-board.css +33 -0
- package/src/schemas/app-manifest-v2.schema.json +67 -4
- package/src/utils/boardDate.js +34 -0
- package/src/utils/featureCatalog.js +132 -0
- package/src/utils/fillTemplate.js +83 -3
- package/src/utils/headerMeta.js +62 -12
- package/src/utils/roadmapIssues.js +82 -0
- package/src/utils/userDisplayName.js +54 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import { resolveComponent, openBlock, createElementBlock, normalizeClass, createElementVNode, toDisplayString, createBlock, withCtx, createVNode, createTextVNode, createCommentVNode, Fragment, renderList, withModifiers } from 'vue';
|
|
2
|
+
|
|
3
|
+
const _hoisted_1 = { class: "cn-features-board__header" };
|
|
4
|
+
const _hoisted_2 = { class: "cn-features-board__title-row" };
|
|
5
|
+
const _hoisted_3 = { class: "cn-features-board__title" };
|
|
6
|
+
const _hoisted_4 = { class: "cn-features-board__header-actions" };
|
|
7
|
+
const _hoisted_5 = {
|
|
8
|
+
key: 0,
|
|
9
|
+
class: "cn-features-board__subtitle",
|
|
10
|
+
"data-testid": "cn-features-board-subtitle"
|
|
11
|
+
};
|
|
12
|
+
const _hoisted_6 = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "cn-features-board__tab-row"
|
|
15
|
+
};
|
|
16
|
+
const _hoisted_7 = ["aria-label"];
|
|
17
|
+
const _hoisted_8 = ["id", "aria-selected", "aria-controls", "tabindex", "data-testid", "onClick"];
|
|
18
|
+
const _hoisted_9 = ["id", "role", "aria-labelledby"];
|
|
19
|
+
const _hoisted_10 = ["aria-label"];
|
|
20
|
+
const _hoisted_11 = ["aria-pressed", "data-status", "onClick"];
|
|
21
|
+
const _hoisted_12 = {
|
|
22
|
+
key: 0,
|
|
23
|
+
class: "cn-features-board__filter-count",
|
|
24
|
+
"data-testid": "cn-features-board-filter-count"
|
|
25
|
+
};
|
|
26
|
+
const _hoisted_13 = { class: "cn-features-board__body" };
|
|
27
|
+
const _hoisted_14 = {
|
|
28
|
+
key: 0,
|
|
29
|
+
class: "cn-features-board__empty",
|
|
30
|
+
"data-testid": "cn-features-board-empty"
|
|
31
|
+
};
|
|
32
|
+
const _hoisted_15 = ["aria-labelledby", "aria-label", "data-group"];
|
|
33
|
+
const _hoisted_16 = {
|
|
34
|
+
key: 0,
|
|
35
|
+
class: "cn-features-board__group-head"
|
|
36
|
+
};
|
|
37
|
+
const _hoisted_17 = ["id"];
|
|
38
|
+
const _hoisted_18 = {
|
|
39
|
+
key: 0,
|
|
40
|
+
class: "cn-features-board__group-caption",
|
|
41
|
+
"data-testid": "cn-features-board-group-caption"
|
|
42
|
+
};
|
|
43
|
+
const _hoisted_19 = {
|
|
44
|
+
key: 1,
|
|
45
|
+
class: "cn-features-board__cards"
|
|
46
|
+
};
|
|
47
|
+
const _hoisted_20 = { class: "cn-features-board__card-head" };
|
|
48
|
+
const _hoisted_21 = { class: "cn-features-board__card-title" };
|
|
49
|
+
const _hoisted_22 = {
|
|
50
|
+
key: 0,
|
|
51
|
+
class: "cn-features-board__card-summary"
|
|
52
|
+
};
|
|
53
|
+
const _hoisted_23 = {
|
|
54
|
+
key: 1,
|
|
55
|
+
class: "cn-features-board__card-footer"
|
|
56
|
+
};
|
|
57
|
+
const _hoisted_24 = ["href", "aria-label"];
|
|
58
|
+
const _hoisted_25 = {
|
|
59
|
+
key: 2,
|
|
60
|
+
class: "cn-features-board__rows"
|
|
61
|
+
};
|
|
62
|
+
const _hoisted_26 = { class: "cn-features-board__row-text" };
|
|
63
|
+
const _hoisted_27 = { class: "cn-features-board__row-title" };
|
|
64
|
+
const _hoisted_28 = {
|
|
65
|
+
key: 0,
|
|
66
|
+
class: "cn-features-board__row-summary"
|
|
67
|
+
};
|
|
68
|
+
const _hoisted_29 = ["aria-label"];
|
|
69
|
+
const _hoisted_30 = { class: "cn-features-board__next-card" };
|
|
70
|
+
const _hoisted_31 = { class: "cn-features-board__next-head" };
|
|
71
|
+
const _hoisted_32 = { class: "cn-features-board__next-title" };
|
|
72
|
+
const _hoisted_33 = { class: "cn-features-board__next-lead" };
|
|
73
|
+
const _hoisted_34 = {
|
|
74
|
+
key: 0,
|
|
75
|
+
class: "cn-features-board__next-list"
|
|
76
|
+
};
|
|
77
|
+
const _hoisted_35 = ["href"];
|
|
78
|
+
const _hoisted_36 = { class: "cn-features-board__next-meta" };
|
|
79
|
+
const _hoisted_37 = {
|
|
80
|
+
key: 1,
|
|
81
|
+
class: "cn-features-board__next-opened"
|
|
82
|
+
};
|
|
83
|
+
const _hoisted_38 = {
|
|
84
|
+
key: 1,
|
|
85
|
+
class: "cn-features-board__next-lead",
|
|
86
|
+
"data-testid": "cn-features-board-next-empty"
|
|
87
|
+
};
|
|
88
|
+
const _hoisted_39 = ["href"];
|
|
89
|
+
|
|
90
|
+
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
91
|
+
const _component_BookOpenVariant = resolveComponent("BookOpenVariant");
|
|
92
|
+
const _component_NcButton = resolveComponent("NcButton");
|
|
93
|
+
const _component_CnBuildiqEditButton = resolveComponent("CnBuildiqEditButton");
|
|
94
|
+
const _component_Plus = resolveComponent("Plus");
|
|
95
|
+
const _component_DotsHorizontal = resolveComponent("DotsHorizontal");
|
|
96
|
+
const _component_NcActionLink = resolveComponent("NcActionLink");
|
|
97
|
+
const _component_NcActionButton = resolveComponent("NcActionButton");
|
|
98
|
+
const _component_NcActions = resolveComponent("NcActions");
|
|
99
|
+
const _component_CnRoadmapTab = resolveComponent("CnRoadmapTab");
|
|
100
|
+
const _component_CnStatusBadge = resolveComponent("CnStatusBadge");
|
|
101
|
+
const _component_RoadVariant = resolveComponent("RoadVariant");
|
|
102
|
+
const _component_CalendarBlankOutline = resolveComponent("CalendarBlankOutline");
|
|
103
|
+
const _component_ChevronRight = resolveComponent("ChevronRight");
|
|
104
|
+
const _component_NcNoteCard = resolveComponent("NcNoteCard");
|
|
105
|
+
|
|
106
|
+
return (openBlock(), createElementBlock("div", {
|
|
107
|
+
class: normalizeClass(["cn-features-board", `cn-features-board--${$props.layout}`]),
|
|
108
|
+
"data-testid": "cn-features-board"
|
|
109
|
+
}, [
|
|
110
|
+
createElementVNode("header", _hoisted_1, [
|
|
111
|
+
createElementVNode("div", _hoisted_2, [
|
|
112
|
+
createElementVNode("h1", _hoisted_3, toDisplayString($options.resolvedTitle), 1 /* TEXT */),
|
|
113
|
+
createElementVNode("div", _hoisted_4, [
|
|
114
|
+
($props.documentationButton && $props.documentationUrl)
|
|
115
|
+
? (openBlock(), createBlock(_component_NcButton, {
|
|
116
|
+
key: 0,
|
|
117
|
+
variant: "secondary",
|
|
118
|
+
href: $props.documentationUrl,
|
|
119
|
+
target: "_blank",
|
|
120
|
+
rel: "noopener noreferrer",
|
|
121
|
+
"data-testid": "cn-features-board-docs"
|
|
122
|
+
}, {
|
|
123
|
+
icon: withCtx(() => [
|
|
124
|
+
createVNode(_component_BookOpenVariant, { size: 20 })
|
|
125
|
+
]),
|
|
126
|
+
default: withCtx(() => [
|
|
127
|
+
createTextVNode(" " + toDisplayString($options.t('nextcloud-vue', 'Documentation')), 1 /* TEXT */)
|
|
128
|
+
]),
|
|
129
|
+
_: 1 /* STABLE */
|
|
130
|
+
}, 8 /* PROPS */, ["href"]))
|
|
131
|
+
: createCommentVNode("v-if", true),
|
|
132
|
+
createVNode(_component_CnBuildiqEditButton),
|
|
133
|
+
($props.suggestUrl && $props.suggestButton)
|
|
134
|
+
? (openBlock(), createBlock(_component_NcButton, {
|
|
135
|
+
key: 1,
|
|
136
|
+
variant: "primary",
|
|
137
|
+
href: $props.suggestUrl,
|
|
138
|
+
target: "_blank",
|
|
139
|
+
rel: "noopener noreferrer",
|
|
140
|
+
"data-testid": "cn-features-board-suggest"
|
|
141
|
+
}, {
|
|
142
|
+
icon: withCtx(() => [
|
|
143
|
+
createVNode(_component_Plus, { size: 20 })
|
|
144
|
+
]),
|
|
145
|
+
default: withCtx(() => [
|
|
146
|
+
createTextVNode(" " + toDisplayString($options.t('nextcloud-vue', 'Suggest feature')), 1 /* TEXT */)
|
|
147
|
+
]),
|
|
148
|
+
_: 1 /* STABLE */
|
|
149
|
+
}, 8 /* PROPS */, ["href"]))
|
|
150
|
+
: createCommentVNode("v-if", true),
|
|
151
|
+
(!$props.tabs)
|
|
152
|
+
? (openBlock(), createBlock(_component_NcActions, {
|
|
153
|
+
key: 2,
|
|
154
|
+
menuName: $options.t('nextcloud-vue', 'Actions'),
|
|
155
|
+
forceName: true,
|
|
156
|
+
"data-testid": "cn-features-board-actions"
|
|
157
|
+
}, {
|
|
158
|
+
icon: withCtx(() => [
|
|
159
|
+
createVNode(_component_DotsHorizontal, { size: 20 })
|
|
160
|
+
]),
|
|
161
|
+
default: withCtx(() => [
|
|
162
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.menuLinks, (action) => {
|
|
163
|
+
return (openBlock(), createBlock(_component_NcActionLink, {
|
|
164
|
+
key: action.key,
|
|
165
|
+
href: action.href,
|
|
166
|
+
target: "_blank"
|
|
167
|
+
}, {
|
|
168
|
+
default: withCtx(() => [
|
|
169
|
+
createTextVNode(toDisplayString(action.label), 1 /* TEXT */)
|
|
170
|
+
]),
|
|
171
|
+
_: 2 /* DYNAMIC */
|
|
172
|
+
}, 1032 /* PROPS, DYNAMIC_SLOTS */, ["href"]))
|
|
173
|
+
}), 128 /* KEYED_FRAGMENT */)),
|
|
174
|
+
createVNode(_component_NcActionButton, { onClick: $options.onSupport }, {
|
|
175
|
+
default: withCtx(() => [
|
|
176
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Support this app')), 1 /* TEXT */)
|
|
177
|
+
]),
|
|
178
|
+
_: 1 /* STABLE */
|
|
179
|
+
}, 8 /* PROPS */, ["onClick"])
|
|
180
|
+
]),
|
|
181
|
+
_: 1 /* STABLE */
|
|
182
|
+
}, 8 /* PROPS */, ["menuName"]))
|
|
183
|
+
: createCommentVNode("v-if", true)
|
|
184
|
+
])
|
|
185
|
+
]),
|
|
186
|
+
($options.resolvedSubtitle)
|
|
187
|
+
? (openBlock(), createElementBlock("p", _hoisted_5, toDisplayString($options.resolvedSubtitle), 1 /* TEXT */))
|
|
188
|
+
: createCommentVNode("v-if", true)
|
|
189
|
+
]),
|
|
190
|
+
($props.tabs)
|
|
191
|
+
? (openBlock(), createElementBlock("div", _hoisted_6, [
|
|
192
|
+
createElementVNode("div", {
|
|
193
|
+
class: "cn-features-board__tabs",
|
|
194
|
+
role: "tablist",
|
|
195
|
+
"aria-label": $options.resolvedTitle,
|
|
196
|
+
onKeydown: _cache[0] || (_cache[0] = (...args) => ($options.onTabKeydown && $options.onTabKeydown(...args)))
|
|
197
|
+
}, [
|
|
198
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.tabList, (tab) => {
|
|
199
|
+
return (openBlock(), createElementBlock("button", {
|
|
200
|
+
id: `${$data.uid}-tab-${tab.key}`,
|
|
201
|
+
key: tab.key,
|
|
202
|
+
ref_for: true,
|
|
203
|
+
ref: "tabButtons",
|
|
204
|
+
type: "button",
|
|
205
|
+
role: "tab",
|
|
206
|
+
class: normalizeClass(["cn-features-board__tab", { 'cn-features-board__tab--active': $data.activeTab === tab.key }]),
|
|
207
|
+
"aria-selected": $data.activeTab === tab.key ? 'true' : 'false',
|
|
208
|
+
"aria-controls": `${$data.uid}-panel`,
|
|
209
|
+
tabindex: $data.activeTab === tab.key ? 0 : -1,
|
|
210
|
+
"data-testid": `cn-features-board-tab-${tab.key}`,
|
|
211
|
+
onClick: $event => ($data.activeTab = tab.key)
|
|
212
|
+
}, toDisplayString(tab.label), 11 /* TEXT, CLASS, PROPS */, _hoisted_8))
|
|
213
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
214
|
+
], 40 /* PROPS, NEED_HYDRATION */, _hoisted_7),
|
|
215
|
+
createVNode(_component_NcActions, {
|
|
216
|
+
menuName: $options.t('nextcloud-vue', 'Actions'),
|
|
217
|
+
forceName: true,
|
|
218
|
+
class: "cn-features-board__tab-actions",
|
|
219
|
+
"data-testid": "cn-features-board-actions"
|
|
220
|
+
}, {
|
|
221
|
+
icon: withCtx(() => [
|
|
222
|
+
createVNode(_component_DotsHorizontal, { size: 20 })
|
|
223
|
+
]),
|
|
224
|
+
default: withCtx(() => [
|
|
225
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.menuLinks, (action) => {
|
|
226
|
+
return (openBlock(), createBlock(_component_NcActionLink, {
|
|
227
|
+
key: action.key,
|
|
228
|
+
href: action.href,
|
|
229
|
+
target: "_blank"
|
|
230
|
+
}, {
|
|
231
|
+
default: withCtx(() => [
|
|
232
|
+
createTextVNode(toDisplayString(action.label), 1 /* TEXT */)
|
|
233
|
+
]),
|
|
234
|
+
_: 2 /* DYNAMIC */
|
|
235
|
+
}, 1032 /* PROPS, DYNAMIC_SLOTS */, ["href"]))
|
|
236
|
+
}), 128 /* KEYED_FRAGMENT */)),
|
|
237
|
+
createVNode(_component_NcActionButton, { onClick: $options.onSupport }, {
|
|
238
|
+
default: withCtx(() => [
|
|
239
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Support this app')), 1 /* TEXT */)
|
|
240
|
+
]),
|
|
241
|
+
_: 1 /* STABLE */
|
|
242
|
+
}, 8 /* PROPS */, ["onClick"])
|
|
243
|
+
]),
|
|
244
|
+
_: 1 /* STABLE */
|
|
245
|
+
}, 8 /* PROPS */, ["menuName"])
|
|
246
|
+
]))
|
|
247
|
+
: createCommentVNode("v-if", true),
|
|
248
|
+
createElementVNode("div", {
|
|
249
|
+
id: `${$data.uid}-panel`,
|
|
250
|
+
class: normalizeClass(["cn-features-board__panel", { 'cn-features-board__panel--tabbed': $props.tabs }]),
|
|
251
|
+
role: $props.tabs ? 'tabpanel' : null,
|
|
252
|
+
"aria-labelledby": $props.tabs ? `${$data.uid}-tab-${$data.activeTab}` : null
|
|
253
|
+
}, [
|
|
254
|
+
($props.tabs && $data.activeTab === 'roadmap')
|
|
255
|
+
? (openBlock(), createBlock(_component_CnRoadmapTab, {
|
|
256
|
+
key: 0,
|
|
257
|
+
repo: $props.repo
|
|
258
|
+
}, null, 8 /* PROPS */, ["repo"]))
|
|
259
|
+
: (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
260
|
+
createElementVNode("div", {
|
|
261
|
+
class: normalizeClass(["cn-features-board__filter", `cn-features-board__filter--${$props.filter}`]),
|
|
262
|
+
role: "group",
|
|
263
|
+
"aria-label": $options.t('nextcloud-vue', 'Status'),
|
|
264
|
+
"data-testid": "cn-features-board-filter"
|
|
265
|
+
}, [
|
|
266
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.filterOptions, (option) => {
|
|
267
|
+
return (openBlock(), createElementBlock("button", {
|
|
268
|
+
key: option.key,
|
|
269
|
+
type: "button",
|
|
270
|
+
class: normalizeClass(["cn-features-board__filter-option", { 'cn-features-board__filter-option--active': $data.status === option.key }]),
|
|
271
|
+
"aria-pressed": $data.status === option.key ? 'true' : 'false',
|
|
272
|
+
"data-status": option.key,
|
|
273
|
+
onClick: $event => ($data.status = option.key)
|
|
274
|
+
}, [
|
|
275
|
+
createTextVNode(toDisplayString(option.label), 1 /* TEXT */),
|
|
276
|
+
($props.filter === 'chips')
|
|
277
|
+
? (openBlock(), createElementBlock("span", _hoisted_12, toDisplayString(' ' + option.count), 1 /* TEXT */))
|
|
278
|
+
: createCommentVNode("v-if", true)
|
|
279
|
+
], 10 /* CLASS, PROPS */, _hoisted_11))
|
|
280
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
281
|
+
], 10 /* CLASS, PROPS */, _hoisted_10),
|
|
282
|
+
createElementVNode("div", _hoisted_13, [
|
|
283
|
+
createElementVNode("div", {
|
|
284
|
+
class: normalizeClass(["cn-features-board__groups", `cn-features-board__groups--${$props.layout}`])
|
|
285
|
+
}, [
|
|
286
|
+
($options.shownGroups.length === 0)
|
|
287
|
+
? (openBlock(), createElementBlock("p", _hoisted_14, toDisplayString($options.t('nextcloud-vue', 'No features with this status')), 1 /* TEXT */))
|
|
288
|
+
: createCommentVNode("v-if", true),
|
|
289
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.shownGroups, (group) => {
|
|
290
|
+
return (openBlock(), createElementBlock("section", {
|
|
291
|
+
key: group.key,
|
|
292
|
+
class: "cn-features-board__group",
|
|
293
|
+
"aria-labelledby": group.label ? `${$data.uid}-group-${group.key}` : null,
|
|
294
|
+
"aria-label": group.label ? null : $options.resolvedTitle,
|
|
295
|
+
"data-testid": "cn-features-board-group",
|
|
296
|
+
"data-group": group.key
|
|
297
|
+
}, [
|
|
298
|
+
(group.label)
|
|
299
|
+
? (openBlock(), createElementBlock("div", _hoisted_16, [
|
|
300
|
+
createElementVNode("h2", {
|
|
301
|
+
id: `${$data.uid}-group-${group.key}`,
|
|
302
|
+
class: "cn-features-board__group-title"
|
|
303
|
+
}, toDisplayString(group.label), 9 /* TEXT, PROPS */, _hoisted_17),
|
|
304
|
+
($props.layout === 'cards')
|
|
305
|
+
? (openBlock(), createElementBlock("span", _hoisted_18, toDisplayString($options.groupCaption(group)), 1 /* TEXT */))
|
|
306
|
+
: createCommentVNode("v-if", true)
|
|
307
|
+
]))
|
|
308
|
+
: createCommentVNode("v-if", true),
|
|
309
|
+
($props.layout === 'cards')
|
|
310
|
+
? (openBlock(), createElementBlock("div", _hoisted_19, [
|
|
311
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(group.shown, (feature) => {
|
|
312
|
+
return (openBlock(), createElementBlock("article", {
|
|
313
|
+
key: feature.slug,
|
|
314
|
+
class: "cn-features-board__card",
|
|
315
|
+
"data-testid": "cn-features-board-feature"
|
|
316
|
+
}, [
|
|
317
|
+
createElementVNode("div", _hoisted_20, [
|
|
318
|
+
createElementVNode("h3", _hoisted_21, toDisplayString(feature.title), 1 /* TEXT */),
|
|
319
|
+
createVNode(_component_CnStatusBadge, {
|
|
320
|
+
label: $options.statusText(feature),
|
|
321
|
+
variant: $options.variantOf(feature.status),
|
|
322
|
+
"data-testid": "cn-features-board-status"
|
|
323
|
+
}, null, 8 /* PROPS */, ["label", "variant"])
|
|
324
|
+
]),
|
|
325
|
+
(feature.summary)
|
|
326
|
+
? (openBlock(), createElementBlock("p", _hoisted_22, toDisplayString(feature.summary), 1 /* TEXT */))
|
|
327
|
+
: createCommentVNode("v-if", true),
|
|
328
|
+
($options.readMoreHref(feature))
|
|
329
|
+
? (openBlock(), createElementBlock("div", _hoisted_23, [
|
|
330
|
+
createElementVNode("a", {
|
|
331
|
+
class: "cn-features-board__read-more",
|
|
332
|
+
href: $options.readMoreHref(feature),
|
|
333
|
+
target: "_blank",
|
|
334
|
+
rel: "noopener noreferrer",
|
|
335
|
+
"aria-label": $options.t('nextcloud-vue', 'Learn more about {title}', { title: feature.title })
|
|
336
|
+
}, toDisplayString($options.t('nextcloud-vue', 'Learn more')), 9 /* TEXT, PROPS */, _hoisted_24)
|
|
337
|
+
]))
|
|
338
|
+
: createCommentVNode("v-if", true)
|
|
339
|
+
]))
|
|
340
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
341
|
+
]))
|
|
342
|
+
: (openBlock(), createElementBlock("ul", _hoisted_25, [
|
|
343
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(group.shown, (feature) => {
|
|
344
|
+
return (openBlock(), createElementBlock("li", {
|
|
345
|
+
key: feature.slug,
|
|
346
|
+
class: "cn-features-board__row",
|
|
347
|
+
"data-testid": "cn-features-board-feature"
|
|
348
|
+
}, [
|
|
349
|
+
createElementVNode("span", _hoisted_26, [
|
|
350
|
+
createElementVNode("span", _hoisted_27, toDisplayString(feature.title), 1 /* TEXT */),
|
|
351
|
+
(feature.summary)
|
|
352
|
+
? (openBlock(), createElementBlock("span", _hoisted_28, toDisplayString(feature.summary), 1 /* TEXT */))
|
|
353
|
+
: createCommentVNode("v-if", true)
|
|
354
|
+
]),
|
|
355
|
+
createVNode(_component_CnStatusBadge, {
|
|
356
|
+
label: $options.statusText(feature),
|
|
357
|
+
variant: $options.variantOf(feature.status),
|
|
358
|
+
"data-testid": "cn-features-board-status"
|
|
359
|
+
}, null, 8 /* PROPS */, ["label", "variant"])
|
|
360
|
+
]))
|
|
361
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
362
|
+
]))
|
|
363
|
+
], 8 /* PROPS */, _hoisted_15))
|
|
364
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
365
|
+
], 2 /* CLASS */),
|
|
366
|
+
($props.next > 0 && $props.repo)
|
|
367
|
+
? (openBlock(), createElementBlock("aside", {
|
|
368
|
+
key: 0,
|
|
369
|
+
class: "cn-features-board__next",
|
|
370
|
+
"aria-label": $options.t('nextcloud-vue', 'Next on the roadmap'),
|
|
371
|
+
"data-testid": "cn-features-board-next"
|
|
372
|
+
}, [
|
|
373
|
+
createElementVNode("section", _hoisted_30, [
|
|
374
|
+
createElementVNode("div", _hoisted_31, [
|
|
375
|
+
createVNode(_component_RoadVariant, { size: 20 }),
|
|
376
|
+
createElementVNode("h2", _hoisted_32, toDisplayString($options.t('nextcloud-vue', 'Coming next')), 1 /* TEXT */)
|
|
377
|
+
]),
|
|
378
|
+
createElementVNode("p", _hoisted_33, toDisplayString($options.t('nextcloud-vue', 'The most requested items from the issue tracker.')), 1 /* TEXT */),
|
|
379
|
+
($options.nextIssues.length > 0)
|
|
380
|
+
? (openBlock(), createElementBlock("ol", _hoisted_34, [
|
|
381
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.nextIssues, (issue) => {
|
|
382
|
+
return (openBlock(), createElementBlock("li", {
|
|
383
|
+
key: issue.number,
|
|
384
|
+
class: "cn-features-board__next-item",
|
|
385
|
+
"data-testid": "cn-features-board-next-item"
|
|
386
|
+
}, [
|
|
387
|
+
createElementVNode("a", {
|
|
388
|
+
class: "cn-features-board__next-link",
|
|
389
|
+
href: $options.safeHref(issue.html_url),
|
|
390
|
+
target: "_blank",
|
|
391
|
+
rel: "noopener noreferrer"
|
|
392
|
+
}, toDisplayString(issue.title), 9 /* TEXT, PROPS */, _hoisted_35),
|
|
393
|
+
createElementVNode("div", _hoisted_36, [
|
|
394
|
+
(issue.status)
|
|
395
|
+
? (openBlock(), createBlock(_component_CnStatusBadge, {
|
|
396
|
+
key: 0,
|
|
397
|
+
label: $options.statusLabel(issue.status),
|
|
398
|
+
variant: $options.variantOf(issue.status)
|
|
399
|
+
}, null, 8 /* PROPS */, ["label", "variant"]))
|
|
400
|
+
: createCommentVNode("v-if", true),
|
|
401
|
+
(issue.opened)
|
|
402
|
+
? (openBlock(), createElementBlock("span", _hoisted_37, [
|
|
403
|
+
createVNode(_component_CalendarBlankOutline, { size: 14 }),
|
|
404
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Opened {date}', { date: issue.opened })), 1 /* TEXT */)
|
|
405
|
+
]))
|
|
406
|
+
: createCommentVNode("v-if", true),
|
|
407
|
+
createElementVNode("span", null, "#" + toDisplayString(issue.number), 1 /* TEXT */)
|
|
408
|
+
])
|
|
409
|
+
]))
|
|
410
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
411
|
+
]))
|
|
412
|
+
: (!$data.issuesLoading)
|
|
413
|
+
? (openBlock(), createElementBlock("p", _hoisted_38, toDisplayString($options.t('nextcloud-vue', 'No roadmap items yet')), 1 /* TEXT */))
|
|
414
|
+
: createCommentVNode("v-if", true),
|
|
415
|
+
($props.tabs)
|
|
416
|
+
? (openBlock(), createElementBlock("a", {
|
|
417
|
+
key: 2,
|
|
418
|
+
href: "#",
|
|
419
|
+
class: "cn-features-board__next-more",
|
|
420
|
+
"data-testid": "cn-features-board-whole-roadmap",
|
|
421
|
+
onClick: _cache[1] || (_cache[1] = withModifiers($event => ($data.activeTab = 'roadmap'), ["prevent"]))
|
|
422
|
+
}, [
|
|
423
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'See the whole roadmap')), 1 /* TEXT */),
|
|
424
|
+
createVNode(_component_ChevronRight, { size: 16 })
|
|
425
|
+
]))
|
|
426
|
+
: createCommentVNode("v-if", true),
|
|
427
|
+
($props.documentationUrl)
|
|
428
|
+
? (openBlock(), createElementBlock("a", {
|
|
429
|
+
key: 3,
|
|
430
|
+
href: $props.documentationUrl,
|
|
431
|
+
target: "_blank",
|
|
432
|
+
rel: "noopener noreferrer",
|
|
433
|
+
class: "cn-features-board__next-more"
|
|
434
|
+
}, [
|
|
435
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Documentation')), 1 /* TEXT */),
|
|
436
|
+
createVNode(_component_ChevronRight, { size: 16 })
|
|
437
|
+
], 8 /* PROPS */, _hoisted_39))
|
|
438
|
+
: createCommentVNode("v-if", true)
|
|
439
|
+
])
|
|
440
|
+
], 8 /* PROPS */, _hoisted_29))
|
|
441
|
+
: createCommentVNode("v-if", true)
|
|
442
|
+
]),
|
|
443
|
+
($props.notice)
|
|
444
|
+
? (openBlock(), createBlock(_component_NcNoteCard, {
|
|
445
|
+
key: 0,
|
|
446
|
+
type: "info",
|
|
447
|
+
class: "cn-features-board__notice",
|
|
448
|
+
"data-testid": "cn-features-board-notice"
|
|
449
|
+
}, {
|
|
450
|
+
default: withCtx(() => [
|
|
451
|
+
createTextVNode(toDisplayString($options.tr($props.notice)), 1 /* TEXT */)
|
|
452
|
+
]),
|
|
453
|
+
_: 1 /* STABLE */
|
|
454
|
+
}))
|
|
455
|
+
: createCommentVNode("v-if", true)
|
|
456
|
+
], 64 /* STABLE_FRAGMENT */))
|
|
457
|
+
], 10 /* CLASS, PROPS */, _hoisted_9)
|
|
458
|
+
], 2 /* CLASS */))
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
export { render };
|
|
462
|
+
//# sourceMappingURL=CnFeaturesBoard.vue3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnFeaturesBoard.vue3.js","sources":["../../../../src/components/CnFeaturesBoard/CnFeaturesBoard.vue?vue&type=template&id=f306c9ee&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-features-board\" :class=\"`cn-features-board--${layout}`\" data-testid=\"cn-features-board\">\n\t\t<header class=\"cn-features-board__header\">\n\t\t\t<div class=\"cn-features-board__title-row\">\n\t\t\t\t<h1 class=\"cn-features-board__title\">\n\t\t\t\t\t{{ resolvedTitle }}\n\t\t\t\t</h1>\n\t\t\t\t<div class=\"cn-features-board__header-actions\">\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tv-if=\"documentationButton && documentationUrl\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\tdata-testid=\"cn-features-board-docs\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<BookOpenVariant :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Documentation') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<CnBuildiqEditButton />\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tv-if=\"suggestUrl && suggestButton\"\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t:href=\"suggestUrl\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\tdata-testid=\"cn-features-board-suggest\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Suggest feature') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcActions\n\t\t\t\t\t\tv-if=\"!tabs\"\n\t\t\t\t\t\t:menuName=\"t('nextcloud-vue', 'Actions')\"\n\t\t\t\t\t\t:forceName=\"true\"\n\t\t\t\t\t\tdata-testid=\"cn-features-board-actions\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<DotsHorizontal :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\t\tv-for=\"action in menuLinks\"\n\t\t\t\t\t\t\t:key=\"action.key\"\n\t\t\t\t\t\t\t:href=\"action.href\"\n\t\t\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t\t\t{{ action.label }}\n\t\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t\t<NcActionButton @click=\"onSupport\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Support this app') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t</NcActions>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<p v-if=\"resolvedSubtitle\" class=\"cn-features-board__subtitle\" data-testid=\"cn-features-board-subtitle\">\n\t\t\t\t{{ resolvedSubtitle }}\n\t\t\t</p>\n\t\t</header>\n\n\t\t<div v-if=\"tabs\" class=\"cn-features-board__tab-row\">\n\t\t\t<div\n\t\t\t\tclass=\"cn-features-board__tabs\"\n\t\t\t\trole=\"tablist\"\n\t\t\t\t:aria-label=\"resolvedTitle\"\n\t\t\t\t@keydown=\"onTabKeydown\">\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"tab in tabList\"\n\t\t\t\t\t:id=\"`${uid}-tab-${tab.key}`\"\n\t\t\t\t\t:key=\"tab.key\"\n\t\t\t\t\tref=\"tabButtons\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\tclass=\"cn-features-board__tab\"\n\t\t\t\t\t:class=\"{ 'cn-features-board__tab--active': activeTab === tab.key }\"\n\t\t\t\t\t:aria-selected=\"activeTab === tab.key ? 'true' : 'false'\"\n\t\t\t\t\t:aria-controls=\"`${uid}-panel`\"\n\t\t\t\t\t:tabindex=\"activeTab === tab.key ? 0 : -1\"\n\t\t\t\t\t:data-testid=\"`cn-features-board-tab-${tab.key}`\"\n\t\t\t\t\t@click=\"activeTab = tab.key\">\n\t\t\t\t\t{{ tab.label }}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<NcActions\n\t\t\t\t:menuName=\"t('nextcloud-vue', 'Actions')\"\n\t\t\t\t:forceName=\"true\"\n\t\t\t\tclass=\"cn-features-board__tab-actions\"\n\t\t\t\tdata-testid=\"cn-features-board-actions\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<DotsHorizontal :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t<NcActionLink\n\t\t\t\t\tv-for=\"action in menuLinks\"\n\t\t\t\t\t:key=\"action.key\"\n\t\t\t\t\t:href=\"action.href\"\n\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t{{ action.label }}\n\t\t\t\t</NcActionLink>\n\t\t\t\t<NcActionButton @click=\"onSupport\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Support this app') }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<div\n\t\t\t:id=\"`${uid}-panel`\"\n\t\t\tclass=\"cn-features-board__panel\"\n\t\t\t:class=\"{ 'cn-features-board__panel--tabbed': tabs }\"\n\t\t\t:role=\"tabs ? 'tabpanel' : null\"\n\t\t\t:aria-labelledby=\"tabs ? `${uid}-tab-${activeTab}` : null\">\n\t\t\t<CnRoadmapTab v-if=\"tabs && activeTab === 'roadmap'\" :repo=\"repo\" />\n\t\t\t<template v-else>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"cn-features-board__filter\"\n\t\t\t\t\t:class=\"`cn-features-board__filter--${filter}`\"\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Status')\"\n\t\t\t\t\tdata-testid=\"cn-features-board-filter\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-for=\"option in filterOptions\"\n\t\t\t\t\t\t:key=\"option.key\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-features-board__filter-option\"\n\t\t\t\t\t\t:class=\"{ 'cn-features-board__filter-option--active': status === option.key }\"\n\t\t\t\t\t\t:aria-pressed=\"status === option.key ? 'true' : 'false'\"\n\t\t\t\t\t\t:data-status=\"option.key\"\n\t\t\t\t\t\t@click=\"status = option.key\">\n\t\t\t\t\t\t{{ option.label }}<span\n\t\t\t\t\t\t\tv-if=\"filter === 'chips'\"\n\t\t\t\t\t\t\tclass=\"cn-features-board__filter-count\"\n\t\t\t\t\t\t\tdata-testid=\"cn-features-board-filter-count\">{{ ' ' + option.count }}</span>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cn-features-board__body\">\n\t\t\t\t\t<div class=\"cn-features-board__groups\" :class=\"`cn-features-board__groups--${layout}`\">\n\t\t\t\t\t\t<p v-if=\"shownGroups.length === 0\" class=\"cn-features-board__empty\" data-testid=\"cn-features-board-empty\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'No features with this status') }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<section\n\t\t\t\t\t\t\tv-for=\"group in shownGroups\"\n\t\t\t\t\t\t\t:key=\"group.key\"\n\t\t\t\t\t\t\tclass=\"cn-features-board__group\"\n\t\t\t\t\t\t\t:aria-labelledby=\"group.label ? `${uid}-group-${group.key}` : null\"\n\t\t\t\t\t\t\t:aria-label=\"group.label ? null : resolvedTitle\"\n\t\t\t\t\t\t\tdata-testid=\"cn-features-board-group\"\n\t\t\t\t\t\t\t:data-group=\"group.key\">\n\t\t\t\t\t\t\t<div v-if=\"group.label\" class=\"cn-features-board__group-head\">\n\t\t\t\t\t\t\t\t<h2 :id=\"`${uid}-group-${group.key}`\" class=\"cn-features-board__group-title\">\n\t\t\t\t\t\t\t\t\t{{ group.label }}\n\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"layout === 'cards'\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-features-board__group-caption\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-features-board-group-caption\">{{ groupCaption(group) }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div v-if=\"layout === 'cards'\" class=\"cn-features-board__cards\">\n\t\t\t\t\t\t\t\t<article\n\t\t\t\t\t\t\t\t\tv-for=\"feature in group.shown\"\n\t\t\t\t\t\t\t\t\t:key=\"feature.slug\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-features-board__card\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-features-board-feature\">\n\t\t\t\t\t\t\t\t\t<div class=\"cn-features-board__card-head\">\n\t\t\t\t\t\t\t\t\t\t<h3 class=\"cn-features-board__card-title\">\n\t\t\t\t\t\t\t\t\t\t\t{{ feature.title }}\n\t\t\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t\t\t\t\t:label=\"statusText(feature)\"\n\t\t\t\t\t\t\t\t\t\t\t:variant=\"variantOf(feature.status)\"\n\t\t\t\t\t\t\t\t\t\t\tdata-testid=\"cn-features-board-status\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<p v-if=\"feature.summary\" class=\"cn-features-board__card-summary\">\n\t\t\t\t\t\t\t\t\t\t{{ feature.summary }}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<div v-if=\"readMoreHref(feature)\" class=\"cn-features-board__card-footer\">\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\tclass=\"cn-features-board__read-more\"\n\t\t\t\t\t\t\t\t\t\t\t:href=\"readMoreHref(feature)\"\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Learn more about {title}', { title: feature.title })\">\n\t\t\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Learn more') }}\n\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</article>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<ul v-else class=\"cn-features-board__rows\">\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tv-for=\"feature in group.shown\"\n\t\t\t\t\t\t\t\t\t:key=\"feature.slug\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-features-board__row\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-features-board-feature\">\n\t\t\t\t\t\t\t\t\t<span class=\"cn-features-board__row-text\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"cn-features-board__row-title\">{{ feature.title }}</span>\n\t\t\t\t\t\t\t\t\t\t<span v-if=\"feature.summary\" class=\"cn-features-board__row-summary\">{{ feature.summary }}</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t\t\t\t:label=\"statusText(feature)\"\n\t\t\t\t\t\t\t\t\t\t:variant=\"variantOf(feature.status)\"\n\t\t\t\t\t\t\t\t\t\tdata-testid=\"cn-features-board-status\" />\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</section>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<aside\n\t\t\t\t\t\tv-if=\"next > 0 && repo\"\n\t\t\t\t\t\tclass=\"cn-features-board__next\"\n\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Next on the roadmap')\"\n\t\t\t\t\t\tdata-testid=\"cn-features-board-next\">\n\t\t\t\t\t\t<section class=\"cn-features-board__next-card\">\n\t\t\t\t\t\t\t<div class=\"cn-features-board__next-head\">\n\t\t\t\t\t\t\t\t<RoadVariant :size=\"20\" />\n\t\t\t\t\t\t\t\t<h2 class=\"cn-features-board__next-title\">\n\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Coming next') }}\n\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p class=\"cn-features-board__next-lead\">\n\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'The most requested items from the issue tracker.') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<ol v-if=\"nextIssues.length > 0\" class=\"cn-features-board__next-list\">\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tv-for=\"issue in nextIssues\"\n\t\t\t\t\t\t\t\t\t:key=\"issue.number\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-features-board__next-item\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-features-board-next-item\">\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-features-board__next-link\"\n\t\t\t\t\t\t\t\t\t\t:href=\"safeHref(issue.html_url)\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\">{{ issue.title }}</a>\n\t\t\t\t\t\t\t\t\t<div class=\"cn-features-board__next-meta\">\n\t\t\t\t\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t\t\t\t\tv-if=\"issue.status\"\n\t\t\t\t\t\t\t\t\t\t\t:label=\"statusLabel(issue.status)\"\n\t\t\t\t\t\t\t\t\t\t\t:variant=\"variantOf(issue.status)\" />\n\t\t\t\t\t\t\t\t\t\t<span v-if=\"issue.opened\" class=\"cn-features-board__next-opened\">\n\t\t\t\t\t\t\t\t\t\t\t<CalendarBlankOutline :size=\"14\" />{{ t('nextcloud-vue', 'Opened {date}', { date: issue.opened }) }}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span>#{{ issue.number }}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t\t<p v-else-if=\"!issuesLoading\" class=\"cn-features-board__next-lead\" data-testid=\"cn-features-board-next-empty\">\n\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'No roadmap items yet') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\tv-if=\"tabs\"\n\t\t\t\t\t\t\t\thref=\"#\"\n\t\t\t\t\t\t\t\tclass=\"cn-features-board__next-more\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-features-board-whole-roadmap\"\n\t\t\t\t\t\t\t\t@click.prevent=\"activeTab = 'roadmap'\">\n\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'See the whole roadmap') }}<ChevronRight :size=\"16\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\tv-if=\"documentationUrl\"\n\t\t\t\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tclass=\"cn-features-board__next-more\">\n\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Documentation') }}<ChevronRight :size=\"16\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</section>\n\t\t\t\t\t</aside>\n\t\t\t\t</div>\n\n\t\t\t\t<NcNoteCard v-if=\"notice\"\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tclass=\"cn-features-board__notice\"\n\t\t\t\t\tdata-testid=\"cn-features-board-notice\">\n\t\t\t\t\t{{ tr(notice) }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { getLanguage, translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcButton, NcNoteCard } from '@nextcloud/vue'\nimport BookOpenVariant from 'vue-material-design-icons/BookOpenVariant.vue'\nimport CalendarBlankOutline from 'vue-material-design-icons/CalendarBlankOutline.vue'\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\nimport DotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport RoadVariant from 'vue-material-design-icons/RoadVariant.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport CnRoadmapTab from '../CnRoadmapTab/CnRoadmapTab.vue'\nimport CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'\nimport { formatBoardDate } from '../../utils/boardDate.js'\nimport { countByStatus, FEATURE_STATUS_VARIANTS, FEATURE_STATUSES, groupFeatures } from '../../utils/featureCatalog.js'\nimport { fetchRoadmapIssues, issueStatus } from '../../utils/roadmapIssues.js'\nimport { safeHref } from '../../utils/safeHref.js'\n\nlet featuresBoardUid = 0\n\n/**\n * Read the reader's language, which @nextcloud/l10n throws on outside a\n * Nextcloud page.\n *\n * @return {string} The language tag, or ''.\n */\nfunction readerLanguage() {\n\ttry {\n\t\treturn getLanguage() || ''\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/**\n * CnFeaturesBoard - the Features and roadmap page in the board look.\n *\n * A title with a subtitle, optional folder tabs (Features, Roadmap), a status\n * filter (count chips or a segmented control), the features grouped by\n * category (as two-up cards or as rows inside one card per group), an\n * optional \"Next\" card with the most requested forge issues, and an optional\n * notice under the groups. The links the default look puts in its right-hand\n * sidebar (suggest, buildiq, AI skills, support) sit in an Actions menu.\n *\n * Rendered by CnFeaturesAndRoadmapView when the page is in the board look.\n *\n * @spec openspec/changes/screens-roadmap-board-look/specs/features-roadmap-board-look/spec.md\n *\n * @event support Emitted when the reader picks \"Support this app\" in the Actions menu.\n */\nexport default {\n\tname: 'CnFeaturesBoard',\n\n\tcomponents: {\n\t\tBookOpenVariant,\n\t\tCalendarBlankOutline,\n\t\tChevronRight,\n\t\tCnBuildiqEditButton,\n\t\tCnRoadmapTab,\n\t\tCnStatusBadge,\n\t\tDotsHorizontal,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActions,\n\t\tNcButton,\n\t\tNcNoteCard,\n\t\tPlus,\n\t\tRoadVariant,\n\t},\n\n\tinject: {\n\t\t/** The app's translate function, provided by CnAppRoot. Identity outside one. */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** The features: `{ slug, title, summary, status, category, expected, docsUrl, title_<lang>, summary_<lang> }`. */\n\t\tfeatures: { type: Array, default: () => [] },\n\t\t/** Category key to caption; sets the order of the groups. */\n\t\tcategories: { type: Object, default: () => ({}) },\n\t\t/** `cards`: a section per category with two-up feature cards. `rows`: one card per category with a row per feature. */\n\t\tlayout: {\n\t\t\ttype: String,\n\t\t\tdefault: 'cards',\n\t\t\tvalidator: (value) => ['cards', 'rows'].includes(value),\n\t\t},\n\n\t\t/** Show the Features and Roadmap folder tabs. */\n\t\ttabs: { type: Boolean, default: true },\n\t\t/** `chips`: pill buttons with a count. `segmented`: a segmented control without counts. */\n\t\tfilter: {\n\t\t\ttype: String,\n\t\t\tdefault: 'chips',\n\t\t\tvalidator: (value) => ['chips', 'segmented'].includes(value),\n\t\t},\n\n\t\t/** Overrides of the status labels, by key (`all`, `available`, `beta`, `in_progress`, `planned`). */\n\t\tstatusLabels: { type: Object, default: () => ({}) },\n\t\t/** How many issues the Next card lists; 0 hides the card. */\n\t\tnext: { type: Number, default: 3 },\n\t\t/** Forge label to issue status (`in_progress`, `planned`) for the badges in the Next card. */\n\t\tissueLabels: { type: Object, default: () => ({}) },\n\t\t/** `<owner>/<repo>` on the forge, for the Roadmap tab and the Next card. */\n\t\trepo: { type: String, default: '' },\n\t\t/** Page title. */\n\t\ttitle: { type: String, default: '' },\n\t\t/** Subtitle template; `{count}` is the number of features and `{appVersion}` the app version. */\n\t\tsubtitle: { type: String, default: '' },\n\t\t/** The app version, for `{appVersion}` in the subtitle. */\n\t\tappVersion: { type: String, default: '' },\n\t\t/** An info notice under the groups. */\n\t\tnotice: { type: String, default: '' },\n\t\t/** The app's documentation site: the Next card's link and the target of \"Learn more\". */\n\t\tdocumentationUrl: { type: String, default: '' },\n\t\t/** Show a Documentation button in the header. */\n\t\tdocumentationButton: { type: Boolean, default: false },\n\t\t/** The feature-request form; the header's primary button. */\n\t\tsuggestUrl: { type: String, default: '' },\n\t\t/** Show the feature-request form as the header's primary button; without it, it is an entry in the Actions menu. */\n\t\tsuggestButton: { type: Boolean, default: true },\n\t\t/** Target of the OpenBuilt entry in the Actions menu. */\n\t\topenbuiltUrl: { type: String, default: '' },\n\t\t/** Target of the AI skills entry in the Actions menu. */\n\t\tllmSkillsUrl: { type: String, default: '' },\n\t},\n\n\temits: ['support'],\n\n\tdata() {\n\t\tfeaturesBoardUid += 1\n\t\treturn {\n\t\t\tuid: `cn-features-board-${featuresBoardUid}`,\n\t\t\tactiveTab: 'features',\n\t\t\tstatus: 'all',\n\t\t\tissues: [],\n\t\t\tissuesLoading: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tlanguage() {\n\t\t\treturn readerLanguage()\n\t\t},\n\n\t\tgroups() {\n\t\t\treturn groupFeatures(this.features, this.categories, this.language)\n\t\t},\n\n\t\tallFeatures() {\n\t\t\treturn this.groups.flatMap((group) => group.features)\n\t\t},\n\n\t\tcounts() {\n\t\t\treturn countByStatus(this.allFeatures)\n\t\t},\n\n\t\t/** The groups with the features the filter lets through; an emptied group is left out. */\n\t\tshownGroups() {\n\t\t\treturn this.groups\n\t\t\t\t.map((group) => ({\n\t\t\t\t\t...group,\n\t\t\t\t\tshown: this.status === 'all' ? group.features : group.features.filter((feature) => feature.status === this.status),\n\t\t\t\t}))\n\t\t\t\t.filter((group) => group.shown.length > 0)\n\t\t},\n\n\t\t/** All, then each status; `in_progress` only when a feature has it. */\n\t\tfilterOptions() {\n\t\t\tconst options = [{ key: 'all', label: this.statusLabel('all'), count: this.counts.all }]\n\t\t\tfor (const key of FEATURE_STATUSES) {\n\t\t\t\tif (key === 'in_progress' && this.counts.in_progress === 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\toptions.push({ key, label: this.statusLabel(key), count: this.counts[key] })\n\t\t\t}\n\t\t\treturn options\n\t\t},\n\n\t\ttabList() {\n\t\t\treturn [\n\t\t\t\t{ key: 'features', label: t('nextcloud-vue', 'Features') },\n\t\t\t\t{ key: 'roadmap', label: t('nextcloud-vue', 'Roadmap') },\n\t\t\t]\n\t\t},\n\n\t\tresolvedTitle() {\n\t\t\treturn this.title ? this.tr(this.title) : t('nextcloud-vue', 'Features and roadmap')\n\t\t},\n\n\t\tresolvedSubtitle() {\n\t\t\tif (!this.subtitle) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn this.tr(this.subtitle)\n\t\t\t\t.replace(/\\{count\\}/g, String(this.counts.all))\n\t\t\t\t.replace(/\\{appVersion\\}/g, this.appVersion)\n\t\t},\n\n\t\tmenuLinks() {\n\t\t\tconst links = []\n\t\t\tif (this.suggestUrl && !this.suggestButton) {\n\t\t\t\tlinks.push({ key: 'suggest', href: this.suggestUrl, label: t('nextcloud-vue', 'Suggest feature') })\n\t\t\t}\n\t\t\tif (this.openbuiltUrl) {\n\t\t\t\tlinks.push({ key: 'openbuilt', href: this.openbuiltUrl, label: t('nextcloud-vue', 'Build on this app') })\n\t\t\t}\n\t\t\tif (this.llmSkillsUrl) {\n\t\t\t\tlinks.push({ key: 'llm', href: this.llmSkillsUrl, label: t('nextcloud-vue', 'AI skills') })\n\t\t\t}\n\t\t\treturn links\n\t\t},\n\n\t\tnextIssues() {\n\t\t\treturn this.issues.slice(0, this.next).map((issue) => ({\n\t\t\t\tnumber: issue.number,\n\t\t\t\ttitle: issue.title,\n\t\t\t\thtml_url: issue.html_url,\n\t\t\t\tstatus: issueStatus(issue, this.issueLabels),\n\t\t\t\topened: issue.created_at ? formatBoardDate(issue.created_at) : '',\n\t\t\t}))\n\t\t},\n\t},\n\n\tmounted() {\n\t\tif (this.next > 0 && this.repo) {\n\t\t\tthis.loadIssues()\n\t\t}\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tsafeHref,\n\n\t\t/**\n\t\t * Run an app-supplied string through the app's translate function.\n\t\t *\n\t\t * @param {string} key The string.\n\t\t * @return {string} The translated string.\n\t\t */\n\t\ttr(key) {\n\t\t\treturn this.cnTranslate(key)\n\t\t},\n\n\t\t/**\n\t\t * The label of a status, or of `all`: the app's override, else the library's.\n\t\t *\n\t\t * @param {string} key The status key.\n\t\t * @return {string} The label.\n\t\t */\n\t\tstatusLabel(key) {\n\t\t\tif (typeof this.statusLabels[key] === 'string' && this.statusLabels[key] !== '') {\n\t\t\t\treturn this.tr(this.statusLabels[key])\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tall: t('nextcloud-vue', 'All'),\n\t\t\t\tavailable: t('nextcloud-vue', 'Available'),\n\t\t\t\tbeta: t('nextcloud-vue', 'Beta'),\n\t\t\t\tin_progress: t('nextcloud-vue', 'In progress'),\n\t\t\t\tplanned: t('nextcloud-vue', 'Planned'),\n\t\t\t}[key] || key\n\t\t},\n\n\t\t/**\n\t\t * The badge text of a feature: its status, with the expected moment\n\t\t * when it has one (\"Planned, Q4 2026\").\n\t\t *\n\t\t * @param {{status: string, expected: string}} feature The feature.\n\t\t * @return {string} The badge text.\n\t\t */\n\t\tstatusText(feature) {\n\t\t\tconst label = this.statusLabel(feature.status)\n\t\t\treturn feature.expected ? t('nextcloud-vue', '{status}, {expected}', { status: label, expected: feature.expected }) : label\n\t\t},\n\n\t\t/**\n\t\t * The badge variant of a status.\n\t\t *\n\t\t * @param {string} status The status key.\n\t\t * @return {string} The CnStatusBadge variant.\n\t\t */\n\t\tvariantOf(status) {\n\t\t\treturn FEATURE_STATUS_VARIANTS[status] || 'default'\n\t\t},\n\n\t\t/**\n\t\t * \"14 features, 14 available\": the group's size, then each status it holds.\n\t\t *\n\t\t * @param {{features: Array<{status: string}>}} group The group.\n\t\t * @return {string} The caption.\n\t\t */\n\t\tgroupCaption(group) {\n\t\t\tconst counts = countByStatus(group.features)\n\t\t\tconst parts = [n('nextcloud-vue', '%n feature', '%n features', counts.all)]\n\t\t\tfor (const key of FEATURE_STATUSES) {\n\t\t\t\tif (counts[key] > 0) {\n\t\t\t\t\tparts.push(`${counts[key]} ${this.statusLabel(key).toLocaleLowerCase()}`)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn parts.join(', ')\n\t\t},\n\n\t\t/**\n\t\t * Where \"Learn more\" goes: the feature's own page when it is a web\n\t\t * address, else the documentation site, else nowhere.\n\t\t *\n\t\t * @param {{docsUrl: string}} feature The feature.\n\t\t * @return {string} The address, or ''.\n\t\t */\n\t\treadMoreHref(feature) {\n\t\t\tif (/^https?:\\/\\//i.test(feature.docsUrl)) {\n\t\t\t\treturn safeHref(feature.docsUrl)\n\t\t\t}\n\t\t\treturn this.documentationUrl ? safeHref(this.documentationUrl) : ''\n\t\t},\n\n\t\t/** Ask the host to open the support dialog. */\n\t\tonSupport() {\n\t\t\t/**\n\t\t\t * @event support Emitted when the reader picks \"Support this app\" in the Actions menu.\n\t\t\t */\n\t\t\tthis.$emit('support')\n\t\t},\n\n\t\t/** Fetch the forge issues for the Next card. */\n\t\tasync loadIssues() {\n\t\t\tthis.issuesLoading = true\n\t\t\tconst { items } = await fetchRoadmapIssues(this.repo)\n\t\t\tthis.issues = items\n\t\t\tthis.issuesLoading = false\n\t\t},\n\n\t\t/**\n\t\t * Arrow keys, Home and End move between the folder tabs.\n\t\t *\n\t\t * @param {KeyboardEvent} event The key press.\n\t\t */\n\t\tonTabKeydown(event) {\n\t\t\tconst keys = this.tabList.map((tab) => tab.key)\n\t\t\tconst index = keys.indexOf(this.activeTab)\n\t\t\tconst target = {\n\t\t\t\tArrowRight: (index + 1) % keys.length,\n\t\t\t\tArrowLeft: (index - 1 + keys.length) % keys.length,\n\t\t\t\tHome: 0,\n\t\t\t\tEnd: keys.length - 1,\n\t\t\t}[event.key]\n\t\t\tif (target === undefined) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.activeTab = keys[target]\n\t\t\tthis.$nextTick(() => this.$refs.tabButtons?.[target]?.focus())\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-features-board {\n\tbox-sizing: border-box;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--cn-board-section-gap, 20px);\n\tpadding: var(--cn-board-content-padding, 24px 28px);\n\tmax-width: 1240px;\n\twidth: 100%;\n}\n\n.cn-features-board__header {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n\tpadding: 4px 0 8px;\n}\n\n.cn-features-board__title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: space-between;\n\talign-items: flex-start;\n\tgap: 12px 24px;\n}\n\n.cn-features-board__title {\n\tflex: 1 1 320px;\n\tmin-width: 0;\n\tmargin: 0;\n\tfont-size: 28px;\n\tfont-weight: 700;\n\tline-height: 1.2;\n}\n\n.cn-features-board__header-actions {\n\tflex: none;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 10px;\n}\n\n.cn-features-board__subtitle {\n\tmargin: 0;\n\tfont-size: 15px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-features-board__tab-row {\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: 8px;\n\tmargin-bottom: calc(-1 * var(--cn-board-section-gap, 20px));\n}\n\n.cn-features-board__tabs {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n\tflex: 1 1 auto;\n\tmin-width: 0;\n}\n\n.cn-features-board__tab {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tbox-sizing: border-box;\n\tmin-height: 34px;\n\tmargin: 0 0 -1px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--cn-board-hairline, var(--color-border));\n\tborder-bottom: none;\n\tborder-radius: 8px 8px 0 0;\n\tbackground: var(--color-background-dark);\n\tcolor: var(--color-main-text);\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tcursor: pointer;\n\twhite-space: nowrap;\n}\n\n.cn-features-board__tab--active {\n\tposition: relative;\n\tbackground: var(--color-main-background);\n\tborder-bottom: 1px solid var(--color-main-background);\n\tfont-weight: 700;\n}\n\n.cn-features-board__tab-actions {\n\tflex: none;\n\talign-self: flex-start;\n\tmargin: 0 8px 8px 0;\n}\n\n.cn-features-board__panel {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 22px;\n}\n\n.cn-features-board__panel--tabbed {\n\tpadding: 22px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: 0 var(--cn-board-card-radius, 12px) var(--cn-board-card-radius, 12px) var(--cn-board-card-radius, 12px);\n\tbackground: var(--color-main-background);\n}\n\n.cn-features-board__filter {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-features-board__filter-option {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tmargin: 0;\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tcursor: pointer;\n}\n\n.cn-features-board__filter--chips .cn-features-board__filter-option {\n\theight: 36px;\n\tpadding: 0 14px;\n\tborder: 1px solid var(--color-border-dark);\n\tborder-radius: 18px;\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n}\n\n.cn-features-board__filter--chips .cn-features-board__filter-option--active {\n\tborder-color: var(--color-main-text);\n\tbackground: var(--color-main-text);\n\tcolor: var(--color-main-background);\n}\n\n.cn-features-board__filter-count {\n\tfont-weight: 400;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-features-board__filter--chips .cn-features-board__filter-option--active .cn-features-board__filter-count {\n\tcolor: var(--color-border-dark);\n}\n\n.cn-features-board__filter--segmented {\n\tdisplay: inline-flex;\n\talign-self: flex-start;\n\tgap: 2px;\n\tpadding: 3px;\n\tborder-radius: 8px;\n\tbackground: var(--color-background-dark);\n}\n\n.cn-features-board__filter--segmented .cn-features-board__filter-option {\n\theight: 34px;\n\tpadding: 0 14px;\n\tborder: 0;\n\tborder-radius: 6px;\n\tbackground: transparent;\n\tcolor: var(--color-main-text);\n}\n\n.cn-features-board__filter--segmented .cn-features-board__filter-option--active {\n\tbackground: var(--color-main-background);\n\tbox-shadow: 0 1px 2px rgba(27, 28, 29, 0.12);\n}\n\n.cn-features-board__body {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-start;\n\tgap: 24px;\n}\n\n.cn-features-board__groups {\n\tflex: 999 1 520px;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 26px;\n}\n\n.cn-features-board__groups--rows {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(340px, 1fr));\n\tgap: 20px;\n}\n\n.cn-features-board__group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tmax-width: none;\n\tmargin: 0;\n}\n\n.cn-features-board__groups--rows .cn-features-board__group {\n\tpadding: var(--cn-board-card-padding, 20px 22px);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--cn-board-card-radius, 12px);\n\tbackground: var(--color-main-background);\n}\n\n.cn-features-board__group-head {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tgap: 10px;\n}\n\n.cn-features-board__group-title {\n\tmargin: 0;\n\tfont-size: 18px;\n\tfont-weight: 700;\n}\n\n.cn-features-board__groups--rows .cn-features-board__group-title {\n\tfont-size: 17px;\n}\n\n.cn-features-board__group-caption {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-features-board__cards {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n\tgap: 16px;\n}\n\n.cn-features-board__card {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tpadding: 18px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--cn-board-card-radius, 12px);\n\tbackground: var(--color-main-background);\n}\n\n.cn-features-board__card-head {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: flex-start;\n\tgap: 4px;\n}\n\n.cn-features-board__card-title {\n\tmargin: 0;\n\tfont-size: 17px;\n\tfont-weight: 700;\n\tline-height: 1.3;\n}\n\n.cn-features-board__card-summary {\n\tmargin: 0;\n\tfont-size: 14px;\n\tcolor: var(--color-main-text);\n}\n\n.cn-features-board__card-footer {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\tmin-height: 34px;\n\tmargin-top: auto;\n\tpadding-top: 10px;\n\tborder-top: 1px solid var(--color-background-dark);\n}\n\n.cn-features-board__read-more {\n\tdisplay: inline-flex;\n\talign-items: center;\n\theight: 34px;\n\tpadding: 0 12px;\n\tborder: 1px solid var(--color-border-dark);\n\tborder-radius: 8px;\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\tfont-size: 14px;\n\tfont-weight: 600;\n\ttext-decoration: none;\n}\n\n.cn-features-board__rows {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-features-board__row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 6px 16px;\n\tpadding: 10px 0;\n\tborder-top: 1px solid var(--color-background-dark);\n}\n\n.cn-features-board__row-text {\n\tflex: 1 1 240px;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n.cn-features-board__row-title {\n\tfont-size: 15px;\n\tfont-weight: 500;\n}\n\n.cn-features-board__row-summary {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-features-board__next {\n\tflex: 1 1 280px;\n\tmin-width: 0;\n\tmax-width: 340px;\n}\n\n.cn-features-board__next-card {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 18px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--cn-board-card-radius, 12px);\n\tbackground: var(--color-background-hover);\n}\n\n.cn-features-board__next-head {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-features-board__next-title {\n\tmargin: 0;\n\tfont-size: 18px;\n\tfont-weight: 700;\n}\n\n.cn-features-board__next-lead {\n\tmargin: 0;\n\tfont-size: 14px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-features-board__next-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-features-board__next-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n\tpadding: 12px 14px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: 10px;\n\tbackground: var(--color-main-background);\n}\n\n.cn-features-board__next-link {\n\tfont-size: 15px;\n\tfont-weight: 600;\n\tline-height: 1.3;\n\tcolor: var(--color-main-text);\n\ttext-decoration: none;\n}\n\n.cn-features-board__next-meta {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px;\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-features-board__next-opened {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n}\n\n.cn-features-board__next-more {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.cn-features-board__empty {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-features-board__notice {\n\tmargin: 0;\n}\n</style>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createBlock","_createVNode","_createTextVNode","_Fragment","_renderList","_openBlock"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import script from './CnFormDialog.vue2.js';
|
|
|
2
2
|
import { render } from './CnFormDialog.vue3.js';
|
|
3
3
|
|
|
4
4
|
script.render = render;
|
|
5
|
-
script.__scopeId = "data-v-
|
|
5
|
+
script.__scopeId = "data-v-65a5754f";
|
|
6
6
|
const __sfc_main = script;
|
|
7
7
|
|
|
8
8
|
export { __sfc_main as default };
|