@conduction/docusaurus-preset 3.34.0 → 3.36.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/ANIMATION_ROADMAP.md +129 -0
- package/MISSING_COMPONENTS.md +13 -4
- package/package.json +3 -2
- package/src/components/AppMock/AppMock.jsx +14 -14
- package/src/components/AppMock/AppMock.module.css +1270 -7
- package/src/components/AppMock/__tests__/AppMock.render.test.js +148 -0
- package/src/components/AppMock/variants/AppVersionsMock.jsx +1 -1
- package/src/components/AppMock/variants/DeciDeskMock.jsx +47 -6
- package/src/components/AppMock/variants/DocuDeskMock.jsx +40 -10
- package/src/components/AppMock/variants/DoriathMock.jsx +29 -14
- package/src/components/AppMock/variants/HermiqMock.jsx +35 -15
- package/src/components/AppMock/variants/HrmqMock.jsx +46 -28
- package/src/components/AppMock/variants/LarpingAppMock.jsx +14 -4
- package/src/components/AppMock/variants/LaunchPadWidgetsMock.jsx +3 -3
- package/src/components/AppMock/variants/NLDesignMock.jsx +1 -1
- package/src/components/AppMock/variants/OpenBuildMock.jsx +21 -6
- package/src/components/AppMock/variants/OpenCatalogiMock.jsx +23 -4
- package/src/components/AppMock/variants/OpenConnectorMock.jsx +26 -4
- package/src/components/AppMock/variants/OpenRegisterMock.jsx +13 -2
- package/src/components/AppMock/variants/PlanixMock.jsx +1 -1
- package/src/components/AppMock/variants/ProcestMock.jsx +36 -9
- package/src/components/AppMock/variants/ScholiqMock.jsx +1 -1
- package/src/components/AppMock/variants/ShillinqMock.jsx +33 -17
- package/src/components/AppMock/variants/SoftwareCatalogMock.jsx +16 -6
- package/src/components/AppMock/variants/ZaakAfhandelAppMock.jsx +19 -4
- package/src/components/BuildMock/BuildMock.jsx +3 -3
- package/src/components/FeaturesPage/FeaturesPage.jsx +3 -3
- package/src/components/IntegrationIcon/registry.js +3 -3
- package/src/components/LeafCard/LeafCard.jsx +2 -2
- package/src/components/NextSteps/NextSteps.jsx +1 -1
- package/src/components/PartnerDirectory/PartnerDirectory.jsx +1 -1
- package/src/components/Pipeline/Pipeline.jsx +2 -2
- package/src/components/PlatformOverview/PlatformOverview.module.css +1 -1
- package/src/components/SidebarMock/SidebarMock.jsx +38 -11
- package/src/components/SidebarMock/SidebarMock.module.css +1 -1
- package/src/components/SidebarMock/__tests__/SidebarMock.render.test.js +115 -0
- package/src/components/SidebarMock/variants/DeciDeskDecision.jsx +1 -1
- package/src/components/SidebarMock/variants/DocuDeskPiiMap.jsx +1 -1
- package/src/components/SidebarMock/variants/DocuDeskSignatures.jsx +1 -1
- package/src/components/SidebarMock/variants/OpenConnectorRunDetail.jsx +1 -1
- package/src/components/SidebarMock/variants/ProcestTimeline.jsx +1 -1
- package/src/components/SidebarMock/variants/ProcestXWiki.jsx +2 -2
- package/src/components/SolutionCard/SolutionCard.jsx +1 -1
- package/src/components/WidgetMock/WidgetMock.jsx +37 -16
- package/src/components/WidgetMock/__tests__/WidgetMock.render.test.js +125 -0
- package/src/components/WidgetMock/variants/DeciDeskActions.jsx +1 -1
- package/src/components/WidgetMock/variants/DocuDeskAnonymise.jsx +7 -2
- package/src/components/WidgetMock/variants/DocuDeskPendingSign.jsx +1 -1
- package/src/components/WidgetMock/variants/OpenConnectorRuns.jsx +1 -1
- package/src/components/WidgetMock/variants/ProcestDueToday.jsx +1 -1
- package/src/components/WidgetMock/variants/ProcestWerkvoorraad.jsx +1 -1
- package/src/components/WidgetShelf/WidgetShelf.jsx +1 -1
- package/src/data/apps-registry.js +15 -15
- package/src/diagrams/cn-pair.js +1 -1
- package/src/theme/brand.jsx +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* <BuildMock />
|
|
3
3
|
*
|
|
4
|
-
* Token-built abstract of the
|
|
4
|
+
* Token-built abstract of the Buildiq "make it yours" moment: the
|
|
5
5
|
* orange edit button gets pressed, a small component palette opens, a
|
|
6
6
|
* widget is picked and dragged onto the page, and it snaps into the
|
|
7
7
|
* empty layout slot. Loops every ~8 seconds. Used on every app's
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Same abstraction level as <AppMock>: greeked content, tokens only.
|
|
11
11
|
* The orange FAB is this component's single orange accent (it *is*
|
|
12
|
-
* the
|
|
12
|
+
* the Buildiq edit button).
|
|
13
13
|
*
|
|
14
14
|
* `prefers-reduced-motion: reduce` (and `running={false}`) renders
|
|
15
15
|
* the static end state: palette closed, cursor gone, the dragged
|
|
@@ -75,7 +75,7 @@ export default function BuildMock({size = 'md', caption, running = true, classNa
|
|
|
75
75
|
<span className={styles.paletteTile} />
|
|
76
76
|
</div>
|
|
77
77
|
|
|
78
|
-
{/* The
|
|
78
|
+
{/* The Buildiq edit button — the one orange accent. */}
|
|
79
79
|
<div className={styles.fab}>
|
|
80
80
|
<svg viewBox="0 0 24 24" aria-hidden="true">
|
|
81
81
|
<path d="M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z" />
|
|
@@ -32,9 +32,9 @@ import FeatureGrid from '../FeatureGrid/FeatureGrid.jsx';
|
|
|
32
32
|
const PROVIDER_NAMES = {
|
|
33
33
|
openregister: 'OpenRegister',
|
|
34
34
|
opencatalogi: 'OpenCatalogi',
|
|
35
|
-
openconnector: '
|
|
36
|
-
docudesk: '
|
|
37
|
-
nldesign: '
|
|
35
|
+
openconnector: 'Integriq',
|
|
36
|
+
docudesk: 'Filinq',
|
|
37
|
+
nldesign: 'Thematiq',
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
function providerCredit(providedBy, locale) {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* Conduction integrates with (xWiki, n8n, Windmill, OpenProject,
|
|
18
18
|
* Keycloak).
|
|
19
19
|
* llm — large-language-model providers we consume via
|
|
20
|
-
*
|
|
20
|
+
* Integriq / Filinq (Claude, Mistral, Ollama, OpenAI,
|
|
21
21
|
* Gemini).
|
|
22
22
|
* conduction-ext — external apps in the Conduction Nextcloud
|
|
23
23
|
* ecosystem (OpenTalk, Matrix, Mattermost, OpenExchange).
|
|
@@ -146,7 +146,7 @@ export const INTEGRATIONS = {
|
|
|
146
146
|
|
|
147
147
|
export const INTEGRATION_CATEGORIES = {
|
|
148
148
|
'nextcloud-bundled': { label: 'Nextcloud bundled', desc: 'Surfaces every Nextcloud workspace already ships.' },
|
|
149
|
-
'workflow': { label: 'Workflow & auth', desc: 'Third-party tools we wire into Conduction apps via
|
|
150
|
-
'llm': { label: 'LLM providers', desc: 'Models we call from
|
|
149
|
+
'workflow': { label: 'Workflow & auth', desc: 'Third-party tools we wire into Conduction apps via Integriq.' },
|
|
150
|
+
'llm': { label: 'LLM providers', desc: 'Models we call from Integriq and Filinq.' },
|
|
151
151
|
'conduction-ext': { label: 'Conduction extensions', desc: 'Adjacent apps in the Conduction Nextcloud ecosystem.' },
|
|
152
152
|
};
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* orange for the one accent-leaf when grouped). Falls back to the
|
|
17
17
|
* `id` initial when no icon is given.
|
|
18
18
|
* - Status pill colours: green = backend-ready, amber = stub,
|
|
19
|
-
* cobalt = external (
|
|
19
|
+
* cobalt = external (Integriq-routed), grey = built-in.
|
|
20
20
|
*
|
|
21
21
|
* Usage in MDX:
|
|
22
22
|
*
|
|
@@ -46,7 +46,7 @@ import styles from './LeafCard.module.css';
|
|
|
46
46
|
const STATUS_LABELS = {
|
|
47
47
|
'backend-ready': 'Backend ready',
|
|
48
48
|
'stub': 'Provider stub',
|
|
49
|
-
'external': 'External (
|
|
49
|
+
'external': 'External (Integriq)',
|
|
50
50
|
'built-in': 'Built-in',
|
|
51
51
|
};
|
|
52
52
|
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* {href: '/partners/acato', tier: 'certified', name: 'Acato',
|
|
24
24
|
* logo: '/img/partners/acato.png',
|
|
25
25
|
* summary: <>Digital agency uit Almere…</>,
|
|
26
|
-
* apps: ['OpenCatalogi', 'OpenRegister', '
|
|
26
|
+
* apps: ['OpenCatalogi', 'OpenRegister', 'Integriq'],
|
|
27
27
|
* solutions: ['woo']},
|
|
28
28
|
* …
|
|
29
29
|
* ]}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* threading through every hex equator.
|
|
11
11
|
*
|
|
12
12
|
* Family palette follows the locked PRISM-FAMILY POLICY in tokens.css:
|
|
13
|
-
* mint integrate / connect (
|
|
13
|
+
* mint integrate / connect (Integriq)
|
|
14
14
|
* forest data / registers (OpenRegister)
|
|
15
15
|
* terracotta documents / search (OpenCatalogi)
|
|
16
16
|
* lavender process / views (LaunchPad)
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* {label: 'Legacy', icon: 'legacy'},
|
|
37
37
|
* ]}}
|
|
38
38
|
* steps={[
|
|
39
|
-
* {number: '01', kicker: 'Ingest', name: '
|
|
39
|
+
* {number: '01', kicker: 'Ingest', name: 'Integriq',
|
|
40
40
|
* caption: 'Pulls schemas, REST, SOAP, files.'},
|
|
41
41
|
* {number: 'PLATFORM', name: 'Nextcloud', family: 'workspace',
|
|
42
42
|
* pill: 'files · users · auth'},
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
.section {
|
|
7
7
|
background: white;
|
|
8
8
|
/* Bottom padding deliberately lighter than top: the diagram's
|
|
9
|
-
orange-dashed flow lines around
|
|
9
|
+
orange-dashed flow lines around Buildiq extend visually below
|
|
10
10
|
the last text label, so the section already has ~80px of optical
|
|
11
11
|
trailing space from the diagram itself before any padding kicks
|
|
12
12
|
in. Top stays at 96px to keep the rhythm coming in from the
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Token-painted abstract of the Nextcloud right-side detail panel.
|
|
5
5
|
* Each Conduction app registers tabs into specific Nextcloud
|
|
6
|
-
* sidebars (
|
|
7
|
-
*
|
|
6
|
+
* sidebars (Dossiq adds xWiki + Timeline tabs to the case sidebar,
|
|
7
|
+
* Filinq adds Signatures + PII Map to the document sidebar, and
|
|
8
8
|
* so on). A SidebarMock variant represents one such sidebar with
|
|
9
9
|
* one tab active.
|
|
10
10
|
*
|
|
@@ -53,7 +53,20 @@
|
|
|
53
53
|
* .smFrame chrome so the
|
|
54
54
|
* panel slots into
|
|
55
55
|
* AppMock's .body layout
|
|
56
|
+
* - running: boolean (default true) — false freezes the panel
|
|
57
|
+
* animation on its settled
|
|
58
|
+
* end state (same rendering
|
|
59
|
+
* prefers-reduced-motion
|
|
60
|
+
* gives)
|
|
56
61
|
* - className: string
|
|
62
|
+
*
|
|
63
|
+
* Animation (wave 5, `.sbLive` in AppMock.module.css): the panel
|
|
64
|
+
* slides in from the right, the head title/description wipe in, the
|
|
65
|
+
* active-tab underline travels from the neighbouring tab to the
|
|
66
|
+
* active one — positioned by the `--sb-ix` / `--sb-n` custom
|
|
67
|
+
* properties the component sets from the variant's active index —
|
|
68
|
+
* and the body rows land in a stagger. Base styles are the opened,
|
|
69
|
+
* settled panel.
|
|
57
70
|
*/
|
|
58
71
|
|
|
59
72
|
import React from 'react';
|
|
@@ -85,13 +98,13 @@ import NextcloudActivity from './variants/NextcloudActivity.jsx';
|
|
|
85
98
|
* SidebarMock renders that icon in the tab's .ico slot, tinted via
|
|
86
99
|
* currentColor so active tabs read full-cobalt and inactive tabs
|
|
87
100
|
* read muted-cobalt. The icon makes the tab self-documenting:
|
|
88
|
-
*
|
|
101
|
+
* Dossiq's xWiki tab carries the xWiki icon, Filinq's Signatures
|
|
89
102
|
* tab carries an activity-style icon for "stuff happens here", etc.
|
|
90
103
|
*/
|
|
91
104
|
const VARIANTS = {
|
|
92
105
|
'procest-xwiki': {
|
|
93
106
|
Component: ProcestXWiki,
|
|
94
|
-
label: '
|
|
107
|
+
label: 'Dossiq · Case sidebar, xWiki tab',
|
|
95
108
|
tabs: [
|
|
96
109
|
{ id: 'activity', active: false, icon: 'activity' },
|
|
97
110
|
{ id: 'xwiki', active: true, icon: 'xwiki' },
|
|
@@ -101,7 +114,7 @@ const VARIANTS = {
|
|
|
101
114
|
},
|
|
102
115
|
'procest-timeline': {
|
|
103
116
|
Component: ProcestTimeline,
|
|
104
|
-
label: '
|
|
117
|
+
label: 'Dossiq · Case sidebar, Timeline tab',
|
|
105
118
|
tabs: [
|
|
106
119
|
{ id: 'activity', active: false, icon: 'activity' },
|
|
107
120
|
{ id: 'xwiki', active: false, icon: 'xwiki' },
|
|
@@ -111,7 +124,7 @@ const VARIANTS = {
|
|
|
111
124
|
},
|
|
112
125
|
'docudesk-signatures': {
|
|
113
126
|
Component: DocuDeskSignatures,
|
|
114
|
-
label: '
|
|
127
|
+
label: 'Filinq · Document sidebar, Signatures tab',
|
|
115
128
|
tabs: [
|
|
116
129
|
{ id: 'activity', active: false, icon: 'activity' },
|
|
117
130
|
{ id: 'signatures', active: true, icon: 'mail' },
|
|
@@ -121,7 +134,7 @@ const VARIANTS = {
|
|
|
121
134
|
},
|
|
122
135
|
'docudesk-pii-map': {
|
|
123
136
|
Component: DocuDeskPiiMap,
|
|
124
|
-
label: '
|
|
137
|
+
label: 'Filinq · Document sidebar, PII map tab',
|
|
125
138
|
tabs: [
|
|
126
139
|
{ id: 'activity', active: false, icon: 'activity' },
|
|
127
140
|
{ id: 'signatures', active: false, icon: 'mail' },
|
|
@@ -149,7 +162,7 @@ const VARIANTS = {
|
|
|
149
162
|
},
|
|
150
163
|
'openconnector-run-detail': {
|
|
151
164
|
Component: OpenConnectorRunDetail,
|
|
152
|
-
label: '
|
|
165
|
+
label: 'Integriq · Run sidebar, Logs tab',
|
|
153
166
|
tabs: [
|
|
154
167
|
{ id: 'activity', active: false, icon: 'activity' },
|
|
155
168
|
{ id: 'logs', active: true, icon: 'n8n' },
|
|
@@ -158,7 +171,7 @@ const VARIANTS = {
|
|
|
158
171
|
},
|
|
159
172
|
'decidesk-decision': {
|
|
160
173
|
Component: DeciDeskDecision,
|
|
161
|
-
label: '
|
|
174
|
+
label: 'Decidiq · Decision sidebar, Detail tab',
|
|
162
175
|
tabs: [
|
|
163
176
|
{ id: 'activity', active: false, icon: 'activity' },
|
|
164
177
|
{ id: 'detail', active: true, icon: 'files' },
|
|
@@ -175,7 +188,7 @@ const VARIANTS = {
|
|
|
175
188
|
},
|
|
176
189
|
};
|
|
177
190
|
|
|
178
|
-
export default function SidebarMock({ kind, size = 'md', embedded = false, className }) {
|
|
191
|
+
export default function SidebarMock({ kind, size = 'md', embedded = false, running = true, className }) {
|
|
179
192
|
const variant = VARIANTS[kind];
|
|
180
193
|
if (!variant) {
|
|
181
194
|
return (
|
|
@@ -187,8 +200,19 @@ export default function SidebarMock({ kind, size = 'md', embedded = false, class
|
|
|
187
200
|
);
|
|
188
201
|
}
|
|
189
202
|
const { Component, tabs } = variant;
|
|
203
|
+
/* The travelling underline needs the active tab's index and the tab
|
|
204
|
+
count; both ride custom properties so the CSS can compute the
|
|
205
|
+
resting offset. It slides in from the neighbouring tab — from the
|
|
206
|
+
left normally, from the right when the first tab is the active
|
|
207
|
+
one (there is no left neighbour to come from). */
|
|
208
|
+
const activeIx = Math.max(0, tabs.findIndex((t) => t.active));
|
|
209
|
+
const underlineVars = {
|
|
210
|
+
'--sb-ix': activeIx,
|
|
211
|
+
'--sb-n': tabs.length,
|
|
212
|
+
'--sb-from': activeIx > 0 ? '-100%' : '100%',
|
|
213
|
+
};
|
|
190
214
|
const panel = (
|
|
191
|
-
<div className={[amStyles.detail, amStyles.rich].join(' ')}>
|
|
215
|
+
<div className={[amStyles.detail, amStyles.rich, amStyles.sbLive, !running && amStyles.static].filter(Boolean).join(' ')}>
|
|
192
216
|
<div className={amStyles['sb-head']}>
|
|
193
217
|
<div className={amStyles.ico}></div>
|
|
194
218
|
<div className={amStyles.meta}>
|
|
@@ -209,6 +233,9 @@ export default function SidebarMock({ kind, size = 'md', embedded = false, class
|
|
|
209
233
|
<div className={amStyles.l}></div>
|
|
210
234
|
</div>
|
|
211
235
|
))}
|
|
236
|
+
{/* Travelling active-tab underline — rests under the active
|
|
237
|
+
tab; the loop replays the travel from its neighbour. */}
|
|
238
|
+
<div className={amStyles['sb-underline']} style={underlineVars}></div>
|
|
212
239
|
</div>
|
|
213
240
|
)}
|
|
214
241
|
<div className={amStyles['sb-body']}>
|
|
@@ -185,7 +185,7 @@
|
|
|
185
185
|
.am .sb-body .smLog.warn .ts { background: var(--c-orange-knvb); }
|
|
186
186
|
.am .sb-body .smLog.error .ts { background: var(--c-red-vermillion); }
|
|
187
187
|
|
|
188
|
-
/* PII redaction map (
|
|
188
|
+
/* PII redaction map (Filinq PII tab). Inline pills marking spans
|
|
189
189
|
in a paragraph; .redacted = applied (red), .suggested = proposed
|
|
190
190
|
(orange), default = neutral text. */
|
|
191
191
|
.am .sb-body .smPiiBlock {
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SidebarMock.render.test.js — renders the real <SidebarMock> JSX to
|
|
3
|
+
* static markup and asserts on the wave-5 animation plumbing: the
|
|
4
|
+
* panel carries the `.sbLive` scope, `running={false}` puts `.static`
|
|
5
|
+
* on the panel itself (both standalone and embedded), and the
|
|
6
|
+
* travelling active-tab underline is present with the `--sb-ix` /
|
|
7
|
+
* `--sb-n` / `--sb-from` custom properties derived from the
|
|
8
|
+
* variant's active tab index.
|
|
9
|
+
*
|
|
10
|
+
* Same esbuild-bundle-then-renderToStaticMarkup technique as
|
|
11
|
+
* AppMock.render.test.js; CSS modules stubbed with an identity proxy.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
16
|
+
const test = require('node:test');
|
|
17
|
+
const {before, after} = test;
|
|
18
|
+
const assert = require('node:assert/strict');
|
|
19
|
+
const path = require('node:path');
|
|
20
|
+
const fs = require('node:fs/promises');
|
|
21
|
+
const {build} = require('esbuild');
|
|
22
|
+
const React = require('react');
|
|
23
|
+
const {renderToStaticMarkup} = require('react-dom/server');
|
|
24
|
+
|
|
25
|
+
const COMPONENT = path.resolve(__dirname, '..', 'SidebarMock.jsx');
|
|
26
|
+
const PRESET_ROOT = path.resolve(__dirname, '..', '..', '..', '..');
|
|
27
|
+
const SCRATCH = path.join(PRESET_ROOT, '.tmp-sidebar-mock-test');
|
|
28
|
+
|
|
29
|
+
/* Must stay in sync with the VARIANTS map in SidebarMock.jsx.
|
|
30
|
+
activeIx mirrors each variant's active-tab index. */
|
|
31
|
+
const KINDS = {
|
|
32
|
+
'procest-xwiki': 1,
|
|
33
|
+
'procest-timeline': 2,
|
|
34
|
+
'docudesk-signatures': 1,
|
|
35
|
+
'docudesk-pii-map': 2,
|
|
36
|
+
'openregister-metadata': 1,
|
|
37
|
+
'opencatalogi-publication-history': 1,
|
|
38
|
+
'openconnector-run-detail': 1,
|
|
39
|
+
'decidesk-decision': 1,
|
|
40
|
+
'nextcloud-activity': 0,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const cssModuleStub = {
|
|
44
|
+
name: 'css-module-stub',
|
|
45
|
+
setup(b) {
|
|
46
|
+
b.onResolve({filter: /\.module\.css$/}, (args) => ({path: args.path, namespace: 'css-stub'}));
|
|
47
|
+
b.onLoad({filter: /.*/, namespace: 'css-stub'}, () => ({
|
|
48
|
+
contents: 'export default new Proxy({}, {get: (_, p) => p});',
|
|
49
|
+
loader: 'js',
|
|
50
|
+
}));
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
let SidebarMock;
|
|
55
|
+
|
|
56
|
+
before(async () => {
|
|
57
|
+
await fs.mkdir(SCRATCH, {recursive: true});
|
|
58
|
+
const tmpDir = await fs.mkdtemp(path.join(SCRATCH, 'run-'));
|
|
59
|
+
const outFile = path.join(tmpDir, 'bundle.cjs');
|
|
60
|
+
await build({
|
|
61
|
+
entryPoints: [COMPONENT],
|
|
62
|
+
outfile: outFile,
|
|
63
|
+
bundle: true,
|
|
64
|
+
format: 'cjs',
|
|
65
|
+
jsx: 'automatic',
|
|
66
|
+
jsxImportSource: 'react',
|
|
67
|
+
tsconfigRaw: {compilerOptions: {jsx: 'react-jsx', jsxImportSource: 'react'}},
|
|
68
|
+
platform: 'node',
|
|
69
|
+
external: ['react'],
|
|
70
|
+
plugins: [cssModuleStub],
|
|
71
|
+
logLevel: 'warning',
|
|
72
|
+
});
|
|
73
|
+
delete require.cache[require.resolve(outFile)];
|
|
74
|
+
SidebarMock = require(outFile).default;
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
after(async () => {
|
|
78
|
+
await fs.rm(SCRATCH, {recursive: true, force: true});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
function render(props) {
|
|
82
|
+
return renderToStaticMarkup(React.createElement(SidebarMock, props));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
test('SSR smoke: every kind renders the live panel, none falls through to Unknown sidebar', () => {
|
|
86
|
+
for (const kind of Object.keys(KINDS)) {
|
|
87
|
+
const html = render({kind});
|
|
88
|
+
assert.match(html, /detail rich sbLive/, `${kind}: missing sbLive panel scope`);
|
|
89
|
+
assert.doesNotMatch(html, /Unknown sidebar/, `${kind}: fell through to the unknown branch`);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('running={false} puts static on the panel — standalone and embedded', () => {
|
|
94
|
+
assert.match(render({kind: 'procest-xwiki', running: false}), /detail rich sbLive static/);
|
|
95
|
+
assert.match(render({kind: 'procest-xwiki', running: false, embedded: true}), /detail rich sbLive static/);
|
|
96
|
+
assert.doesNotMatch(render({kind: 'procest-xwiki'}), /\bstatic\b/);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('the travelling underline carries --sb-ix / --sb-n / --sb-from per variant', () => {
|
|
100
|
+
for (const [kind, ix] of Object.entries(KINDS)) {
|
|
101
|
+
const html = render({kind});
|
|
102
|
+
assert.match(html, /class="sb-underline"/, `${kind}: underline missing`);
|
|
103
|
+
assert.match(html, new RegExp(`--sb-ix:${ix}[;"]`), `${kind}: wrong active index`);
|
|
104
|
+
assert.match(html, /--sb-n:[0-9]/, `${kind}: tab count missing`);
|
|
105
|
+
const from = ix > 0 ? '-100%' : '100%';
|
|
106
|
+
assert.match(html, new RegExp(`--sb-from:${from}`), `${kind}: wrong travel origin`);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('embedded mode drops the standalone frame but keeps the live panel', () => {
|
|
111
|
+
const html = render({kind: 'openregister-metadata', embedded: true});
|
|
112
|
+
assert.doesNotMatch(html, /smFrame/);
|
|
113
|
+
assert.match(html, /detail rich sbLive/);
|
|
114
|
+
assert.match(html, /class="sb-underline"/);
|
|
115
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Dossiq · case sidebar, xWiki tab.
|
|
3
3
|
*
|
|
4
|
-
* The xWiki integration:
|
|
4
|
+
* The xWiki integration: Dossiq pulls the case-handling protocol
|
|
5
5
|
* page out of xWiki and shows it next to the live case. Body reads
|
|
6
6
|
* as wiki text: a heading, two paragraphs, a subheading, a list of
|
|
7
7
|
* checked steps. Worth saying out loud since it is the integration
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* icon={<svg>...</svg>}
|
|
28
28
|
* title="WOO compliance, by Friday."
|
|
29
29
|
* outcome={<>A live WOO portal at your <span className="next-blue">Nextcloud</span>-hosted domain.</>}
|
|
30
|
-
* builtOn={['OpenCatalogi', 'OpenRegister', '
|
|
30
|
+
* builtOn={['OpenCatalogi', 'OpenRegister', 'Integriq']}
|
|
31
31
|
* />
|
|
32
32
|
* </SolutionGrid>
|
|
33
33
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* <WidgetMock />
|
|
3
3
|
*
|
|
4
4
|
* Standalone abstract of a Nextcloud dashboard widget that a
|
|
5
|
-
* Conduction app registers (
|
|
5
|
+
* Conduction app registers (Filinq anonymise, Dossiq werkvoorraad,
|
|
6
6
|
* OpenRegister activity, etc.) plus a few of the stock Nextcloud
|
|
7
7
|
* widgets we frame around (Mail, Calendar, Files, Decks, RSS).
|
|
8
8
|
*
|
|
@@ -29,7 +29,19 @@
|
|
|
29
29
|
* - caption: boolean — adds a small
|
|
30
30
|
* label below
|
|
31
31
|
* the frame
|
|
32
|
+
* - running: boolean (default true) — false freezes the widget's
|
|
33
|
+
* animation on its meaningful static end state (same
|
|
34
|
+
* rendering `prefers-reduced-motion: reduce` gives).
|
|
35
|
+
* The CSS `.static` class on the frame stops keyframes.
|
|
32
36
|
* - className: string
|
|
37
|
+
*
|
|
38
|
+
* Every list-shaped variant (VARIANTS entries with `list: true`)
|
|
39
|
+
* shares one refresh primitive, styled in AppMock.module.css under
|
|
40
|
+
* `.wmLive`: a new row slides in at the top, the bottom row clips
|
|
41
|
+
* out, and the unread badge on the frame bumps as the row lands.
|
|
42
|
+
* Non-list variants (calendar grid, decks columns, activity graph,
|
|
43
|
+
* anonymise dropzone) opt out; the dropzone has its own `.zoneLive`
|
|
44
|
+
* marching-ants + file-drop treatment inside the variant itself.
|
|
33
45
|
*/
|
|
34
46
|
|
|
35
47
|
import React from 'react';
|
|
@@ -52,23 +64,23 @@ import NextcloudDecks from './variants/NextcloudDecks.jsx';
|
|
|
52
64
|
import NextcloudRss from './variants/NextcloudRss.jsx';
|
|
53
65
|
|
|
54
66
|
const VARIANTS = {
|
|
55
|
-
'docudesk-anonymise': { Component: DocuDeskAnonymise, label: '
|
|
56
|
-
'docudesk-pending-sign': { Component: DocuDeskPendingSign, label: '
|
|
57
|
-
'procest-werkvoorraad': { Component: ProcestWerkvoorraad, label: '
|
|
58
|
-
'procest-due-today': { Component: ProcestDueToday, label: '
|
|
67
|
+
'docudesk-anonymise': { Component: DocuDeskAnonymise, label: 'Filinq · Anonymise drop' },
|
|
68
|
+
'docudesk-pending-sign': { Component: DocuDeskPendingSign, label: 'Filinq · Pending signatures', list: true },
|
|
69
|
+
'procest-werkvoorraad': { Component: ProcestWerkvoorraad, label: 'Dossiq · Werkvoorraad', list: true },
|
|
70
|
+
'procest-due-today': { Component: ProcestDueToday, label: 'Dossiq · Due today', list: true },
|
|
59
71
|
'openregister-activity': { Component: OpenRegisterActivity, label: 'OpenRegister · Activity' },
|
|
60
|
-
'opencatalogi-publications':{ Component: OpenCatalogiPublications,label: 'OpenCatalogi · Recent publications' },
|
|
61
|
-
'openconnector-runs': { Component: OpenConnectorRuns, label: '
|
|
62
|
-
'decidesk-actions': { Component: DeciDeskActions, label: '
|
|
63
|
-
'pipelinq-deals': { Component: PipelinQDeals, label: 'PipelinQ · Deals closing' },
|
|
64
|
-
'nextcloud-mail': { Component: NextcloudMail, label: 'Nextcloud · Important mail' },
|
|
72
|
+
'opencatalogi-publications':{ Component: OpenCatalogiPublications,label: 'OpenCatalogi · Recent publications', list: true },
|
|
73
|
+
'openconnector-runs': { Component: OpenConnectorRuns, label: 'Integriq · Recent runs', list: true },
|
|
74
|
+
'decidesk-actions': { Component: DeciDeskActions, label: 'Decidiq · Action items', list: true },
|
|
75
|
+
'pipelinq-deals': { Component: PipelinQDeals, label: 'PipelinQ · Deals closing', list: true },
|
|
76
|
+
'nextcloud-mail': { Component: NextcloudMail, label: 'Nextcloud · Important mail', list: true },
|
|
65
77
|
'nextcloud-calendar': { Component: NextcloudCalendar, label: 'Nextcloud · Calendar' },
|
|
66
|
-
'nextcloud-files': { Component: NextcloudFiles, label: 'Nextcloud · Recent files' },
|
|
78
|
+
'nextcloud-files': { Component: NextcloudFiles, label: 'Nextcloud · Recent files', list: true },
|
|
67
79
|
'nextcloud-decks': { Component: NextcloudDecks, label: 'Nextcloud · Decks' },
|
|
68
|
-
'nextcloud-rss': { Component: NextcloudRss, label: 'Nextcloud · RSS feed' },
|
|
80
|
+
'nextcloud-rss': { Component: NextcloudRss, label: 'Nextcloud · RSS feed', list: true },
|
|
69
81
|
};
|
|
70
82
|
|
|
71
|
-
export default function WidgetMock({ kind, size = 'md', caption = false, className }) {
|
|
83
|
+
export default function WidgetMock({ kind, size = 'md', caption = false, running = true, className }) {
|
|
72
84
|
const variant = VARIANTS[kind];
|
|
73
85
|
const wrap = [amStyles.am, styles.wm].filter(Boolean).join(' ');
|
|
74
86
|
if (!variant) {
|
|
@@ -80,12 +92,21 @@ export default function WidgetMock({ kind, size = 'md', caption = false, classNa
|
|
|
80
92
|
</div>
|
|
81
93
|
);
|
|
82
94
|
}
|
|
83
|
-
const { Component, label } = variant;
|
|
95
|
+
const { Component, label, list } = variant;
|
|
96
|
+
const frameCls = [
|
|
97
|
+
styles.wmFrame,
|
|
98
|
+
styles[`wm-size-${size}`],
|
|
99
|
+
list && amStyles.wmLive,
|
|
100
|
+
!running && amStyles.static,
|
|
101
|
+
].filter(Boolean).join(' ');
|
|
84
102
|
return (
|
|
85
103
|
<div className={wrap}>
|
|
86
104
|
<figure className={[styles.wmFigure, className].filter(Boolean).join(' ')}>
|
|
87
|
-
<div className={
|
|
88
|
-
|
|
105
|
+
<div className={frameCls}>
|
|
106
|
+
{/* Unread badge — list variants only; bumps when the fresh
|
|
107
|
+
row lands. Styled in AppMock.module.css (.wmBadge). */}
|
|
108
|
+
{list && <div className={amStyles.wmBadge}></div>}
|
|
109
|
+
<Component running={running} />
|
|
89
110
|
</div>
|
|
90
111
|
{caption && <figcaption className={styles.wmCaption}>{label}</figcaption>}
|
|
91
112
|
</figure>
|