Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
36edc67
Keycloak authentication via x-user-id header
bastianjoel Jun 5, 2026
ed535e9
Fix reset link
bastianjoel Jun 5, 2026
8e17cce
feat: Adopt new meta
Janmtbehrens Jun 11, 2026
516ca5e
Bump video.js from 8.23.7 to 8.23.8 in /client (#6322)
dependabot[bot] Jun 23, 2026
c2ae08a
Bump typescript-eslint from 8.61.0 to 8.61.1 in /client (#6321)
dependabot[bot] Jun 23, 2026
e2e214a
Bump the angular group in /client with 2 updates (#6317)
dependabot[bot] Jun 23, 2026
9120c51
Bump cm-chessboard from 8.12.11 to 8.12.12 in /client in the chess gr…
dependabot[bot] Jun 23, 2026
096618e
Bump actions/checkout from 6 to 7 (#6315)
dependabot[bot] Jun 23, 2026
e6562b2
Bump undici from 7.25.0 to 7.28.0 in /packages/openslides-motion-diff…
dependabot[bot] Jun 23, 2026
a97afa3
Bump hono from 4.12.23 to 4.12.26 in /client (#6311)
dependabot[bot] Jun 23, 2026
b91d829
Bump the typescript-eslint group across 1 directory with 2 updates (#…
dependabot[bot] Jun 23, 2026
ae5ec1e
Bump the tiptap group in /client with 14 updates (#6318)
dependabot[bot] Jun 23, 2026
8f013c6
Change sorting of meeting in dashboard (#6328)
Elblinator Jun 25, 2026
d74dfd8
Remove self from delete payload in participant-list (#6303)
Elblinator Jun 25, 2026
fafc677
Add direct link from motion title to in to motion detail (#6307)
Elblinator Jun 25, 2026
11cbd0b
Set timezone after initTimezones in meeting-edit (#6342)
reiterl Jun 30, 2026
d27635a
Add aria label to motion/amendment/reason-text (#6333)
Elblinator Jul 1, 2026
d47fdfa
Bump the angular group in /client with 2 updates (#6335)
dependabot[bot] Jul 1, 2026
8352e85
Bump playwright from v1.61.0-jammy to v1.61.1-jammy in /client/tests …
dependabot[bot] Jul 1, 2026
e30f953
Bump @playwright/test from 1.61.0 to 1.61.1 in /client/tests (#6337)
dependabot[bot] Jul 1, 2026
648ebd7
Bump video.js from 8.23.8 to 8.23.9 in /client (#6339)
dependabot[bot] Jul 1, 2026
0560440
Add translatioon marker for is not locked out (#6346)
Elblinator Jul 2, 2026
cd79625
Bump typescript-eslint from 8.61.1 to 8.62.0 in /client (#6340)
dependabot[bot] Jul 2, 2026
cee86ae
Change new workflow tool tip (#6345)
Elblinator Jul 2, 2026
3bd2e1c
Update meta repository (#6332)
openslides-automation[bot] Jul 3, 2026
8b827cb
Orga settings (#6350)
Elblinator Jul 6, 2026
46cb274
Bump the tiptap group in /client with 14 updates (#6355)
dependabot[bot] Jul 6, 2026
8bbf10d
Bump the angular group in /client with 2 updates (#6354)
dependabot[bot] Jul 6, 2026
e54d6f3
Bump typescript-eslint from 8.62.0 to 8.62.1 in /client (#6358)
dependabot[bot] Jul 6, 2026
12d0d98
Bump js-yaml from 4.2.0 to 5.2.1 in /client (#6357)
dependabot[bot] Jul 6, 2026
73c8aaf
Bump prettier from 3.8.4 to 3.9.4 in /client (#6356)
dependabot[bot] Jul 6, 2026
613109a
Add `typescript-eslint` to group (#6361)
bastianjoel Jul 6, 2026
824bde1
Bump @coreui/angular-chartjs from 5.6.24 to 5.6.25 in /client (#6362)
dependabot[bot] Jul 6, 2026
2437fbe
Update meta repository (#6359)
openslides-automation[bot] Jul 7, 2026
8127ed0
Fix reason string and motion-list url (#6375)
Elblinator Jul 8, 2026
434b9e7
Revert changes from #5997 and #5693 (#6285)
bastianjoel Jul 8, 2026
7dc7f7b
Remove empty spec files (#6378)
bastianjoel Jul 8, 2026
62ff77f
Update to inject (#6360)
Elblinator Jul 9, 2026
2d1f781
Use isListEmpty for disable list-search-selectors (#6380)
reiterl Jul 9, 2026
95a8682
Exchange mat-time-picker (#6382)
Elblinator Jul 9, 2026
a917413
Bump node from 24.14-alpine to 24.18-alpine (#6334)
dependabot[bot] Jul 9, 2026
ac7c377
Bump the typescript-eslint group in /client with 3 updates (#6365)
dependabot[bot] Jul 9, 2026
4b9908d
Bump the tiptap group in /client with 14 updates (#6366)
dependabot[bot] Jul 9, 2026
05fd865
Clean up os-list-search-selector (#6386)
Elblinator Jul 13, 2026
c548aa3
Add another case to determine ChReco (#6384)
reiterl Jul 13, 2026
e8dcb5f
Motion export: sanitize filename (#6385)
reiterl Jul 13, 2026
82cfcbd
Angular 22 (#6392)
bastianjoel Jul 14, 2026
0c27d34
Bump ws, engine.io and socket.io-adapter in /client (#6395)
dependabot[bot] Jul 14, 2026
7484c1b
Bump fast-uri from 3.1.0 to 3.1.3 in /packages/openslides-motion-diff…
dependabot[bot] Jul 14, 2026
edf0b73
Bump actions/setup-node from 6 to 7 (#6400)
dependabot[bot] Jul 14, 2026
3d69e2e
Bump the typescript-eslint group in /client with 3 updates (#6401)
dependabot[bot] Jul 14, 2026
a5af62b
Bump prettier from 3.9.4 to 3.9.5 in /client (#6404)
dependabot[bot] Jul 14, 2026
f4631e4
Bump @cantoo/pdf-lib from 2.7.1 to 2.7.2 in /client (#6406)
dependabot[bot] Jul 14, 2026
0d89293
Bump eslint from 9.39.4 to 9.39.5 in /client (#6403)
dependabot[bot] Jul 14, 2026
901b9b1
Bump the tiptap group in /client with 14 updates (#6402)
dependabot[bot] Jul 14, 2026
dfb22bb
Bump @coreui/angular-chartjs from 5.7.3 to 5.7.4 in /client (#6405)
dependabot[bot] Jul 14, 2026
c3aa7ee
Add tooltips in comment-detail (#6389)
Elblinator Jul 17, 2026
6609b28
Migrate to Service() and use inject() in the services (#6417)
reiterl Jul 20, 2026
6357e37
Bump brace-expansion and vite-plugin-dts (#6422)
dependabot[bot] Jul 21, 2026
aa21965
Bump tar from 7.5.16 to 7.5.20 in /client (#6423)
dependabot[bot] Jul 21, 2026
ef5ba42
Bump the typescript-eslint group in /client with 3 updates (#6424)
dependabot[bot] Jul 21, 2026
2c4c292
Bump the angular group in /client with 16 updates (#6425)
dependabot[bot] Jul 21, 2026
090a97a
Bump the tiptap group in /client with 15 updates (#6426)
dependabot[bot] Jul 21, 2026
3a9d3ba
Bump cm-chessboard from 8.12.12 to 8.12.14 in /client in the chess gr…
dependabot[bot] Jul 21, 2026
1ac1ba5
Bump prettier from 3.9.5 to 3.9.6 in /client (#6429)
dependabot[bot] Jul 21, 2026
e194f9a
Bump @cantoo/pdf-lib from 2.7.2 to 2.7.4 in /client (#6428)
dependabot[bot] Jul 21, 2026
4f9d475
Bump eslint-plugin-simple-import-sort from 13.0.0 to 14.0.0 in /clien…
dependabot[bot] Jul 21, 2026
0e926c6
Bump @coreui/angular-chartjs from 5.7.4 to 5.7.6 in /client (#6430)
dependabot[bot] Jul 21, 2026
a39dc33
Fix generate-defaults script (#6432)
bastianjoel Jul 21, 2026
12999a8
Fix types in test files not recognized (#6415)
bastianjoel Jul 21, 2026
edd45d5
Bump fast-uri from 3.1.2 to 3.1.4 in /client (#6434)
dependabot[bot] Jul 22, 2026
427780c
merge: with main
Janmtbehrens Jul 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ updates:
typescript-eslint:
patterns:
- "@typescript-eslint/*"
- "typescript-eslint"
opentelemetry:
patterns:
- "@opentelemetry/*"
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci-package-motion-diff.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ jobs:
name: build-and-test-package-motion-diff
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: 'Install Node'
uses: actions/setup-node@v6
uses: actions/setup-node@v7
with:
node-version: '22.x'

Expand Down
12 changes: 8 additions & 4 deletions .github/workflows/continuous-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clone main repo
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
repository: OpenSlides/OpenSlides
path: "."
Expand All @@ -33,7 +33,7 @@ jobs:
run: rm -r openslides-client

- name: Clone openslides-client
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
path: "./openslides-client"

Expand Down Expand Up @@ -101,12 +101,12 @@ jobs:
name: build-and-test-dev-image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
submodules: "recursive"

- name: Set up Node.js
uses: actions/setup-node@v6
uses: actions/setup-node@v7
with:
node-version: '24'

Expand All @@ -126,6 +126,10 @@ jobs:
run: npm run generate-models && git diff --exit-code -- src/app/domain/models
working-directory: client/

- name: Check generated defaults are up to date
run: npm run generate-defaults && git diff --exit-code -- src/app/domain/models
working-directory: client/

- uses: browser-actions/setup-chrome@v2

- name: Build motion diff
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pick-to-staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:

steps:
- name: Checkout main
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
ref: main
fetch-depth: 2
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM node:24.14-alpine AS base
FROM node:24.18-alpine AS base

## Setup
ARG CONTEXT
Expand Down
7 changes: 6 additions & 1 deletion client/angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,12 @@
],
"scripts": [],
"webWorkerTsConfig": "tsconfig.worker.json",
"sourceMap": false
"sourceMap": false,
"stylePreprocessorOptions": {
"includePaths": [
"."
]
}
}
},
"lint": {
Expand Down
31 changes: 2 additions & 29 deletions client/cli/generate-models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import * as yaml from 'js-yaml';
import * as path from 'path';
import { Project, Scope } from 'ts-morph';

const SOURCE_META = path.resolve(path.join(__dirname, `../../meta/collection-meta.yml`));
const SOURCE_COLLECTIONS = path.resolve(path.join(__dirname, `../../meta/collections/`));
import { getCollectionsYaml, snakeToPascal } from './utils';

const DESTINATION = path.resolve(path.join(__dirname, `../src/app/domain/models`));

function findModelFile(startPath: string, name: string): string | null {
Expand All @@ -30,33 +30,6 @@ function findModelFile(startPath: string, name: string): string | null {
return null;
}

function getCollectionsYaml(): string {
if (!fs.existsSync(SOURCE_COLLECTIONS)) {
console.log(`no dir `, SOURCE_COLLECTIONS);
return null;
}

let content = fs.readFileSync(SOURCE_META).toString();
content += `\nmodels:`;
const files = fs.readdirSync(SOURCE_COLLECTIONS);
for (const file of files) {
const filename = path.join(SOURCE_COLLECTIONS, file);
if (filename.endsWith(`.yml`)) {
const collection = fs.readFileSync(filename).toString().replace(/^(.)/gm, ` $1`);
content += `\n ${file.substring(0, file.length - 4)}:\n${collection}`;
}
}

return content;
}

function snakeToPascal(input: string): string {
return input
.split(`_`)
.map(substr => substr.charAt(0).toUpperCase() + substr.slice(1))
.join(``);
}

(async (): Promise<void> => {
const models: any = yaml.load(getCollectionsYaml())[`models`];
const project = new Project({});
Expand Down
2 changes: 1 addition & 1 deletion client/cli/generate-permissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as yaml from 'js-yaml';
import * as path from 'path';
import dedent from 'ts-dedent';

import { overloadJsFunctions } from 'src/app/infrastructure/utils/overload-js-functions';
import { overloadJsFunctions } from '@app/infrastructure/utils/overload-js-functions';

overloadJsFunctions();

Expand Down
118 changes: 101 additions & 17 deletions client/cli/generate-settings-defaults.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,125 @@ import * as fs from 'fs';
import * as yaml from 'js-yaml';
import * as path from 'path';
import dedent from 'ts-dedent';
import {
ArrayLiteralExpression,
CallExpression,
ObjectLiteralExpression,
Project,
PropertyAssignment,
SyntaxKind
} from 'ts-morph';

import { MeetingSettingsDefinitionService } from '../src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definition.service';
import { getCollectionsYaml } from './utils';

const SOURCE = path.resolve(path.join(__dirname, '../meta/models.yml'));
const SETTING_DEFINITIONS = path.resolve(
path.join(
__dirname,
'../src/app/site/pages/meetings/services/meeting-settings-definition.service/meeting-settings-definitions.ts'
)
);
const DESTINATION = path.resolve(path.join(__dirname, '../src/app/domain/definitions/meeting-settings-defaults.ts'));

const FILE_TEMPLATE = dedent`
// THIS FILE IS GENERATED AUTOMATICALLY. DO NOT CHANGE IT MANUALLY.

import { _ } from "@ngx-translate/core";
import { Settings } from 'src/app/domain/models/meetings/meeting';

export const meetingSettingsDefaults: { [key in keyof Settings]: any } = {
export const meetingSettingsDefaults: Record<string, any> = {
`;

(async () => {
const buffer = fs.readFileSync(SOURCE);
const models: any = yaml.load(buffer.toString());
const meeting = models['meeting'];
export function isSettingsInput(item: any): any {
return `key` in item;
}

function getMeetingSettings(): string[] {
const project = new Project();
const sourceFile = project.addSourceFileAtPath(SETTING_DEFINITIONS);

const meetingSettingsDecl = sourceFile.getVariableDeclarations().find(decl => decl.getName() === 'meetingSettings');

if (!meetingSettingsDecl) {
throw new Error('Variable "meetingSettings" not found.');
}

const initializer = meetingSettingsDecl.getInitializer();

if (!initializer || initializer.getKind() !== SyntaxKind.CallExpression) {
throw new Error('Initializer is not a function call.');
}

const callExpr = initializer as CallExpression;

const calledFn = callExpr.getExpression();
if (calledFn.getText() !== 'fillInSettingsDefaults') {
throw new Error(`Expected fillInSettingsDefaults(), got "${calledFn.getText()}".`);
}

const args = callExpr.getArguments();
if (args.length === 0) {
throw new Error('fillInSettingsDefaults() was called with no arguments.');
}

const arrayArg = args[0];

if (arrayArg.getKind() !== SyntaxKind.ArrayLiteralExpression) {
throw new Error(`Expected an array argument, got ${SyntaxKind[arrayArg.getKind()]}.`);
}

const elements = (arrayArg as ArrayLiteralExpression).getElements();

const extractedKeys: string[] = [];

for (const el of elements) {
if (el.getKind() === SyntaxKind.ObjectLiteralExpression) {
const objectEl = el as ObjectLiteralExpression;

// Get all descendants with specific property name
const keyProps = objectEl
.getDescendants()
.filter(d => d.getKind() === SyntaxKind.PropertyAssignment)
.map(p => p as PropertyAssignment)
.filter(p => p.getName() === 'key');

for (const prop of keyProps) {
const initializer = prop.getInitializer();
if (!initializer) continue;

// Check if value is an array literal
if (initializer.getKind() === SyntaxKind.ArrayLiteralExpression) {
const array = initializer as ArrayLiteralExpression;
for (const element of array.getElements()) {
const value = element.getText().replace(/['`]/g, '');
extractedKeys.push(value);
}
} else {
// Single value
const value = initializer.getText().replace(/['`]/g, '');
extractedKeys.push(value);
}
}
}
}

return extractedKeys;
}

const provider = new MeetingSettingsDefinitionService();
(async (): Promise<void> => {
const models: any = yaml.load(getCollectionsYaml())['models'];
const meeting = models['meeting']['fields'];

let content = FILE_TEMPLATE + '\n';
for (const key of provider.getSettingsKeys()) {
const value = provider.settingsMap[key];
const defaultValue = meeting[key].default;
for (const key of getMeetingSettings()) {
const defaultValue = meeting[key]?.default;
if (defaultValue !== undefined) {
provider.validateDefault(key, defaultValue);
content += ` "${key}": `;
content += ` "${key as string}": `;
const defaultString = JSON.stringify(defaultValue);
/*
if (value.type === 'string' && !value.dontTranslateDefault) {
content += `_(${defaultString}),\n`;
} else {
else {
content += `${defaultString},\n`;
}
*/
content += `${defaultString},\n`;
}
}
content += '};\n';
Expand Down
2 changes: 1 addition & 1 deletion client/cli/get-available-languages.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/**
* Helper script to print a comma-separated list of all available translations.
*/
import { availableTranslations } from 'src/app/domain/definitions/languages';
import { availableTranslations } from '@app/domain/definitions/languages';

console.log(Object.keys(availableTranslations).join(`,`));
4 changes: 3 additions & 1 deletion client/cli/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
"compilerOptions": {
"baseUrl": "../",
"module": "commonjs",
"types": ["node"],
"paths": {
"*": ["*"]
}
},
"rootDir": ".."
}
}
32 changes: 32 additions & 0 deletions client/cli/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import * as fs from 'fs';
import * as path from 'path';

const SOURCE_META = path.resolve(path.join(__dirname, `../../meta/collection-meta.yml`));
const SOURCE_COLLECTIONS = path.resolve(path.join(__dirname, `../../meta/collections/`));

export function getCollectionsYaml(): string {
if (!fs.existsSync(SOURCE_COLLECTIONS)) {
console.log(`no dir `, SOURCE_COLLECTIONS);
return null;
}

let content = fs.readFileSync(SOURCE_META).toString();
content += `\nmodels:`;
const files = fs.readdirSync(SOURCE_COLLECTIONS);
for (const file of files) {
const filename = path.join(SOURCE_COLLECTIONS, file);
if (filename.endsWith(`.yml`)) {
const collection = fs.readFileSync(filename).toString().replace(/^(.)/gm, ` $1`);
content += `\n ${file.substring(0, file.length - 4)}:\n${collection}`;
}
}

return content;
}

export function snakeToPascal(input: string): string {
return input
.split(`_`)
.map(substr => substr.charAt(0).toUpperCase() + substr.slice(1))
.join(``);
}
1 change: 1 addition & 0 deletions client/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export default tseslint.config({
},
processor: angular.processInlineTemplates,
rules: {
"@angular-eslint/prefer-on-push-component-change-detection": ["off"],
"@angular-eslint/prefer-standalone": ["off"],
"@angular-eslint/prefer-inject": ["off"],
"@angular-eslint/component-selector": ["error", {
Expand Down
Loading
Loading