Skip to content

Commit 3d82d17

Browse files
authored
Merge pull request #519 from ConductionNL/development
Release: merge development into beta
2 parents 92fa4b4 + 947927c commit 3d82d17

151 files changed

Lines changed: 4981 additions & 693 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/code-quality.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ permissions:
149149

150150
jobs:
151151
quality:
152+
if: (github.event_name != 'pull_request' || github.head_ref != 'development')
152153
uses: ConductionNL/.github/.github/workflows/quality.yml@main
153154
with:
154155
app-name: launchpad

appinfo/info.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ Ideaal voor organisaties die consistente, samengestelde dashboards willen voor h
5252
5353
Vrij en open source onder de EUPL-1.2-licentie.
5454
]]></description>
55-
<version>1.0.23-unstable.20260831051055</version>
55+
<version>1.0.25-unstable.20260831161142</version>
5656
<licence>EUPL-1.2</licence>
5757
<author mail="info@conduction.nl" homepage="https://www.conduction.nl/">Conduction</author>
5858
<namespace>LaunchPad</namespace>

appinfo/routes.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
// First-time setup wizard (ADR-042) — the standard CnSetupWizard contract.
1515
['name' => 'setup#status', 'url' => '/api/setup/status', 'verb' => 'GET'],
1616
['name' => 'setup#runAction', 'url' => '/api/setup/action/{actionId}', 'verb' => 'POST', 'requirements' => ['actionId' => '[a-z0-9\\-]+']],
17+
['name' => 'setup#saveConfig', 'url' => '/api/setup/config', 'verb' => 'POST'],
1718
['name' => 'manifest#index', 'url' => '/api/manifest', 'verb' => 'GET'],
1819

1920
// Metrics and health

composer.lock

Lines changed: 13 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

css/launchpad.css

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,22 @@
7575
*
7676
* Re-declaring it on `body` restores exactly what 9.9.0 did, and is harmless
7777
* once upstream fixes the scope: the value is identical either way.
78+
*
79+
* ⚠️ THIS FIXES THE SCOPE, NOT THE VALUE, AND 9999 IS STILL TOO LOW.
80+
* `src/styles/workspace.css` carries a SECOND rule raising the same variable
81+
* to 10100 on the menu itself. They are not duplicates and removing either
82+
* brings a different failure back:
83+
*
84+
* - This one restores INHERITANCE, so the menu receives a value at all.
85+
* - That one raises the VALUE above NcModal, which does not use a fixed
86+
* z-index: it assigns one at RUNTIME, counting up as modals open —
87+
* measured 10005 for the first open modal and 10010 for the second. Every
88+
* one of those beats 9999, so with only this rule the menu still renders
89+
* under any modal.
90+
*
91+
* So when ConductionNL/nextcloud-vue#864 is closed and this block is deleted,
92+
* the 10100 rule must STAY until nc-vue relates the two numbers rather than
93+
* choosing them independently.
7894
*/
7995
body {
8096
--vs-dropdown-z-index: 9999;

eslint.config.mjs

Lines changed: 134 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,32 @@ export default [
144144
'no-console': 'off',
145145
'n/no-process-exit': 'off',
146146
'n/hashbang': 'off',
147-
// `_` / `__` as a deliberate throwaway binding — `catch (_)`, a
148-
// discarded destructuring slot. Narrow on purpose: the pattern matches
149-
// UNDERSCORES ONLY, so a real name that happens to start with `_` is
150-
// still reported. v9 drives plain `.js` through the CORE rule (the
151-
// `@typescript-eslint` swap is per-file-type), so it is set here.
147+
// Tests import devDependencies by definition; this rule is about what
148+
// ships in the published package, which tests/ never does.
149+
'n/no-unpublished-import': 'off',
150+
},
151+
},
152+
153+
{
154+
// `_` / `__` as a deliberate throwaway binding — `catch (_)`, a discarded
155+
// destructuring slot. Narrow on purpose: the pattern matches UNDERSCORES
156+
// ONLY, so a real name that happens to start with `_` is still reported.
157+
//
158+
// 🔴 `.js` / `.mjs` ONLY, NOT `.ts`. The CORE rule is not TypeScript-aware:
159+
// applied to a `.ts` file it reads the parameter NAMES inside a function
160+
// TYPE as bindings and reports them unused. Measured on humaniq —
161+
//
162+
// t?: (app: string, key: string) => string
163+
//
164+
// produced four `no-unused-vars` errors for `app` and `key`, which are
165+
// documentation, not variables. The same mis-scoping made every unused
166+
// `catch (e)` in a `.ts` spec report TWICE, once per rule.
167+
//
168+
// v9 already turns the core rule off for `.ts` and drives
169+
// `@typescript-eslint/no-unused-vars` instead; naming `.ts` here switched
170+
// it back on. TypeScript files are handled by the block below.
171+
files: ['tests/**/*.js', 'tests/**/*.mjs'],
172+
rules: {
152173
'no-unused-vars': [
153174
'error',
154175
{
@@ -165,12 +186,117 @@ export default [
165186
ignoreRestSiblings: true,
166187
},
167188
],
168-
// Tests import devDependencies by definition; this rule is about what
169-
// ships in the published package, which tests/ never does.
170-
'n/no-unpublished-import': 'off',
171189
},
172190
},
173191

192+
{
193+
// The TypeScript half of the block above. Same intent, same patterns, on
194+
// the rule that actually understands the language: it knows a name inside
195+
// a function type is not a binding, so type annotations stay quiet while a
196+
// genuinely dead local is still reported.
197+
files: ['tests/**/*.ts', 'tests/**/*.tsx'],
198+
rules: {
199+
'@typescript-eslint/no-unused-vars': [
200+
'error',
201+
{
202+
varsIgnorePattern: '^_+$',
203+
caughtErrors: 'all',
204+
caughtErrorsIgnorePattern: '^_+$',
205+
argsIgnorePattern: '^_',
206+
ignoreRestSiblings: true,
207+
},
208+
],
209+
},
210+
},
211+
212+
{
213+
// 🔴 Node-side CLI tooling under `scripts/`, which is COMMONJS. Flat
214+
// config defaults every `.js` to ESM with browser-ish globals, so without
215+
// this block eslint reports the CommonJS wrapper itself as undefined
216+
// identifiers. Measured on this app: 52 of the 233 errors under
217+
// `tests/` + `scripts/` were `no-undef`, ALL of them in `scripts/`, and
218+
// all five names were the environment rather than a typo — `process` 23,
219+
// `require` 20, `__dirname` 6, `__filename` 2, `module` 1.
220+
//
221+
// This is describing the environment, not relaxing a rule, and it is the
222+
// same argument the test-globals block below makes: declaring them keeps
223+
// `no-undef` able to do its real job, which is catching a genuinely
224+
// misspelled identifier. Suppressing the rule instead would bury that.
225+
//
226+
// `no-console` is off because printing its report is what a CLI checker
227+
// is FOR.
228+
//
229+
// 🔴 NO `n/*` ENTRIES HERE, DELIBERATELY. `eslint-plugin-n` is NOT
230+
// registered for these files under eslint 10 + @nextcloud/eslint-config
231+
// 9, so `'n/no-process-exit': 'off'` would be dead config that reads as
232+
// if it were doing something. Measured both ways on this app: 0 `n/`
233+
// findings with the entries and 0 without.
234+
//
235+
// What DID report was the opposite — four `scripts/*.js` carried
236+
// `/* eslint-disable n/no-process-exit */` and `/* eslint-disable
237+
// n/shebang */` left over from the eslintrc era, and an inline disable
238+
// naming an unregistered plugin is itself an error ("Definition for rule
239+
// 'n/shebang' was not found"). Those 8 comments are removed; do not add
240+
// `n/*` rules back to replace them.
241+
//
242+
// ⚠️ `.js` and `.cjs` ONLY. A `scripts/*.mjs` is genuinely ESM and must
243+
// keep the default `sourceType`, or `import` stops parsing there.
244+
files: ['scripts/**/*.js', 'scripts/**/*.cjs'],
245+
languageOptions: {
246+
sourceType: 'commonjs',
247+
globals: {
248+
require: 'readonly',
249+
module: 'writable',
250+
exports: 'writable',
251+
process: 'readonly',
252+
__dirname: 'readonly',
253+
__filename: 'readonly',
254+
console: 'readonly',
255+
Buffer: 'readonly',
256+
global: 'readonly',
257+
URL: 'readonly',
258+
TextEncoder: 'readonly',
259+
TextDecoder: 'readonly',
260+
},
261+
},
262+
rules: {
263+
'no-console': 'off',
264+
},
265+
},
266+
267+
{
268+
// The ESM half of the block above. A `scripts/*.mjs` is genuinely a module
269+
// and must keep the default `sourceType`, so it gets Node's globals but
270+
// none of the CommonJS wrapper. Measured: `process` reported undefined 2x
271+
// in hermiq's generate-opengemeenten-icons.mjs and 4x in openregister's
272+
// l10n/runtime-check.mjs, which the `.js`/`.cjs` block deliberately does
273+
// not match.
274+
files: ['scripts/**/*.mjs', 'tests/**/*.mjs'],
275+
languageOptions: {
276+
globals: {
277+
process: 'readonly',
278+
console: 'readonly',
279+
Buffer: 'readonly',
280+
global: 'readonly',
281+
URL: 'readonly',
282+
TextEncoder: 'readonly',
283+
TextDecoder: 'readonly',
284+
},
285+
},
286+
rules: {
287+
'no-console': 'off',
288+
},
289+
},
290+
291+
{
292+
// eslint must not try to PARSE a shell script. `tests/e2e/seed.test.sh`
293+
// matches the `**/*.test.*` glob some presets use, and eslint then reads
294+
// it as JavaScript and reports "Parsing error: Unexpected character" —
295+
// a finding about a file it should never have opened.
296+
ignores: ['**/*.sh', '**/*.bash'],
297+
},
298+
299+
174300
{
175301
// Test globals. Several apps keep their spec files INSIDE `src/`, which the
176302
// lint script scans, and neither `@nextcloud/eslint-config` nor the runner

l10n/be.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
OC.L10N.register(
22
"launchpad",
33
{
4+
"Features & roadmap" : "Функцыі і дарожная карта",
45
"Maximum dashboards per user" : "Максімальная колькасць дашбордаў на карыстальніка",
56
"Maximum widgets per dashboard" : "Максімальная колькасць віджэтаў на дашборд",
67
"0 = unlimited. Lowering a limit never deletes existing dashboards; it only blocks new ones until users are back under the limit." : "0 = без абмежаванняў. Зніжэнне ліміту ніколі не выдаляе існуючыя дашборды; яно толькі блакуе стварэнне новых, пакуль карыстальнікі не вернуцца пад ліміт.",
@@ -1088,6 +1089,31 @@ OC.L10N.register(
10881089
"No dashboards in this group yet" : "У гэтай групе пакуль няма панэляў",
10891090
"Rename" : "Перайменаваць",
10901091
"New dashboard name" : "Новая назва панэлі",
1091-
"Delete this dashboard? This cannot be undone." : "Выдаліць гэтую панэль? Гэта нельга адмяніць."
1092+
"Delete this dashboard? This cannot be undone." : "Выдаліць гэтую панэль? Гэта нельга адмяніць.",
1093+
"Reports": "Справаздачы",
1094+
"Pick a report to open it.": "Выберыце справаздачу, каб адкрыць яе.",
1095+
"Open": "Адкрыта",
1096+
"In progress": "У працы",
1097+
"Blocked": "Заблакіравана",
1098+
"Date": "Дата",
1099+
"Due": "Тэрмін",
1100+
"Assignee": "Прызначана",
1101+
"Who": "Хто",
1102+
"What": "Што",
1103+
"Minutes": "Хвіліны",
1104+
"Entries": "Запісы",
1105+
"Most recent": "Найноўшыя",
1106+
"Per person": "На асобу",
1107+
"By status": "Па статусе",
1108+
"By priority": "Па прыярытэце",
1109+
"Personal": "Асабістыя",
1110+
"Shared with a group": "Агульнае з групай",
1111+
"Admin templates": "Шаблоны адміністратара",
1112+
"Who they belong to": "Каму яны належаць",
1113+
"Kind": "Від",
1114+
"Version": "Версія",
1115+
"How many dashboards there are, and who they belong to.": "Колькі ёсць панэляў і каму яны належаць.",
1116+
"Store": "Крама",
1117+
"Install dashboard configurations that other organisations have published: a set of tiles, a layout, or the flows behind them.": "Усталюйце рэестры, схемы і патокі, апублікаваныя іншымі арганізацыямі."
10921118
},
10931119
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");

l10n/be.json

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
"Kiosk playlists": "Кіёскавыя плэйлісты",
1010
"New playlist": "Новы плэйліст",
1111
"Point a wall display or reception screen at a playlist URL to rotate dashboards chrome-less and unattended.": "Накіруйце насценны дысплей або экран рэцэпцыі на URL плэйліста, каб ратаваць дашборды без інтэрфейсу і без нагляду.",
12-
"_%n dashboard_::_%n dashboards_": ["%n дашборд", "%n дашборды", "%n дашбордаў"],
12+
"_%n dashboard_::_%n dashboards_": [
13+
"%n дашборд",
14+
"%n дашборды",
15+
"%n дашбордаў"
16+
],
1317
"refresh every {seconds}s": "абнаўляць кожныя {seconds} с",
1418
"Copy URL": "Капіяваць URL",
1519
"Revoke": "Адклікаць",
@@ -1061,6 +1065,32 @@
10611065
"Bridge": "Мост",
10621066
"No widgets match this filter": "Няма віджэтаў, якія адпавядаюць гэтаму фільтру",
10631067
"Catalog": "Каталог",
1064-
"General": "Агульныя"
1068+
"General": "Агульныя",
1069+
"Features & roadmap": "Функцыі і дарожная карта",
1070+
"Reports": "Справаздачы",
1071+
"Pick a report to open it.": "Выберыце справаздачу, каб адкрыць яе.",
1072+
"Open": "Адкрыта",
1073+
"In progress": "У працы",
1074+
"Blocked": "Заблакіравана",
1075+
"Date": "Дата",
1076+
"Due": "Тэрмін",
1077+
"Assignee": "Прызначана",
1078+
"Who": "Хто",
1079+
"What": "Што",
1080+
"Minutes": "Хвіліны",
1081+
"Entries": "Запісы",
1082+
"Most recent": "Найноўшыя",
1083+
"Per person": "На асобу",
1084+
"By status": "Па статусе",
1085+
"By priority": "Па прыярытэце",
1086+
"Personal": "Асабістыя",
1087+
"Shared with a group": "Агульнае з групай",
1088+
"Admin templates": "Шаблоны адміністратара",
1089+
"Who they belong to": "Каму яны належаць",
1090+
"Kind": "Від",
1091+
"Version": "Версія",
1092+
"How many dashboards there are, and who they belong to.": "Колькі ёсць панэляў і каму яны належаць.",
1093+
"Store": "Крама",
1094+
"Install dashboard configurations that other organisations have published: a set of tiles, a layout, or the flows behind them.": "Усталюйце рэестры, схемы і патокі, апублікаваныя іншымі арганізацыямі."
10651095
}
10661096
}

0 commit comments

Comments
 (0)