chore(version): update version and changelog for release 0.8.124
All checks were successful
Deploy Development / deploy (push) Successful in 39s
Test Suite / pytest-backend (push) Successful in 36s
Test Suite / lint-backend (push) Successful in 1s
Test Suite / build-frontend (push) Successful in 11s
Test Suite / k6 /health Baseline (push) Successful in 33s
Test Suite / playwright-tests (push) Successful in 1m1s

- Bumped APP_VERSION to 0.8.124 and updated the changelog to reflect recent changes.
- Introduced the ExerciseListBulkToolbar component in ExercisesListPage for improved bulk action handling.
- Enhanced the user interface for selecting and managing exercises in bulk.
This commit is contained in:
Lars 2026-05-14 12:30:04 +02:00
parent 2e105a99b8
commit 1631bd2e02
3 changed files with 42 additions and 17 deletions

View File

@ -1,6 +1,6 @@
# Shinkan Jinkendo Version Information # Shinkan Jinkendo Version Information
APP_VERSION = "0.8.123" APP_VERSION = "0.8.124"
BUILD_DATE = "2026-05-12" BUILD_DATE = "2026-05-12"
DB_SCHEMA_VERSION = "20260514062" DB_SCHEMA_VERSION = "20260514062"
@ -36,6 +36,13 @@ MODULE_VERSIONS = {
} }
CHANGELOG = [ CHANGELOG = [
{
"version": "0.8.124",
"date": "2026-05-13",
"changes": [
"Frontend Phase 3 (Teil): ExerciseListBulkToolbar-Komponente; Übungsliste nur Verdrahtung.",
],
},
{ {
"version": "0.8.123", "version": "0.8.123",
"date": "2026-05-13", "date": "2026-05-13",

View File

@ -0,0 +1,27 @@
import React from 'react'
export default function ExerciseListBulkToolbar({
selectedCount,
bulkMaxIds,
onClearSelection,
onOpenBulkModal,
}) {
if (selectedCount < 1) return null
return (
<div className="card exercise-bulk-toolbar">
<strong>{selectedCount} ausgewählt</strong>
<button type="button" className="btn btn-secondary btn-small" onClick={onClearSelection}>
Auswahl aufheben
</button>
<button type="button" className="btn btn-primary btn-small" onClick={onOpenBulkModal}>
Massenänderung
</button>
<span className="exercise-bulk-toolbar__meta">
Bis zu {bulkMaxIds} pro Anfrage. Für Verein ohne Auswahl: aktiver Vereinskontext (
<code>X-Active-Club-Id</code>
).
</span>
</div>
)
}

View File

@ -8,6 +8,7 @@ import ExerciseListCard from '../components/exercises/ExerciseListCard'
import ExerciseListFilterModal from '../components/exercises/ExerciseListFilterModal' import ExerciseListFilterModal from '../components/exercises/ExerciseListFilterModal'
import ExerciseListBulkModal from '../components/exercises/ExerciseListBulkModal' import ExerciseListBulkModal from '../components/exercises/ExerciseListBulkModal'
import ExerciseListSearchBar from '../components/exercises/ExerciseListSearchBar' import ExerciseListSearchBar from '../components/exercises/ExerciseListSearchBar'
import ExerciseListBulkToolbar from '../components/exercises/ExerciseListBulkToolbar'
import { buildExerciseListFilterChips } from '../utils/exerciseListFilterChips' import { buildExerciseListFilterChips } from '../utils/exerciseListFilterChips'
import { applyDashboardExerciseListUrl, buildExerciseListQueryBase } from '../utils/exerciseListQuery' import { applyDashboardExerciseListUrl, buildExerciseListQueryBase } from '../utils/exerciseListQuery'
import { useExerciseListCatalogsAndQuery } from '../hooks/useExerciseListCatalogsAndQuery' import { useExerciseListCatalogsAndQuery } from '../hooks/useExerciseListCatalogsAndQuery'
@ -474,22 +475,12 @@ function ExercisesListPage() {
onToggleSelectAllPage={toggleSelectAllPage} onToggleSelectAllPage={toggleSelectAllPage}
/> />
{selectedIds.size > 0 ? ( <ExerciseListBulkToolbar
<div className="card exercise-bulk-toolbar"> selectedCount={selectedIds.size}
<strong>{selectedIds.size} ausgewählt</strong> bulkMaxIds={BULK_MAX_IDS}
<button type="button" className="btn btn-secondary btn-small" onClick={clearSelection}> onClearSelection={clearSelection}
Auswahl aufheben onOpenBulkModal={openBulkModal}
</button> />
<button type="button" className="btn btn-primary btn-small" onClick={openBulkModal}>
Massenänderung
</button>
<span className="exercise-bulk-toolbar__meta">
Bis zu {BULK_MAX_IDS} pro Anfrage. Für Verein ohne Auswahl: aktiver Vereinskontext (
<code>X-Active-Club-Id</code>
).
</span>
</div>
) : null}
<ExerciseListFilterModal <ExerciseListFilterModal
open={filterModalOpen} open={filterModalOpen}