Skip to content
Open
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
7997544
Modeling exercises: Upgrade Apollon and unify editor workspaces
FelixTJDietrich Aug 5, 2026
376b845
Modeling exercises: Align workspace controls with Apollon
FelixTJDietrich Aug 5, 2026
1ce9489
Modeling exercises: Match actions to editor chrome
FelixTJDietrich Aug 5, 2026
aeef815
Modeling exercises: Align fullscreen resize handles
FelixTJDietrich Aug 5, 2026
3ce5a77
Modeling exercises: Integrate assessment, chrome and layout fixes
FelixTJDietrich Aug 10, 2026
a1daaeb
Merge remote-tracking branch 'origin/develop' into feature/modeling-e…
FelixTJDietrich Aug 10, 2026
88e449e
Modeling exercises: Restore fullscreen portal layering after the deve…
FelixTJDietrich Aug 10, 2026
c2d3c01
Modeling exercises: Dock the assessment panel in the exam summary
FelixTJDietrich Aug 10, 2026
3fb4aba
Modeling exercises: Keep the exam summary diagram clear of the feedba…
FelixTJDietrich Aug 10, 2026
923c10c
Modeling exercises: Clean up the explanation surface's focus outline
FelixTJDietrich Aug 10, 2026
69e7a3c
Modeling exercises: Remove dead resize machinery and leaked debug art…
FelixTJDietrich Aug 10, 2026
485eb6d
Modeling exercises: Restore the canvas height the editor needs
FelixTJDietrich Aug 11, 2026
32cc063
Atlas: Stop the competency selector reserving space it may not use
FelixTJDietrich Aug 11, 2026
0e733c0
Development: Snap measured shell heights to the device pixel grid
FelixTJDietrich Aug 11, 2026
af1f8d1
Development: Keep the theme transition off SVG content
FelixTJDietrich Aug 11, 2026
c8c5bc5
Modeling exercises: Stop the assessment panel taking the reader's vie…
FelixTJDietrich Aug 11, 2026
7b1377c
Modeling exercises: Trim comments to what the code cannot say
FelixTJDietrich Aug 11, 2026
89573fc
Merge remote-tracking branch 'origin/develop' into feature/modeling-e…
FelixTJDietrich Aug 19, 2026
648f7af
Merge remote-tracking branch 'origin/develop' into feature/modeling-e…
FelixTJDietrich Aug 20, 2026
4b97309
Modeling exercises: Use Apollon 5.3.0
FelixTJDietrich Aug 20, 2026
635217d
Modeling exercises: Exempt Apollon label overrides from translation p…
FelixTJDietrich Aug 20, 2026
a2d8896
Modeling exercises: Count example submission elements for every Apoll…
FelixTJDietrich Aug 21, 2026
eae3764
Modeling exercises: Fix practice mode and make the assessed canvas fu…
FelixTJDietrich Aug 21, 2026
49bf869
Merge remote-tracking branch 'origin/develop' into feature/modeling-e…
FelixTJDietrich Aug 21, 2026
c1ab68a
Modeling exercises: Cover the client paths the modeling coverage gate…
FelixTJDietrich Aug 21, 2026
e969a3a
Merge remote-tracking branch 'origin/develop' into feature/modeling-e…
FelixTJDietrich Aug 21, 2026
1f9a72b
Modeling exercises: Score the example assessment through the canonica…
FelixTJDietrich Aug 21, 2026
579c8b8
Merge remote-tracking branch 'origin/develop' into feature/modeling-e…
FelixTJDietrich Aug 25, 2026
537b3b9
Modeling exercises: Address the review of the editor experience branch
FelixTJDietrich Aug 25, 2026
f79b64c
Modeling exercises: Move the complaint into the pane that actually sc…
FelixTJDietrich Aug 25, 2026
d13fa8c
Modeling exercises: Stop offering Submit while the canvas is read-only
FelixTJDietrich Aug 25, 2026
9a5c71c
Modeling exercises: Report selected element ids, not assessment ids
FelixTJDietrich Aug 25, 2026
202600f
Merge remote-tracking branch 'origin/develop' into feature/modeling-e…
FelixTJDietrich Aug 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 45 additions & 7 deletions .ci/translation-file-checker/translation_file_checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class Config:
are_files: bool
german_translations: Path
english_translations: Path
ignored_prefixes: list[str]


@dataclass
Expand Down Expand Up @@ -63,10 +64,16 @@ def main(argv: list[str] | None = None) -> int:
config = _config_from_args(argv)

if config.are_files:
diff = _compare_files(config.german_translations, config.english_translations)
diff = _compare_files(
config.german_translations,
config.english_translations,
config.ignored_prefixes,
)
else:
diff = _compare_directories(
config.german_translations, config.english_translations
config.german_translations,
config.english_translations,
config.ignored_prefixes,
)

if len(diff) > 0:
Expand Down Expand Up @@ -103,6 +110,7 @@ def _config_from_args(argv: list[str]) -> Config:
are_files=are_files,
german_translations=german_translations,
english_translations=english_translations,
ignored_prefixes=args.ignore_prefix,
)


Expand All @@ -121,11 +129,19 @@ def _build_arg_parser() -> argparse.ArgumentParser:
required=True,
help="Directory containing the English translation files.",
)
parser.add_argument(
"--ignore-prefix",
action="append",
default=[],
help="Translation-key prefix intentionally provided by only one locale.",
)

return parser


def _compare_directories(german_dir: Path, english_dir: Path) -> Diff:
def _compare_directories(
german_dir: Path, english_dir: Path, ignored_prefixes: list[str]
) -> Diff:
def json_files(directory: Path) -> set[Path]:
return {
file
Expand All @@ -145,7 +161,10 @@ def json_files(directory: Path) -> set[Path]:

return reduce(
lambda d1, d2: d1 + d2,
(_compare_files(german, english) for german, english in file_pairs),
(
_compare_files(german, english, ignored_prefixes)
for german, english in file_pairs
),
)


Expand All @@ -170,9 +189,15 @@ def _find_file_pairs(
return list(v for v in pairs.values() if v[0] is not None and v[1] is not None)


def _compare_files(german: Path, english: Path) -> Diff:
german_keys = _flat_json_keys(german)
english_keys = _flat_json_keys(english)
def _compare_files(
german: Path, english: Path, ignored_prefixes: list[str]
) -> Diff:
german_keys = _without_ignored_prefixes(
_flat_json_keys(german), ignored_prefixes
)
english_keys = _without_ignored_prefixes(
_flat_json_keys(english), ignored_prefixes
)

return Diff(
all_german_keys=list(german_keys),
Expand All @@ -182,6 +207,19 @@ def _compare_files(german: Path, english: Path) -> Diff:
)


def _without_ignored_prefixes(
keys: set[str], ignored_prefixes: list[str]
) -> set[str]:
return {
key
for key in keys
if not any(
key == prefix or key.startswith(f"{prefix}.")
for prefix in ignored_prefixes
)
}


def _flat_json_keys(json_file: Path) -> set[str]:
"""
Flattens a JSON file into a flat set of keys.
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/ci-translation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,8 @@ jobs:
with:
python-version: '3.14'
- name: Check if translation keys match
run: python .ci/translation-file-checker/translation_file_checker.py --german-files src/main/webapp/i18n/de/ --english-files src/main/webapp/i18n/en/
run: >-
python .ci/translation-file-checker/translation_file_checker.py
--german-files src/main/webapp/i18n/de/
--english-files src/main/webapp/i18n/en/
--ignore-prefix .artemisApp.modelingEditor.apollon
1 change: 1 addition & 0 deletions .stylelintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"src/main/webapp/app/localci/build-job-statistics/**/*.scss",
"src/main/webapp/app/core/navbar/global-search/components/modal/global-search-modal.component.scss",
"src/main/webapp/app/shared-ui/components/buttons/copy-to-clipboard-button/**/*.scss",
"src/main/webapp/app/quiz/manage/apollon-diagrams/**/*.scss",
"src/main/webapp/app/exam/manage/exercise-groups/**/*.scss",
"src/main/webapp/app/exercise/exercise-action-bar/**/*.scss",
"src/main/webapp/app/exercise/exam-exercise-row-buttons/**/*.scss",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,3 @@ This is the equivalent delimiter-and-instruction pattern used by the [Consistenc
On the client, `QuizAiGenerationService` wraps the generated OpenAPI client and maps the DTOs and the editor's `MultipleChoiceQuestion` / `GeneratedQuestion` models. The generation dialog and the inline per-question refinement panel plug into the existing Multiple-Choice question editor, while the quiz exercise update view hosts the bulk-refinement action, shown only when Hyperion is enabled and the quiz has at least one Multiple-Choice question.

Before applying a refinement, both the single-question and bulk flows snapshot the pre-refinement question with a deep clone, which is what enables the restore-previous-version action in the refinement UI. The refinement itself then mutates the original question object in place.

Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ Conducting a Modeling exercise consists of 3 steps:

<Callout variant={CalloutVariant.info}>

<strong>Note:</strong> Artemis uses an npm package called <a href="https://www.npmjs.com/package/@ls1intum/apollon">Apollon</a> as its modeling editor. It has a standalone version which can be accessed via <a href="https://apollon.ase.in.tum.de/">apollon.ase.in.tum.de</a>. The standalone version is free to use without the necessity of creating an account and offers additional features, including sharing and exporting diagrams. For more information, visit <a href="https://github.com/ls1intum/Apollon_standalone">Apollon Standalone</a>.
<strong>Note:</strong> Artemis uses an npm package called <a href="https://www.npmjs.com/package/@tumaet/apollon">Apollon</a> as its modeling editor. It has a standalone version which can be accessed via <a href="https://apollon.ase.in.tum.de/">apollon.ase.in.tum.de</a>. The standalone version is free to use without the necessity of creating an account and offers additional features, including sharing and exporting diagrams. For more information, visit <a href="https://github.com/ls1intum/Apollon_standalone">Apollon Standalone</a>.

</Callout>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,6 @@ The <img src={exportButton} alt="Export" style={{display: 'inline', verticalAlig

<Callout variant={CalloutVariant.info}>

<strong>Note:</strong> Artemis uses an npm package called <a href="https://www.npmjs.com/package/@ls1intum/apollon">Apollon</a> as its modeling editor. It has a standalone version which can be accessed via <a href="https://apollon.ase.in.tum.de/">apollon.ase.in.tum.de</a>. The standalone version is free to use without the necessity of creating an account and offers additional features, including sharing and exporting diagrams. For more information, visit <a href="https://github.com/ls1intum/Apollon_standalone">Apollon Standalone</a>.
<strong>Note:</strong> Artemis uses an npm package called <a href="https://www.npmjs.com/package/@tumaet/apollon">Apollon</a> as its modeling editor. It has a standalone version which can be accessed via <a href="https://apollon.ase.in.tum.de/">apollon.ase.in.tum.de</a>. The standalone version is free to use without the necessity of creating an account and offers additional features, including sharing and exporting diagrams. For more information, visit <a href="https://github.com/ls1intum/Apollon_standalone">Apollon Standalone</a>.

</Callout>
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ You can work on various diagram types including class diagrams, activity diagram

<Callout variant={CalloutVariant.info}>

<strong>Note:</strong> Artemis uses an npm package called <a href="https://www.npmjs.com/package/@ls1intum/apollon">Apollon</a> as its modeling editor. It has a standalone version which can be accessed via <a href="https://apollon.ase.in.tum.de/">apollon.ase.in.tum.de</a>. The standalone version is free to use without the necessity of creating an account and offers additional features, including sharing and exporting diagrams. For more information, visit <a href="https://github.com/ls1intum/Apollon_standalone">Apollon Standalone</a>.
<strong>Note:</strong> Artemis uses an npm package called <a href="https://www.npmjs.com/package/@tumaet/apollon">Apollon</a> as its modeling editor. It has a standalone version which can be accessed via <a href="https://apollon.ase.in.tum.de/">apollon.ase.in.tum.de</a>. The standalone version is free to use without the necessity of creating an account and offers additional features, including sharing and exporting diagrams. For more information, visit <a href="https://github.com/ls1intum/Apollon_standalone">Apollon Standalone</a>.

</Callout>

Expand Down
1 change: 1 addition & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,7 @@ export default tseslint.config(
'src/main/webapp/app/localci/build-agent-details/**/*.html',
'src/main/webapp/app/localci/build-job-statistics/**/*.html',
'src/main/webapp/app/shared-ui/components/buttons/copy-to-clipboard-button/**/*.html',
'src/main/webapp/app/quiz/manage/apollon-diagrams/**/*.html',
'src/main/webapp/app/exam/manage/exercise-groups/**/*.html',
'src/main/webapp/app/exercise/exercise-action-bar/**/*.html',
'src/main/webapp/app/exercise/exam-exercise-row-buttons/**/*.html',
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
"@sentry/angular": "10.70.0",
"@stomp/rx-stomp": "2.4.0",
"@stomp/stompjs": "7.3.0",
"@tumaet/apollon": "5.0.1",
"@tumaet/apollon": "5.3.0",
"@tumaet/ui-angular": "workspace:*",
"@vscode/codicons": "0.0.45",
"@vscode/markdown-it-katex": "1.1.2",
Expand Down
Loading
Loading