Repository: uzh-bf/klicker-uzh
Pull request #4694: enhance: separate element status from remaining element form logic to allow users with read access to change it
Author: login: sjschlapbach
Labels: name: enhancement
name: size:L
description: This PR changes 100-499 lines, ignoring generated files.
Created: 2025-05-16T17:25:59Z | Merged: 2025-05-16T21:24:14Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Added the ability to update and synchronize element status directly within the element edit form.
  - Introduced a server-side mutation to change element status with real-time cache updates.
  - Initialized element status to "Ready" when creating new elements and templates.

- **Bug Fixes**
  - Improved status selection controls to prevent concurrent changes and ensure accurate status updates.

- **Chores**
  - Updated the "@uzh-bf/design-system" dependency to version 3.0.0-alpha.79 across multiple packages and applications.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/apps/auth/package.json b/apps/auth/package.json
index 23ab0df50b..d7c016020d 100644
--- a/apps/auth/package.json
+++ b/apps/auth/package.json
@@ -8,7 +8,7 @@
     "@klicker-uzh/prisma": "workspace:*",
     "@klicker-uzh/shared-components": "workspace:*",
     "@next-auth/prisma-adapter": "1.0.7",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "axios": "1.7.7",
     "bcryptjs": "2.4.3",
     "js-cookie": "3.0.5",
diff --git a/apps/backend-docker/package.json b/apps/backend-docker/package.json
index 22c684df31..dca3b3b2b2 100644
--- a/apps/backend-docker/package.json
+++ b/apps/backend-docker/package.json
@@ -56,7 +56,7 @@
     "@types/passport": "^1.0.16",
     "@types/passport-jwt": "^4.0.1",
     "@types/ws": "^8.5.12",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "axios": "~1.7.7",
     "cross-env": "~7.0.3",
     "dotenv": "~16.4.5",
diff --git a/apps/docs/package.json b/apps/docs/package.json
index e3e9dc5802..66ad65e81c 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -22,7 +22,7 @@
     "@mdx-js/react": "~3.1.0",
     "@tailwindcss/typography": "~0.5.15",
     "@types/react": "^18.3.11",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "autoprefixer": "~10.4.20",
     "cross-env": "~7.0.3",
     "docusaurus-plugin-matomo": "~0.0.8",
diff --git a/apps/frontend-control/package.json b/apps/frontend-control/package.json
index 9f5499b5c2..49b2040720 100644
--- a/apps/frontend-control/package.json
+++ b/apps/frontend-control/package.json
@@ -17,7 +17,7 @@
     "@klicker-uzh/prisma": "workspace:*",
     "@klicker-uzh/shared-components": "workspace:*",
     "@socialgouv/matomo-next": "1.9.1",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "cross-env": "7.0.3",
     "dayjs": "1.11.13",
     "deepmerge": "4.3.1",
diff --git a/apps/frontend-manage/package.json b/apps/frontend-manage/package.json
index 0a99704c5f..2214623c69 100644
--- a/apps/frontend-manage/package.json
+++ b/apps/frontend-manage/package.json
@@ -21,7 +21,7 @@
     "@socialgouv/matomo-next": "1.9.1",
     "@tanstack/react-table": "8.20.5",
     "@uidotdev/usehooks": "2.4.1",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "dayjs": "1.11.13",
     "deepmerge": "4.3.1",
     "formik": "2.4.6",
diff --git a/apps/frontend-manage/src/components/activities/templates/TemplateNewElementModal.tsx b/apps/frontend-manage/src/components/activities/templates/TemplateNewElementModal.tsx
index ab440944b4..c91d43cd55 100644
--- a/apps/frontend-manage/src/components/activities/templates/TemplateNewElementModal.tsx
+++ b/apps/frontend-manage/src/components/activities/templates/TemplateNewElementModal.tsx
@@ -1,3 +1,4 @@
+import { ElementStatus } from '@klicker-uzh/graphql/dist/ops'
 import { useState } from 'react'
 import ElementEditForm from '../../questions/manipulation/ElementEditForm'
 import { ElementEditMode } from '../../questions/manipulation/ElementEditModal'
@@ -38,6 +39,7 @@ function TemplateNewElementModal({
       mode={ElementEditMode.CREATE}
       loading={false}
       initialValues={formValues}
+      initialStatus={ElementStatus.Ready}
       onSubmitElement={async (values) => {
         onSaveNewElement(values)
       }}
diff --git a/apps/frontend-manage/src/components/activities/templates/extractFormValuesFromElementInstance.ts b/apps/frontend-manage/src/components/activities/templates/extractFormValuesFromElementInstance.ts
index c924da2d5e..dc44d9913a 100644
--- a/apps/frontend-manage/src/components/activities/templates/extractFormValuesFromElementInstance.ts
+++ b/apps/frontend-manage/src/components/activities/templates/extractFormValuesFromElementInstance.ts
@@ -178,7 +178,6 @@ function extractFormValuesFromElementInstance({
 
   // default / fallback case (should not happen)
   return {
-    status: ElementStatus.Ready,
     type: ElementType.Sc,
     name: '',
     content: '',
diff --git a/apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts b/apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts
index c920ef8085..0075eb067d 100644
--- a/apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts
+++ b/apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts
@@ -1,4 +1,5 @@
 import {
+  ElementStatus,
   ElementType,
   TemplateElementManipulationInput,
 } from '@klicker-uzh/graphql/dist/ops'
@@ -74,7 +75,7 @@ function processLiveQuizTemplateBlocksData({
             const args = prepareChoicesArgs({
               elementId: undefined,
               isDuplication: false,
-              values,
+              values: { ...values, status: ElementStatus.Ready },
             })
             elementManipulationData = {
               // options key needs to be removed to avoid GraphQL error on submission
@@ -88,7 +89,7 @@ function processLiveQuizTemplateBlocksData({
             const args = prepareNumericalArgs({
               elementId: undefined,
               isDuplication: false,
-              values,
+              values: { ...values, status: ElementStatus.Ready },
             })
             elementManipulationData = {
               ...omitBy(args, (_, key) => key === 'options'),
@@ -101,7 +102,7 @@ function processLiveQuizTemplateBlocksData({
             const args = prepareFreeTextArgs({
               elementId: undefined,
               isDuplication: false,
-              values,
+              values: { ...values, status: ElementStatus.Ready },
             })
             elementManipulationData = {
               ...omitBy(args, (_, key) => key === 'options'),
@@ -114,7 +115,7 @@ function processLiveQuizTemplateBlocksData({
             const args = prepareSelectionArgs({
               elementId: undefined,
               isDuplication: false,
-              values,
+              values: { ...values, status: ElementStatus.Ready },
             })
             elementManipulationData = {
               ...omitBy(args, (_, key) => key === 'options'),
@@ -127,7 +128,7 @@ function processLiveQuizTemplateBlocksData({
             const args = prepareCaseStudyArgs({
               elementId: undefined,
               isDuplication: false,
-              values,
+              values: { ...values, status: ElementStatus.Ready },
             })
             elementManipulationData = {
               ...omitBy(args, (_, key) => key === 'options'),
@@ -140,7 +141,7 @@ function processLiveQuizTemplateBlocksData({
             const args = prepareFlashcardArgs({
               elementId: undefined,
               isDuplication: false,
-              values,
+              values: { ...values, status: ElementStatus.Ready },
             })
             elementManipulationData = {
               ...args,
@@ -152,7 +153,7 @@ function processLiveQuizTemplateBlocksData({
             const args = prepareContentArgs({
               elementId: undefined,
               isDuplication: false,
-              values,
+              values: { ...values, status: ElementStatus.Ready },
             })
             elementManipulationData = {
               ...args,
diff --git a/apps/frontend-manage/src/components/questions/manipulation/ElementEditForm.tsx b/apps/frontend-manage/src/components/questions/manipulation/ElementEditForm.tsx
index e3388bbb2c..09916166ac 100644
--- a/apps/frontend-manage/src/components/questions/manipulation/ElementEditForm.tsx
+++ b/apps/frontend-manage/src/components/questions/manipulation/ElementEditForm.tsx
@@ -1,4 +1,8 @@
-import { ElementData, ElementType } from '@klicker-uzh/graphql/dist/ops'
+import {
+  ElementData,
+  ElementStatus,
+  ElementType,
+} from '@klicker-uzh/graphql/dist/ops'
 import { Button, Modal } from '@uzh-bf/design-system'
 import { Form, Formik } from 'formik'
 import { useTranslations } from 'next-intl'
@@ -36,6 +40,7 @@ function ElementEditForm({
   elementId,
   loading,
   initialValues,
+  initialStatus,
   onSubmitElement,
   setAutoSavedElement,
   failureToast,
@@ -61,7 +66,10 @@ function ElementEditForm({
   loading: boolean
   // form data props
   initialValues: ElementFormTypes
-  onSubmitElement: (values: ElementFormTypes) => Promise<void>
+  initialStatus: ElementStatus
+  onSubmitElement: (
+    values: ElementFormTypes & { status: ElementStatus }
+  ) => Promise<void>
   setAutoSavedElement: Dispatch<SetStateAction<ElementFormTypes>>
   // failure handling
   failureToast: boolean
@@ -73,7 +81,7 @@ function ElementEditForm({
   setIncludeTemplateUpdates: Dispatch<SetStateAction<boolean>>
 }) {
   const t = useTranslations()
-
+  const [elementStatus, setElementStatus] = useState(initialStatus)
   const [answerCollectionEntries, setAnswerCollectionEntries] = useState<
     { id: number; value: string }[]
   >([])
@@ -93,7 +101,7 @@ function ElementEditForm({
       validationSchema={questionManipulationSchema}
       onSubmit={async (values, { setSubmitting }) => {
         setSubmitting(true)
-        await onSubmitElement(values)
+        await onSubmitElement({ ...values, status: elementStatus })
 
         // close modal, set success toast
         setSubmitting(false)
@@ -169,6 +177,9 @@ function ElementEditForm({
                 <Form className="w-full" id="question-manipulation-form">
                   <ElementInformationFields
                     isTemplate={isTemplate}
+                    elementId={elementId}
+                    elementStatus={elementStatus}
+                    setElementStatus={setElementStatus}
                     inputsDisabled={inputsDisabled}
                     mode={mode}
                     values={values}
diff --git a/apps/frontend-manage/src/components/questions/manipulation/ElementEditModal.tsx b/apps/frontend-manage/src/components/questions/manipulation/ElementEditModal.tsx
index 62d628fd29..9ba23b58af 100644
--- a/apps/frontend-manage/src/components/questions/manipulation/ElementEditModal.tsx
+++ b/apps/frontend-manage/src/components/questions/manipulation/ElementEditModal.tsx
@@ -1,5 +1,6 @@
 import { useMutation, useQuery } from '@apollo/client'
 import {
+  ElementStatus,
   ElementType,
   GetSingleQuestionDocument,
   GetUserElementsDocument,
@@ -72,6 +73,7 @@ function ElementEditModal({
     {
       variables: { id: elementId! },
       skip: typeof elementId === 'undefined' || !isOpen,
+      fetchPolicy: 'cache-and-network',
     }
   )
 
@@ -125,6 +127,7 @@ function ElementEditModal({
       inputsDisabled={inputsDisabled}
       loading={loadingQuestion}
       initialValues={formikInitialValues}
+      initialStatus={dataQuestion?.question?.status ?? ElementStatus.Ready}
       open={isOpen}
       onClose={() => handleSetIsOpen(false)}
       failureToast={failureToast}
diff --git a/apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx b/apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx
index c871288c35..7ea86487e4 100644
--- a/apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx
+++ b/apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx
@@ -1,11 +1,19 @@
+import { useMutation } from '@apollo/client'
+import {
+  ChangeElementStatusDocument,
+  ElementStatus,
+  GetUserElementsDocument,
+} from '@klicker-uzh/graphql/dist/ops'
 import Loader from '@klicker-uzh/shared-components/src/Loader'
 import {
   FormLabel,
   FormikSelectField,
   FormikTextField,
+  SelectField,
 } from '@uzh-bf/design-system'
+import { useFormikContext } from 'formik'
 import { useTranslations } from 'next-intl'
-import { Suspense } from 'react'
+import { Dispatch, SetStateAction, Suspense, useState } from 'react'
 import SuspendedTagInput from '../tags/SuspendedTagInput'
 import { ElementEditMode } from './ElementEditModal'
 import { ElementFormTypes } from './types'
@@ -14,6 +22,9 @@ import useStatusOptions from './useStatusOptions'
 
 interface ElementInformationFieldsProps {
   isTemplate?: boolean
+  elementId?: number
+  elementStatus: ElementStatus
+  setElementStatus: Dispatch<SetStateAction<ElementStatus>>
   mode: ElementEditMode
   values: ElementFormTypes
   isSubmitting: boolean
@@ -22,6 +33,9 @@ interface ElementInformationFieldsProps {
 
 function ElementInformationFields({
   isTemplate = false,
+  elementId,
+  elementStatus,
+  setElementStatus,
   mode,
   values,
   isSubmitting,
@@ -30,6 +44,10 @@ function ElementInformationFields({
   const t = useTranslations()
   const statusOptions = useStatusOptions()
   const questionTypeOptions = useElementTypeOptions()
+  const { setFieldValue } = useFormikContext()
+
+  const [statusSaving, setStatusSaving] = useState(false)
+  const [changeElementStatus] = useMutation(ChangeElementStatusDocument)
 
   return (
     <>
@@ -47,10 +65,45 @@ function ElementInformationFields({
         />
 
         {!isTemplate ? (
-          <FormikSelectField
-            name="status"
+          <SelectField
+            value={elementStatus}
+            onChange={async (newValue) => {
+              setStatusSaving(true)
+
+              if (typeof elementId !== 'undefined') {
+                await changeElementStatus({
+                  variables: { elementId, status: newValue as ElementStatus },
+                  update: (cache, { data }) => {
+                    // check if request was successful
+                    const success = data?.changeElementStatus
+                    if (!success) return
+
+                    // update element list
+                    const queryData = cache.readQuery({
+                      query: GetUserElementsDocument,
+                    })
+
+                    if (queryData?.userElements) {
+                      cache.writeQuery({
+                        query: GetUserElementsDocument,
+                        data: {
+                          userElements: queryData?.userElements.map((obj) =>
+                            obj.id === elementId
+                              ? { ...obj, status: newValue as ElementStatus }
+                              : obj
+                          ),
+                        },
+                      })
+                    }
+                  },
+                })
+              }
+
+              setElementStatus(newValue as ElementStatus)
+              setStatusSaving(false)
+            }}
             contentPosition="popper"
-            disabled={inputsDisabled || isSubmitting}
+            disabled={isSubmitting || statusSaving}
             label={t('manage.elements.questionStatus')}
             placeholder={t('manage.elements.selectQuestionStatus')}
             items={statusOptions}
diff --git a/apps/frontend-manage/src/components/questions/manipulation/helpers.ts b/apps/frontend-manage/src/components/questions/manipulation/helpers.ts
index a52ba0b0a6..5d40135e9f 100644
--- a/apps/frontend-manage/src/components/questions/manipulation/helpers.ts
+++ b/apps/frontend-manage/src/components/questions/manipulation/helpers.ts
@@ -1,3 +1,4 @@
+import { ElementStatus } from '@klicker-uzh/graphql/dist/ops'
 import {
   ElementFormTypesCaseStudy,
   ElementFormTypesChoices,
@@ -11,7 +12,7 @@ import {
 interface PrepareContentArgsProps {
   elementId?: number
   isDuplication: boolean
-  values: ElementFormTypesContent
+  values: ElementFormTypesContent & { status: ElementStatus }
 }
 export function prepareContentArgs({
   elementId,
@@ -32,7 +33,7 @@ export function prepareContentArgs({
 interface PrepareFlashcardArgsProps {
   elementId?: number
   isDuplication: boolean
-  values: ElementFormTypesFlashcard
+  values: ElementFormTypesFlashcard & { status: ElementStatus }
 }
 export function prepareFlashcardArgs({
   elementId,
@@ -54,7 +55,7 @@ export function prepareFlashcardArgs({
 interface PrepareChoicesArgsProps {
   elementId?: number
   isDuplication: boolean
-  values: ElementFormTypesChoices
+  values: ElementFormTypesChoices & { status: ElementStatus }
 }
 export function prepareChoicesArgs({
   elementId,
@@ -97,7 +98,7 @@ export function prepareChoicesArgs({
 interface PrepareNumericalArgsProps {
   elementId?: number
   isDuplication: boolean
-  values: ElementFormTypesNumerical
+  values: ElementFormTypesNumerical & { status: ElementStatus }
 }
 export function prepareNumericalArgs({
   elementId,
@@ -167,7 +168,7 @@ export function prepareNumericalArgs({
 interface PrepareFreeTextArgsProps {
   elementId?: number
   isDuplication: boolean
-  values: ElementFormTypesFreeText
+  values: ElementFormTypesFreeText & { status: ElementStatus }
 }
 export function prepareFreeTextArgs({
   elementId,
@@ -207,7 +208,7 @@ export function prepareFreeTextArgs({
 interface PrepareSelectionArgsProps {
   elementId?: number
   isDuplication: boolean
-  values: ElementFormTypesSelection
+  values: ElementFormTypesSelection & { status: ElementStatus }
 }
 export function prepareSelectionArgs({
   elementId,
@@ -240,7 +241,7 @@ export function prepareSelectionArgs({
 interface PrepareCaseStudyArgsProps {
   elementId?: number
   isDuplication: boolean
-  values: ElementFormTypesCaseStudy
+  values: ElementFormTypesCaseStudy & { status: ElementStatus }
 }
 export function prepareCaseStudyArgs({
   elementId,
diff --git a/apps/frontend-manage/src/components/questions/manipulation/types.ts b/apps/frontend-manage/src/components/questions/manipulation/types.ts
index 41a7bcc076..9970ff94be 100644
--- a/apps/frontend-manage/src/components/questions/manipulation/types.ts
+++ b/apps/frontend-manage/src/components/questions/manipulation/types.ts
@@ -1,12 +1,7 @@
-import {
-  ElementDisplayMode,
-  ElementStatus,
-  ElementType,
-} from '@klicker-uzh/graphql/dist/ops'
+import { ElementDisplayMode, ElementType } from '@klicker-uzh/graphql/dist/ops'
 
 interface SharedQuestionFormProps {
   name: string
-  status: ElementStatus
   content: string
   basePoints: boolean
   pointsMultiplier: string
diff --git a/apps/frontend-manage/src/components/questions/manipulation/useElementFormInitialValues.ts b/apps/frontend-manage/src/components/questions/manipulation/useElementFormInitialValues.ts
index de6adf1665..0e5ffe9192 100644
--- a/apps/frontend-manage/src/components/questions/manipulation/useElementFormInitialValues.ts
+++ b/apps/frontend-manage/src/components/questions/manipulation/useElementFormInitialValues.ts
@@ -1,7 +1,6 @@
 import {
   Element,
   ElementDisplayMode,
-  ElementStatus,
   ElementType,
 } from '@klicker-uzh/graphql/dist/ops'
 import { nanoid } from 'nanoid'
@@ -28,7 +27,6 @@ function useElementFormInitialValues({
   return useMemo((): ElementFormTypes | undefined => {
     if (mode === ElementEditMode.CREATE) {
       return {
-        status: ElementStatus.Ready,
         type: ElementType.Sc,
         name: '',
         content: '',
@@ -57,7 +55,6 @@ function useElementFormInitialValues({
     }
 
     const sharedAttributes = {
-      status: question.status,
       name: isDuplication ? `${question.name} (Copy)` : question.name,
       content: question.content,
       explanation: question.explanation ?? '',
diff --git a/apps/frontend-pwa/package.json b/apps/frontend-pwa/package.json
index e6b4eb4592..ca210d53d5 100644
--- a/apps/frontend-pwa/package.json
+++ b/apps/frontend-pwa/package.json
@@ -26,7 +26,7 @@
     "@radix-ui/react-collapsible": "1.1.1",
     "@socialgouv/matomo-next": "1.9.1",
     "@uidotdev/usehooks": "2.4.1",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "body-parser": "1.20.3",
     "dayjs": "1.11.13",
     "deepmerge": "4.3.1",
diff --git a/apps/func-incoming-responses/package.json b/apps/func-incoming-responses/package.json
index f140e2da8b..ca65cd10da 100644
--- a/apps/func-incoming-responses/package.json
+++ b/apps/func-incoming-responses/package.json
@@ -16,7 +16,7 @@
   "devDependencies": {
     "@types/jsonwebtoken": "^9.0.7",
     "@types/node": "^20.16.1",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "azure-functions-core-tools": "~4.0.6610",
     "cross-env": "~7.0.3",
     "dotenv": "~16.4.5",
diff --git a/apps/func-response-processor/package.json b/apps/func-response-processor/package.json
index 7f241a0f5b..1504d57fc0 100644
--- a/apps/func-response-processor/package.json
+++ b/apps/func-response-processor/package.json
@@ -18,7 +18,7 @@
   "devDependencies": {
     "@types/jsonwebtoken": "^9.0.7",
     "@types/node": "^20.16.1",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "azure-functions-core-tools": "~4.0.6610",
     "cross-env": "~7.0.3",
     "dotenv": "~16.4.5",
diff --git a/apps/office-addin/package.json b/apps/office-addin/package.json
index de0ce759ed..9c2f1880a0 100644
--- a/apps/office-addin/package.json
+++ b/apps/office-addin/package.json
@@ -3,7 +3,7 @@
   "version": "3.3.0-alpha.54",
   "license": "AGPL-3.0",
   "dependencies": {
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "core-js": "3.30.2",
     "es6-promise": "4.2.8",
     "formik": "2.4.6",
diff --git a/packages/graphql/src/graphql/ops/MChangeElementStatus.graphql b/packages/graphql/src/graphql/ops/MChangeElementStatus.graphql
new file mode 100644
index 0000000000..a6129b8595
--- /dev/null
+++ b/packages/graphql/src/graphql/ops/MChangeElementStatus.graphql
@@ -0,0 +1,3 @@
+mutation ChangeElementStatus($elementId: Int!, $status: ElementStatus!) {
+  changeElementStatus(elementId: $elementId, status: $status)
+}
diff --git a/packages/graphql/src/ops.schema.json b/packages/graphql/src/ops.schema.json
index 9a18b1a1c0..f50f2589dc 100644
--- a/packages/graphql/src/ops.schema.json
+++ b/packages/graphql/src/ops.schema.json
@@ -17491,6 +17491,51 @@
             "isDeprecated": false,
             "deprecationReason": null
           },
+          {
+            "name": "changeElementStatus",
+            "description": null,
+            "args": [
+              {
+                "name": "elementId",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "SCALAR",
+                    "name": "Int",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              },
+              {
+                "name": "status",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "ENUM",
+                    "name": "ElementStatus",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
           {
             "name": "changeEmailSettings",
             "description": null,
diff --git a/packages/graphql/src/ops.ts b/packages/graphql/src/ops.ts
index 4ded9eac7c..6a7edbff9d 100644
--- a/packages/graphql/src/ops.ts
+++ b/packages/graphql/src/ops.ts
@@ -1604,6 +1604,7 @@ export type Mutation = {
   changeCatalogCollectionName?: Maybe<Scalars['Boolean']['output']>;
   changeCatalogCollectionObjectAccess?: Maybe<Scalars['Boolean']['output']>;
   changeCatalogObjectAccess: Scalars['Boolean']['output'];
+  changeElementStatus?: Maybe<Scalars['Boolean']['output']>;
   changeEmailSettings?: Maybe<User>;
   changeInitialSettings?: Maybe<User>;
   changeLiveQuizSettings?: Maybe<LiveQuiz>;
@@ -1836,6 +1837,12 @@ export type MutationChangeCatalogObjectAccessArgs = {
 };
 
 
+export type MutationChangeElementStatusArgs = {
+  elementId: Scalars['Int']['input'];
+  status: ElementStatus;
+};
+
+
 export type MutationChangeEmailSettingsArgs = {
   projectUpdates: Scalars['Boolean']['input'];
 };
@@ -4254,6 +4261,14 @@ export type ChangeCatalogObjectAccessMutationVariables = Exact<{
 
 export type ChangeCatalogObjectAccessMutation = { __typename?: 'Mutation', changeCatalogObjectAccess: boolean };
 
+export type ChangeElementStatusMutationVariables = Exact<{
+  elementId: Scalars['Int']['input'];
+  status: ElementStatus;
+}>;
+
+
+export type ChangeElementStatusMutation = { __typename?: 'Mutation', changeElementStatus?: boolean | null };
+
 export type ChangeEmailSettingsMutationVariables = Exact<{
   projectUpdates: Scalars['Boolean']['input'];
 }>;
@@ -6189,6 +6204,7 @@ export const ChangeActivityNameDocument = {"kind":"Document","definitions":[{"ki
 export const ChangeCatalogCollectionNameDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeCatalogCollectionName"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"catalogCollectionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeCatalogCollectionName"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"catalogCollectionId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"catalogCollectionId"}}},{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}}]}]}}]} as unknown as DocumentNode<ChangeCatalogCollectionNameMutation, ChangeCatalogCollectionNameMutationVariables>;
 export const ChangeCatalogCollectionObjectAccessDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeCatalogCollectionObjectAccess"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"catalogCollectionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"access"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ObjectAccess"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeCatalogCollectionObjectAccess"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"catalogCollectionId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"catalogCollectionId"}}},{"kind":"Argument","name":{"kind":"Name","value":"access"},"value":{"kind":"Variable","name":{"kind":"Name","value":"access"}}}]}]}}]} as unknown as DocumentNode<ChangeCatalogCollectionObjectAccessMutation, ChangeCatalogCollectionObjectAccessMutationVariables>;
 export const ChangeCatalogObjectAccessDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeCatalogObjectAccess"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assignmentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"access"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ObjectAccess"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeCatalogObjectAccess"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"assignmentId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assignmentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"access"},"value":{"kind":"Variable","name":{"kind":"Name","value":"access"}}}]}]}}]} as unknown as DocumentNode<ChangeCatalogObjectAccessMutation, ChangeCatalogObjectAccessMutationVariables>;
+export const ChangeElementStatusDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeElementStatus"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"elementId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"status"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ElementStatus"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeElementStatus"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"elementId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"elementId"}}},{"kind":"Argument","name":{"kind":"Name","value":"status"},"value":{"kind":"Variable","name":{"kind":"Name","value":"status"}}}]}]}}]} as unknown as DocumentNode<ChangeElementStatusMutation, ChangeElementStatusMutationVariables>;
 export const ChangeEmailSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeEmailSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectUpdates"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeEmailSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"projectUpdates"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectUpdates"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"sendProjectUpdates"}}]}}]}}]} as unknown as DocumentNode<ChangeEmailSettingsMutation, ChangeEmailSettingsMutationVariables>;
 export const ChangeInitialSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeInitialSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"shortname"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"locale"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"LocaleType"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sendUpdates"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeInitialSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"shortname"},"value":{"kind":"Variable","name":{"kind":"Name","value":"shortname"}}},{"kind":"Argument","name":{"kind":"Name","value":"locale"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}},{"kind":"Argument","name":{"kind":"Name","value":"sendUpdates"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sendUpdates"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"shortname"}},{"kind":"Field","name":{"kind":"Name","value":"locale"}},{"kind":"Field","name":{"kind":"Name","value":"firstLogin"}},{"kind":"Field","name":{"kind":"Name","value":"catalyst"}},{"kind":"Field","name":{"kind":"Name","value":"catalystTier"}}]}}]}}]} as unknown as DocumentNode<ChangeInitialSettingsMutation, ChangeInitialSettingsMutationVariables>;
 export const ChangeLiveQuizSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ChangeLiveQuizSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"isLiveQAEnabled"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"isConfusionFeedbackEnabled"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"isModerationEnabled"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"isGamificationEnabled"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"changeLiveQuizSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"isLiveQAEnabled"},"value":{"kind":"Variable","name":{"kind":"Name","value":"isLiveQAEnabled"}}},{"kind":"Argument","name":{"kind":"Name","value":"isConfusionFeedbackEnabled"},"value":{"kind":"Variable","name":{"kind":"Name","value":"isConfusionFeedbackEnabled"}}},{"kind":"Argument","name":{"kind":"Name","value":"isModerationEnabled"},"value":{"kind":"Variable","name":{"kind":"Name","value":"isModerationEnabled"}}},{"kind":"Argument","name":{"kind":"Name","value":"isGamificationEnabled"},"value":{"kind":"Variable","name":{"kind":"Name","value":"isGamificationEnabled"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isLiveQAEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"isConfusionFeedbackEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"isModerationEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"isGamificationEnabled"}}]}}]}}]} as unknown as DocumentNode<ChangeLiveQuizSettingsMutation, ChangeLiveQuizSettingsMutationVariables>;
diff --git a/packages/graphql/src/public/client.json b/packages/graphql/src/public/client.json
index ae85a42ca9..7d5e594e13 100644
--- a/packages/graphql/src/public/client.json
+++ b/packages/graphql/src/public/client.json
@@ -14,6 +14,7 @@
    "ChangeCatalogCollectionName": "74191eb8cf9f57ba374a4b2d2b5ff1af0bfed707b6ba8497689f233f6a8c7ed6",
    "ChangeCatalogCollectionObjectAccess": "99abaed190bb008b3301fc2537d148a7584fd911c61f189129ccb0a14e76b850",
    "ChangeCatalogObjectAccess": "02f1a689114fa7c0b095512cdc6434cd56f31988abd643769ad36d0cc003aaf2",
+   "ChangeElementStatus": "f76e2794a4bca7f49bfd1bff5e6d18aad561af3b8656b558d6cffdd9ab418567",
    "ChangeEmailSettings": "4eb1aea4a048c1f61c892d0efe44e45ce29c2f45066a91d1bebfeae593ff6fa3",
    "ChangeInitialSettings": "4561f351e34b82d5f53924dc80cf792fe7a0225ef32c99bbccc4683788fd2bea",
    "ChangeLiveQuizSettings": "4e59ba3e57074d78365cc3607a0274ae0c1ddf7fd48c12e6318a5212ea62b1d3",
diff --git a/packages/graphql/src/public/schema.graphql b/packages/graphql/src/public/schema.graphql
index 2208559740..1125f6a73a 100644
--- a/packages/graphql/src/public/schema.graphql
+++ b/packages/graphql/src/public/schema.graphql
@@ -1475,6 +1475,7 @@ type Mutation {
   changeCatalogCollectionName(catalogCollectionId: String!, name: String!): Boolean
   changeCatalogCollectionObjectAccess(access: ObjectAccess!, catalogCollectionId: String!): Boolean
   changeCatalogObjectAccess(access: ObjectAccess!, assignmentId: Int!): Boolean!
+  changeElementStatus(elementId: Int!, status: ElementStatus!): Boolean
   changeEmailSettings(projectUpdates: Boolean!): User
   changeInitialSettings(locale: LocaleType!, sendUpdates: Boolean!, shortname: String!): User
   changeLiveQuizSettings(id: String!, isConfusionFeedbackEnabled: Boolean, isGamificationEnabled: Boolean, isLiveQAEnabled: Boolean, isModerationEnabled: Boolean): LiveQuiz
diff --git a/packages/graphql/src/public/server.json b/packages/graphql/src/public/server.json
index c49128f39d..61b9796130 100644
--- a/packages/graphql/src/public/server.json
+++ b/packages/graphql/src/public/server.json
@@ -14,6 +14,7 @@
    "74191eb8cf9f57ba374a4b2d2b5ff1af0bfed707b6ba8497689f233f6a8c7ed6": "mutation ChangeCatalogCollectionName($catalogCollectionId: String!, $name: String!) {\n  changeCatalogCollectionName(\n    catalogCollectionId: $catalogCollectionId\n    name: $name\n  )\n}",
    "99abaed190bb008b3301fc2537d148a7584fd911c61f189129ccb0a14e76b850": "mutation ChangeCatalogCollectionObjectAccess($catalogCollectionId: String!, $access: ObjectAccess!) {\n  changeCatalogCollectionObjectAccess(\n    catalogCollectionId: $catalogCollectionId\n    access: $access\n  )\n}",
    "02f1a689114fa7c0b095512cdc6434cd56f31988abd643769ad36d0cc003aaf2": "mutation ChangeCatalogObjectAccess($assignmentId: Int!, $access: ObjectAccess!) {\n  changeCatalogObjectAccess(assignmentId: $assignmentId, access: $access)\n}",
+   "f76e2794a4bca7f49bfd1bff5e6d18aad561af3b8656b558d6cffdd9ab418567": "mutation ChangeElementStatus($elementId: Int!, $status: ElementStatus!) {\n  changeElementStatus(elementId: $elementId, status: $status)\n}",
    "4eb1aea4a048c1f61c892d0efe44e45ce29c2f45066a91d1bebfeae593ff6fa3": "mutation ChangeEmailSettings($projectUpdates: Boolean!) {\n  changeEmailSettings(projectUpdates: $projectUpdates) {\n    id\n    sendProjectUpdates\n    __typename\n  }\n}",
    "4561f351e34b82d5f53924dc80cf792fe7a0225ef32c99bbccc4683788fd2bea": "mutation ChangeInitialSettings($shortname: String!, $locale: LocaleType!, $sendUpdates: Boolean!) {\n  changeInitialSettings(\n    shortname: $shortname\n    locale: $locale\n    sendUpdates: $sendUpdates\n  ) {\n    id\n    email\n    shortname\n    locale\n    firstLogin\n    catalyst\n    catalystTier\n    __typename\n  }\n}",
    "4e59ba3e57074d78365cc3607a0274ae0c1ddf7fd48c12e6318a5212ea62b1d3": "mutation ChangeLiveQuizSettings($id: String!, $isLiveQAEnabled: Boolean, $isConfusionFeedbackEnabled: Boolean, $isModerationEnabled: Boolean, $isGamificationEnabled: Boolean) {\n  changeLiveQuizSettings(\n    id: $id\n    isLiveQAEnabled: $isLiveQAEnabled\n    isConfusionFeedbackEnabled: $isConfusionFeedbackEnabled\n    isModerationEnabled: $isModerationEnabled\n    isGamificationEnabled: $isGamificationEnabled\n  ) {\n    id\n    isLiveQAEnabled\n    isConfusionFeedbackEnabled\n    isModerationEnabled\n    isGamificationEnabled\n    __typename\n  }\n}",
diff --git a/packages/graphql/src/schema/mutation.ts b/packages/graphql/src/schema/mutation.ts
index eaba1903b3..1df9b1a2a8 100644
--- a/packages/graphql/src/schema/mutation.ts
+++ b/packages/graphql/src/schema/mutation.ts
@@ -981,6 +981,21 @@ export const Mutation = builder.mutationType({
         ),
       }),
 
+      changeElementStatus: t.withAuth(asUserFullAccess).boolean({
+        nullable: true,
+        args: {
+          elementId: t.arg.int({ required: true }),
+          status: t.arg({ type: ElementStatus, required: true }),
+        },
+        resolve: withPermission(
+          (args) => ({ elementId: args.elementId }),
+          DB.PermissionLevel.READ,
+          async (_, args, ctx) => {
+            return await QuestionService.changeElementStatus(args, ctx)
+          }
+        ),
+      }),
+
       manipulateContentElement: t.withAuth(asUserFullAccess).field({
         nullable: true,
         type: Element,
diff --git a/packages/graphql/src/services/questions.ts b/packages/graphql/src/services/questions.ts
index 6487550abb..a9f77b3232 100644
--- a/packages/graphql/src/services/questions.ts
+++ b/packages/graphql/src/services/questions.ts
@@ -492,6 +492,23 @@ export async function manipulateQuestion(
   }
 }
 
+export async function changeElementStatus(
+  { elementId, status }: { elementId: number; status: DB.ElementStatus },
+  ctx: ContextWithUser
+) {
+  const element = await ctx.prisma.element.update({
+    where: { id: elementId },
+    data: { status },
+  })
+
+  ctx.emitter.emit('invalidate', {
+    typename: 'Element',
+    id: element.id,
+  })
+
+  return true
+}
+
 export async function deleteElement(
   { id }: { id: number },
   ctx: ContextWithUser
diff --git a/packages/markdown/package.json b/packages/markdown/package.json
index 1ed24a27eb..b2ac02bc46 100644
--- a/packages/markdown/package.json
+++ b/packages/markdown/package.json
@@ -43,7 +43,7 @@
     "@fortawesome/free-regular-svg-icons": "^6.6.0",
     "@fortawesome/free-solid-svg-icons": "^6.6.0",
     "@fortawesome/react-fontawesome": "^0.2.2",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "next": "^15.0.0",
     "react": "^18.3.1",
     "react-dom": "^18.3.1",
diff --git a/packages/shared-components/package.json b/packages/shared-components/package.json
index f5d74fda9e..140ea4ed37 100644
--- a/packages/shared-components/package.json
+++ b/packages/shared-components/package.json
@@ -39,7 +39,7 @@
     "@fortawesome/react-fontawesome": "^0.2.2",
     "@klicker-uzh/graphql": "workspace:*",
     "@klicker-uzh/markdown": "workspace:*",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "dayjs": "^1.11.13",
     "formik": "^2.4.6",
     "js-cookie": "^3.0.5",
diff --git a/packages/transactional/package.json b/packages/transactional/package.json
index 3f20dbda95..d0ba39fa33 100644
--- a/packages/transactional/package.json
+++ b/packages/transactional/package.json
@@ -8,7 +8,7 @@
     "@react-email/components": "~0.0.25",
     "@types/node": "^20.16.1",
     "@types/react": "^18.3.11",
-    "@uzh-bf/design-system": "3.0.0-alpha.78",
+    "@uzh-bf/design-system": "3.0.0-alpha.79",
     "react": "~18.3.1",
     "react-email": "~3.0.1",
     "tsx": "~4.19.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2244dbf54a..1afbe9a304 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -72,8 +72,8 @@ importers:
         specifier: 1.0.7
         version: 1.0.7(@prisma/client@6.1.0(prisma@6.1.0))(next-auth@4.24.8(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       axios:
         specifier: 1.7.7
         version: 1.7.7(debug@4.4.0)
@@ -91,7 +91,7 @@ importers:
         version: 1.10.0
       next:
         specifier: 15.0.0
-        version: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       next-auth:
         specifier: 4.24.8
         version: 4.24.8(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -305,8 +305,8 @@ importers:
         specifier: ^8.5.12
         version: 8.5.13
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       axios:
         specifier: ~1.7.7
         version: 1.7.7(debug@4.4.0)
@@ -407,8 +407,8 @@ importers:
         specifier: ^18.3.11
         version: 18.3.18
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       autoprefixer:
         specifier: ~10.4.20
         version: 10.4.20(postcss@8.4.49)
@@ -503,8 +503,8 @@ importers:
         specifier: 1.9.1
         version: 1.9.1(next@15.0.0(@babel/core@7.21.8)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       cross-env:
         specifier: 7.0.3
         version: 7.0.3
@@ -628,7 +628,7 @@ importers:
         version: 12.25.0
       '@ducanh2912/next-pwa':
         specifier: 7.3.3
-        version: 7.3.3(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(next@15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(swc-loader@0.2.6(@swc/core@1.10.7(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15))))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15)))
+        version: 7.3.3(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(swc-loader@0.2.6(@swc/core@1.10.7(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15))))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15)))
       '@fortawesome/fontawesome-svg-core':
         specifier: 6.6.0
         version: 6.6.0
@@ -664,7 +664,7 @@ importers:
         version: link:../../packages/shared-components
       '@socialgouv/matomo-next':
         specifier: 1.9.1
-        version: 1.9.1(next@15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+        version: 1.9.1(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
       '@tanstack/react-table':
         specifier: 8.20.5
         version: 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -672,8 +672,8 @@ importers:
         specifier: 2.4.1
         version: 2.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       dayjs:
         specifier: 1.11.13
         version: 1.11.13
@@ -715,7 +715,7 @@ importers:
         version: 5.0.8
       next:
         specifier: 15.0.0
-        version: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       next-intl:
         specifier: 3.21.1
         version: 3.21.1(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
@@ -869,7 +869,7 @@ importers:
         version: 5.0.6(@capacitor/core@5.3.0)
       '@ducanh2912/next-pwa':
         specifier: 7.3.3
-        version: 7.3.3(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(next@15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(swc-loader@0.2.6(@swc/core@1.10.7(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15))))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15)))
+        version: 7.3.3(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(swc-loader@0.2.6(@swc/core@1.10.7(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15))))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15)))
       '@fortawesome/fontawesome-svg-core':
         specifier: 6.6.0
         version: 6.6.0
@@ -911,13 +911,13 @@ importers:
         version: 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@socialgouv/matomo-next':
         specifier: 1.9.1
-        version: 1.9.1(next@15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+        version: 1.9.1(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
       '@uidotdev/usehooks':
         specifier: 2.4.1
         version: 2.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       body-parser:
         specifier: 1.20.3
         version: 1.20.3
@@ -953,7 +953,7 @@ importers:
         version: 1.10.0
       next:
         specifier: 15.0.0
-        version: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       next-intl:
         specifier: 3.21.1
         version: 3.21.1(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
@@ -1080,8 +1080,8 @@ importers:
         specifier: ^20.16.1
         version: 20.17.12
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       azure-functions-core-tools:
         specifier: ~4.0.6610
         version: 4.0.6610
@@ -1132,8 +1132,8 @@ importers:
         specifier: ^20.16.1
         version: 20.17.12
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       azure-functions-core-tools:
         specifier: ~4.0.6610
         version: 4.0.6610
@@ -1202,8 +1202,8 @@ importers:
   apps/office-addin:
     dependencies:
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       core-js:
         specifier: 3.30.2
         version: 3.30.2
@@ -1653,11 +1653,11 @@ importers:
         specifier: ^0.2.2
         version: 0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1)
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       next:
         specifier: ^15.0.0
-        version: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       react:
         specifier: ^18.3.1
         version: 18.3.1
@@ -1757,7 +1757,7 @@ importers:
     dependencies:
       next:
         specifier: ^15.0.0
-        version: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
 
   packages/prisma:
     dependencies:
@@ -1853,8 +1853,8 @@ importers:
         specifier: ^0.2.2
         version: 0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1)
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       dayjs:
         specifier: ^1.11.13
         version: 1.11.13
@@ -1869,7 +1869,7 @@ importers:
         version: 1.10.0
       next:
         specifier: ^15.0.0
-        version: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       next-intl:
         specifier: ^3.21.1
         version: 3.21.1(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
@@ -1986,8 +1986,8 @@ importers:
         specifier: ^18.3.11
         version: 18.3.18
       '@uzh-bf/design-system':
-        specifier: 3.0.0-alpha.78
-        version: 3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
+        specifier: 3.0.0-alpha.79
+        version: 3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)
       react:
         specifier: ~18.3.1
         version: 18.3.1
@@ -7934,8 +7934,8 @@ packages:
   '@ungap/structured-clone@1.2.1':
     resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==}
 
-  '@uzh-bf/design-system@3.0.0-alpha.78':
-    resolution: {integrity: sha512-7fvyDowpMmkQkFk78Y1NIqBCGwXAxNCNJ2xjYBJ53OcTOacozRJeExeZ2Edp2DIPMrx3ghbQ+wvre0W/kN5sEg==}
+  '@uzh-bf/design-system@3.0.0-alpha.79':
+    resolution: {integrity: sha512-IAGtOwIGX29J9riF+MAOzu5642KaWVD0ngGtNcfMhN0RnA7kYyAfV5S7GafM9FhvuA0o6U/vuQCcr9FTnS3rgw==}
     engines: {node: '=20'}
     peerDependencies:
       '@fortawesome/fontawesome-svg-core': ^6.6.0
@@ -21073,11 +21073,11 @@ snapshots:
       - supports-color
       - uglify-js
 
-  '@ducanh2912/next-pwa@7.3.3(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(next@15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(swc-loader@0.2.6(@swc/core@1.10.7(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15))))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15)))':
+  '@ducanh2912/next-pwa@7.3.3(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(swc-loader@0.2.6(@swc/core@1.10.7(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15))))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15)))':
     dependencies:
       clean-webpack-plugin: 4.0.0(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15)))
       fast-glob: 3.2.12
-      next: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      next: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       terser-webpack-plugin: 5.3.6(@swc/core@1.10.7(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15)))
       webpack: 5.97.1(@swc/core@1.10.7(@swc/helpers@0.5.15))
       workbox-build: 6.5.4(@types/babel__core@7.20.5)
@@ -24955,9 +24955,9 @@ snapshots:
     dependencies:
       next: 15.0.0(@babel/core@7.21.8)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
 
-  '@socialgouv/matomo-next@1.9.1(next@15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))':
+  '@socialgouv/matomo-next@1.9.1(next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))':
     dependencies:
-      next: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      next: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
 
   '@socket.io/component-emitter@3.1.2': {}
 
@@ -25985,7 +25985,7 @@ snapshots:
 
   '@ungap/structured-clone@1.2.1': {}
 
-  '@uzh-bf/design-system@3.0.0-alpha.78(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)':
+  '@uzh-bf/design-system@3.0.0-alpha.79(@fortawesome/fontawesome-svg-core@6.6.0)(@fortawesome/free-regular-svg-icons@6.6.0)(@fortawesome/free-solid-svg-icons@6.6.0)(@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(class-variance-authority@0.7.1)(clsx@2.1.1)(dayjs@1.11.13)(formik@2.4.6(react@18.3.1))(lucide-react@0.424.0(react@18.3.1))(postcss-import@16.1.0(postcss@8.4.49))(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss-radix@3.0.5(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.6.3)))(yup@1.4.0)':
     dependencies:
       '@fortawesome/fontawesome-svg-core': 6.6.0
       '@fortawesome/free-regular-svg-icons': 6.6.0
@@ -32818,7 +32818,7 @@ snapshots:
       '@panva/hkdf': 1.2.1
       cookie: 0.5.0
       jose: 4.15.9
-      next: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      next: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       oauth: 0.9.15
       openid-client: 5.7.1
       preact: 10.25.4
@@ -32858,7 +32858,7 @@ snapshots:
     dependencies:
       '@formatjs/intl-localematcher': 0.5.10
       negotiator: 0.6.4
-      next: 15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      next: 15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       react: 18.3.1
       use-intl: 3.26.3(react@18.3.1)
 
@@ -32901,7 +32901,7 @@ snapshots:
       - '@babel/core'
       - babel-plugin-macros
 
-  next@15.0.0(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+  next@15.0.0(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
     dependencies:
       '@next/env': 15.0.0
       '@swc/counter': 0.1.3


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>🔭 Outside diff range comments (1)</summary><blockquote>

<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx (1)</summary><blockquote>

`68-113`: _🛠️ Refactor suggestion_

**Enhance error handling in status update flow.**

The current implementation doesn't handle mutation errors or provide user feedback if the status update fails. Consider adding error handling and a notification mechanism.


```diff
<SelectField
  value={elementStatus}
  onChange={async (newValue) => {
    setStatusSaving(true)
+    let success = false;

    if (typeof elementId !== 'undefined') {
-      await changeElementStatus({
+      try {
+        const result = await changeElementStatus({
          variables: { elementId, status: newValue as ElementStatus },
          update: (cache, { data }) => {
            // check if request was successful
            const success = data?.changeElementStatus
            if (!success) return

            // update element list
            const queryData = cache.readQuery({
              query: GetUserElementsDocument,
            })

            if (queryData?.userElements) {
              cache.writeQuery({
                query: GetUserElementsDocument,
                data: {
                  userElements: queryData?.userElements.map((obj) =>
                    obj.id === elementId
                      ? { ...obj, status: newValue as ElementStatus }
                      : obj
                  ),
                },
              })
            }
          },
        })
+        success = !!result.data?.changeElementStatus;
+      } catch (error) {
+        console.error('Failed to update element status:', error);
+        // Optionally show an error toast or notification here
+      }
    }

-    setElementStatus(newValue as ElementStatus)
+    // Only update local state if server update was successful or elementId is undefined
+    if (success || typeof elementId === 'undefined') {
+      setElementStatus(newValue as ElementStatus)
+    }
    setStatusSaving(false)
  }}
  contentPosition="popper"
  disabled={isSubmitting || statusSaving}
  label={t('manage.elements.questionStatus')}
  placeholder={t('manage.elements.selectQuestionStatus')}
  items={statusOptions}
  data={{ cy: 'select-question-status' }}
  className={{ select: { trigger: 'h-8 w-32' } }}
/>
```

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (2)</summary><blockquote>

<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx (2)</summary><blockquote>

`14-14`: **Potential unused import.**

The useFormikContext import is added but appears to be unused in the shown code. If it's not used elsewhere in the component, consider removing it.


```diff
-import { useFormikContext } from 'formik'
```

---

`47-48`: **Unused Formik context.**

The `setFieldValue` from `useFormikContext` is retrieved but not used in the code. Remove it if not needed, or document why it's being retrieved.


```diff
-  const { setFieldValue } = useFormikContext()
-
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 04e407527406871de905af3ca600183ac7cbd068 and b70c94a126a6640705d5d8cb884833645584692a.

</details>

<details>
<summary>⛔ Files ignored due to path filters (7)</summary>

* `packages/graphql/src/graphql/ops/MChangeElementStatus.graphql` is excluded by `!**/**/graphql/ops/**`
* `packages/graphql/src/ops.schema.json` is excluded by `!**/**/ops.schema.json`
* `packages/graphql/src/ops.ts` is excluded by `!**/**/ops.ts`
* `packages/graphql/src/public/client.json` is excluded by `!**/**/public/**`
* `packages/graphql/src/public/schema.graphql` is excluded by `!**/**/public/**`
* `packages/graphql/src/public/server.json` is excluded by `!**/**/public/**`
* `pnpm-lock.yaml` is excluded by `!**/pnpm-lock.yaml`

</details>

<details>
<summary>📒 Files selected for processing (19)</summary>

* `apps/auth/package.json` (1 hunks)
* `apps/backend-docker/package.json` (1 hunks)
* `apps/docs/package.json` (1 hunks)
* `apps/frontend-control/package.json` (1 hunks)
* `apps/frontend-manage/package.json` (1 hunks)
* `apps/frontend-manage/src/components/questions/manipulation/ElementEditForm.tsx` (6 hunks)
* `apps/frontend-manage/src/components/questions/manipulation/ElementEditModal.tsx` (3 hunks)
* `apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx` (5 hunks)
* `apps/frontend-manage/src/components/questions/manipulation/types.ts` (1 hunks)
* `apps/frontend-manage/src/components/questions/manipulation/useElementFormInitialValues.ts` (0 hunks)
* `apps/frontend-pwa/package.json` (1 hunks)
* `apps/func-incoming-responses/package.json` (1 hunks)
* `apps/func-response-processor/package.json` (1 hunks)
* `apps/office-addin/package.json` (1 hunks)
* `packages/graphql/src/schema/mutation.ts` (1 hunks)
* `packages/graphql/src/services/questions.ts` (1 hunks)
* `packages/markdown/package.json` (1 hunks)
* `packages/shared-components/package.json` (1 hunks)
* `packages/transactional/package.json` (1 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (1)</summary>

* apps/frontend-manage/src/components/questions/manipulation/useElementFormInitialValues.ts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (4)</summary>

<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/ElementEditModal.tsx (1)</summary><blockquote>

<details>
<summary>packages/graphql/src/schema/elementData.ts (1)</summary>

* `ElementStatus` (29-31)

</details>

</blockquote></details>
<details>
<summary>packages/graphql/src/services/questions.ts (2)</summary><blockquote>

<details>
<summary>packages/graphql/src/schema/elementData.ts (1)</summary>

* `ElementStatus` (29-31)

</details>
<details>
<summary>packages/graphql/src/lib/context.ts (1)</summary>

* `ContextWithUser` (32-41)

</details>

</blockquote></details>
<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/ElementEditForm.tsx (2)</summary><blockquote>

<details>
<summary>packages/graphql/src/schema/elementData.ts (1)</summary>

* `ElementStatus` (29-31)

</details>
<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/types.ts (1)</summary>

* `ElementFormTypes` (125-132)

</details>

</blockquote></details>
<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx (2)</summary><blockquote>

<details>
<summary>packages/graphql/src/schema/elementData.ts (1)</summary>

* `ElementStatus` (29-31)

</details>
<details>
<summary>packages/graphql/src/services/questions.ts (1)</summary>

* `changeElementStatus` (495-510)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (11)</summary>

* GitHub Check: check
* GitHub Check: cypress-run
* GitHub Check: build
* GitHub Check: SonarCloud
* GitHub Check: build
* GitHub Check: build
* GitHub Check: format
* GitHub Check: test
* GitHub Check: Analyze (javascript)
* GitHub Check: build
* GitHub Check: build

</details>

<details>
<summary>🔇 Additional comments (28)</summary><blockquote>

<details>
<summary>apps/frontend-pwa/package.json (1)</summary>

`29-29`: **Consistent version bump for @uzh-bf/design-system**  
The dependency has been updated from `3.0.0-alpha.78` to `3.0.0-alpha.79`, in line with all other workspace packages.

</details>
<details>
<summary>apps/auth/package.json (1)</summary>

`11-11`: **Consistent version bump for @uzh-bf/design-system**  
The dependency has been updated from `3.0.0-alpha.78` to `3.0.0-alpha.79`, aligning this package with the rest of the monorepo.

</details>
<details>
<summary>apps/frontend-manage/package.json (1)</summary>

`24-24`: **Consistent version bump for @uzh-bf/design-system**  
The dependency has been updated from `3.0.0-alpha.78` to `3.0.0-alpha.79`, keeping the version uniform across all frontend applications.

</details>
<details>
<summary>apps/docs/package.json (1)</summary>

`25-25`: **Consistent version bump for @uzh-bf/design-system**  
The devDependency has been updated from `3.0.0-alpha.78` to `3.0.0-alpha.79`, matching other packages in the repo.

</details>
<details>
<summary>apps/frontend-control/package.json (1)</summary>

`20-20`: **Consistent version bump for @uzh-bf/design-system**  
The dependency has been updated from `3.0.0-alpha.78` to `3.0.0-alpha.79`, ensuring consistency across projects.

</details>
<details>
<summary>apps/office-addin/package.json (1)</summary>

`6-6`: **Consistent dependency version bump**  
The `@uzh-bf/design-system` dependency has been updated from `3.0.0-alpha.78` to `3.0.0-alpha.79` to align with the coordinated version upgrade across all packages. No other changes detected.

</details>
<details>
<summary>packages/transactional/package.json (1)</summary>

`11-11`: **Aligned devDependency update**  
The `@uzh-bf/design-system` devDependency has been bumped to `3.0.0-alpha.79`, matching other transactional and application packages. This keeps the design-system version consistent across the repo.

</details>
<details>
<summary>packages/shared-components/package.json (1)</summary>

`42-42`: **Peer dependency version sync**  
The peer dependency `@uzh-bf/design-system` has been updated to `3.0.0-alpha.79`, ensuring that shared components target the same design-system version as the rest of the codebase.

</details>
<details>
<summary>packages/markdown/package.json (1)</summary>

`46-46`: **Peer dependency bump for consistency**  
Upgraded the `@uzh-bf/design-system` peer dependency to `3.0.0-alpha.79` to remain in sync with the repository-wide design-system upgrade.

</details>
<details>
<summary>apps/func-incoming-responses/package.json (1)</summary>

`19-19`: **DevDependency version alignment**  
The `@uzh-bf/design-system` devDependency has been updated to `3.0.0-alpha.79`, consistent with the coordinated bump across all functions and applications.

</details>
<details>
<summary>apps/backend-docker/package.json (1)</summary>

`59-59`: **Dependency version bump looks good.**

The update of `@uzh-bf/design-system` from `3.0.0-alpha.78` to `3.0.0-alpha.79` is consistent with similar updates across other packages in the repository.

</details>
<details>
<summary>apps/func-response-processor/package.json (1)</summary>

`21-21`: **Consistent dependency update.**

The `@uzh-bf/design-system` dependency has been updated to version `3.0.0-alpha.79`, maintaining consistency with the rest of the repository.

</details>
<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/types.ts (2)</summary>

`1-1`: **Good refactoring to separate element status.**

The import statement has been simplified by removing `ElementStatus`, which aligns with the PR objective of separating element status management from the form logic.

---

`3-9`: **Clean removal of status from shared props.**

The `status` property has been correctly removed from the `SharedQuestionFormProps` interface, completing the separation of element status from the form's core properties.

</details>
<details>
<summary>packages/graphql/src/schema/mutation.ts (1)</summary>

`984-997`: **Well-implemented new mutation for status management.**

The new `changeElementStatus` mutation is properly secured with authentication and correctly checks for READ permissions on the element, which aligns with the PR objective of allowing users with read access to change element status. The mutation is cleanly implemented with appropriate arguments and return type.

This change enables a more controlled approach to element status management by providing a dedicated mutation rather than bundling it with other form properties, improving the separation of concerns.

</details>
<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/ElementEditModal.tsx (3)</summary>

`3-3`: **Good addition of ElementStatus import.**

The import of ElementStatus enum is necessary for typing the initialStatus prop that will be passed to ElementEditForm.

---

`76-76`: **Appropriate fetch policy for responsive UI.**

The `fetchPolicy: 'cache-and-network'` ensures an optimal user experience by immediately displaying cached data while also fetching fresh data from the network. This is especially important for the element status which can now be modified independently.

---

`130-130`: **Good implementation of status initialization.**

The initialStatus prop correctly passes the element's status from the query result, with a fallback to ElementStatus.Ready. This ensures the form always has a valid status value, even before the network request completes.

</details>
<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/ElementEditForm.tsx (5)</summary>

`3-5`: **Good organization of imports.**

The imports are now properly organized with ElementStatus included alongside other GraphQL types.

---

`43-43`: **Clear API design for status management.**

The updated component interface with initialStatus prop and modified onSubmitElement signature creates a clean separation of concerns for status management. This supports the PR objective to allow status changes independently from other form fields.



Also applies to: 69-72

---

`84-84`: **Good state management approach.**

Using a separate useState hook for element status instead of integrating it into the Formik form state allows for independent status updates without triggering full form validation or submission.

---

`104-104`: **Consistent handling of status in form submission.**

The status is correctly included in the form submission by spreading it into the values object, which maintains compatibility with the backend API while supporting the new status management approach.

---

`181-183`: **Proper props passing to child component.**

The elementStatus state and setter are correctly passed to ElementInformationFields, enabling the controlled status field implementation in that component.

</details>
<details>
<summary>apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx (5)</summary>

`1-6`: **Good addition of required imports.**

The imports for Apollo client, mutation documents and ElementStatus are necessary for the new status management approach.

---

`12-12`: **Appropriate UI component selection.**

Replacing FormikSelectField with SelectField allows for controlled component behavior outside of the Formik form state.

---

`26-28`: **Clear interface definition for new props.**

The component interface is properly updated to include the new props for element status management, with appropriate types.



Also applies to: 37-38

---

`49-50`: **Good loading state management.**

Adding statusSaving state to manage the loading state during mutation execution is a good practice for providing visual feedback to users.

---

`106-106`: **Good disabled state handling.**

The select field is correctly disabled during both form submission and status save operations, preventing potential race conditions.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-16T17:29:42Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts (1)</summary><blockquote>

`67-174`: **Consider extracting the status assignment logic**

The status assignment is identical across all element types. To improve maintainability, consider extracting this logic to create a wrapper function or applying the status earlier in the process.


Example approach:
```diff
// Before the switch statement
values = {
  ...values,
  status: ElementStatus.Ready
}

// Then in each case, remove the explicit status assignment
case ElementType.Sc:
case ElementType.Mc:
case ElementType.Kprim: {
  const args = prepareChoicesArgs({
    elementId: undefined,
    isDuplication: false,
-   values: { ...values, status: ElementStatus.Ready },
+   values,
  })
  // rest of the code
}
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between b70c94a126a6640705d5d8cb884833645584692a and c26361f362f33fe81022c69323514c6d6f09a3f0.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `apps/frontend-manage/src/components/activities/templates/TemplateNewElementModal.tsx` (2 hunks)
* `apps/frontend-manage/src/components/activities/templates/extractFormValuesFromElementInstance.ts` (0 hunks)
* `apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts` (8 hunks)
* `apps/frontend-manage/src/components/questions/manipulation/helpers.ts` (8 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (1)</summary>

* apps/frontend-manage/src/components/activities/templates/extractFormValuesFromElementInstance.ts

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (1)</summary>

* apps/frontend-manage/src/components/questions/manipulation/helpers.ts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (2)</summary>

<details>
<summary>apps/frontend-manage/src/components/activities/templates/TemplateNewElementModal.tsx (1)</summary><blockquote>

<details>
<summary>packages/graphql/src/schema/elementData.ts (1)</summary>

* `ElementStatus` (29-31)

</details>

</blockquote></details>
<details>
<summary>apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts (1)</summary><blockquote>

<details>
<summary>packages/graphql/src/schema/elementData.ts (1)</summary>

* `ElementStatus` (29-31)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (11)</summary>

* GitHub Check: check
* GitHub Check: Analyze (javascript)
* GitHub Check: build
* GitHub Check: build
* GitHub Check: format
* GitHub Check: cypress-run
* GitHub Check: build
* GitHub Check: SonarCloud
* GitHub Check: build
* GitHub Check: build
* GitHub Check: test

</details>

<details>
<summary>🔇 Additional comments (4)</summary><blockquote>

<details>
<summary>apps/frontend-manage/src/components/activities/templates/TemplateNewElementModal.tsx (2)</summary>

`1-1`: **Good addition of ElementStatus import**

The import of ElementStatus from the GraphQL operations package properly aligns with the new status management approach being implemented across the application.

---

`42-42`: **Explicit initialization of element status looks good**

Setting the initial status to `ElementStatus.Ready` for new template elements ensures consistency with the broader changes that separate element status management from other form logic. This will allow users with read access to change element status independently.

</details>
<details>
<summary>apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts (2)</summary>

`2-2`: **Good addition of ElementStatus import**

The import of ElementStatus is necessary for the status assignment throughout the file.

---

`78-78`: **Consistent application of ElementStatus.Ready across all element types**

The changes systematically add `status: ElementStatus.Ready` to all element types during preparation, which ensures consistency in how element status is handled. This implementation aligns well with the PR's objective of separating element status from other form logic.



Also applies to: 92-92, 105-105, 118-118, 131-131, 144-144, 156-156

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-16T20:14:20Z

Review comments:
diff_hunk: @@ -492,6 +492,23 @@ export async function manipulateQuestion(
   }
 }
 
+export async function changeElementStatus(
+  { elementId, status }: { elementId: number; status: DB.ElementStatus },
+  ctx: ContextWithUser
+) {
+  const element = await ctx.prisma.element.update({
+    where: { id: elementId },
+    data: { status },
+  })
path: packages/graphql/src/services/questions.ts
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Consider adding error handling for the database update.**

The current implementation doesn't handle the case where the element might not exist or other potential database errors. Consider adding a try/catch block or checking if the element exists before updating.


```diff
export async function changeElementStatus(
  { elementId, status }: { elementId: number; status: DB.ElementStatus },
  ctx: ContextWithUser
) {
-  const element = await ctx.prisma.element.update({
-    where: { id: elementId },
-    data: { status },
-  })
+  try {
+    // Verify element exists and user has appropriate permissions
+    const elementExists = await ctx.prisma.element.findUnique({
+      where: { 
+        id: elementId,
+        permissions: { some: { userId: ctx.user.sub } } 
+      },
+    })
+    
+    if (!elementExists) {
+      return false
+    }
+    
+    // Update the element status
+    const element = await ctx.prisma.element.update({
+      where: { id: elementId },
+      data: { status },
+    })
+    
+    ctx.emitter.emit('invalidate', {
+      typename: 'Element',
+      id: element.id,
+    })
+    
+    return true
+  } catch (error) {
+    console.error('Failed to update element status:', error)
+    return false
+  }
}
```


> Committable suggestion skipped: line range outside the PR's diff.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In packages/graphql/src/services/questions.ts around lines 499 to 502, the code
updates an element in the database without handling errors or the case where the
element might not exist. Wrap the update call in a try/catch block to catch
potential database errors, and optionally check if the element exists before
updating. In the catch block, handle or log the error appropriately to ensure
the function behaves predictably on failure.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-16T17:29:41Z
author_association: NONE
diff_hunk: @@ -492,6 +492,23 @@
   }
 }
 
+export async function changeElementStatus(
+  { elementId, status }: { elementId: number; status: DB.ElementStatus },
+  ctx: ContextWithUser
+) {
+  const element = await ctx.prisma.element.update({
+    where: { id: elementId },
+    data: { status },
+  })
+
+  ctx.emitter.emit('invalidate', {
+    typename: 'Element',
+    id: element.id,
+  })
+
+  return true
+}
path: packages/graphql/src/services/questions.ts
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**Missing permission check in changeElementStatus function.**

The function updates the element status without explicitly verifying if the user has permission to modify the element. While permission checks might be happening at the resolver level, it's important to maintain consistent authorization patterns across all service functions.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check if other element manipulation functions in this file implement permission checks
grep -A 10 -B 10 "permissionLevel" packages/graphql/src/services/questions.ts | grep "update\|manipulate"

# Check if the GraphQL resolver has permission checks for this mutation
grep -A 15 "changeElementStatus" packages/graphql/src/schema/mutation.ts
```

Length of output: 1845

---



</details>

**Enforce WRITE permission for changeElementStatus mutation**

The `changeElementStatus` resolver is currently guarded by `DB.PermissionLevel.READ`, but since it updates data you should require at least `DB.PermissionLevel.WRITE`.  

• packages/graphql/src/schema/mutation.ts: in the `changeElementStatus` field’s `withPermission` call  
  - replace `DB.PermissionLevel.READ` with `DB.PermissionLevel.WRITE`  

Suggested diff:
```diff
 resolve: withPermission(
-  (args) => ({ elementId: args.elementId }),
-  DB.PermissionLevel.READ,
+  (args) => ({ elementId: args.elementId }),
+  DB.PermissionLevel.WRITE,
   async (_, args, ctx) => {
     return await QuestionService.changeElementStatus(args, ctx)
   }
 ),
```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
resolve: withPermission(
  (args) => ({ elementId: args.elementId }),
  DB.PermissionLevel.WRITE,
  async (_, args, ctx) => {
    return await QuestionService.changeElementStatus(args, ctx)
  }
),
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In packages/graphql/src/schema/mutation.ts around the changeElementStatus
mutation definition, update the permission level from DB.PermissionLevel.READ to
DB.PermissionLevel.WRITE to enforce proper authorization for this data-modifying
operation. Locate the withPermission call wrapping changeElementStatus and
replace the permission argument accordingly to ensure only users with write
access can invoke this mutation.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-16T17:29:41Z
author_association: NONE

PR comments:
user: login: aviator-app[bot]
created_at: 2025-05-16T17:26:03Z
body: # Current Aviator status
> Aviator will automatically update this comment as the status of the PR changes.
> Comment `/aviator refresh` to force Aviator to re-examine your PR (or [learn about other `/aviator` commands](https://docs.aviator.co/reference/slash-commands)).


This PR was merged manually (without Aviator). Merging manually can negatively impact the performance of the queue. Consider using Aviator next time.

---
<div id="aviator-app-message">
  See the real-time status of this PR on the
  <a class="promote-aviator-app" href="https://app.aviator.co/repo/uzh-bf/klicker-uzh/pull/4694" target="_blank">Aviator webapp</a>.
</div>

<div id="chrome-ext-message">
  Use the <a href="https://chrome.google.com/webstore/detail/inoabloekooadaolcncfmpgafkgbgnif" target='_blank'>Aviator Chrome Extension</a>
  to see the status of your PR within GitHub.
</div>
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-05-16T17:26:07Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

## Walkthrough

This update introduces a new GraphQL mutation and supporting backend logic to allow changing the status of an element. The frontend management interface is refactored to handle element status as a controlled, server-synchronized property, with UI changes to support status selection and mutation. Additionally, the `@uzh-bf/design-system` dependency is updated to version 3.0.0-alpha.79 across multiple packages.

## Changes

| Files/Paths                                                                                  | Change Summary                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
|---------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `apps/auth/package.json`, `apps/backend-docker/package.json`, `apps/docs/package.json`,<br>`apps/frontend-control/package.json`, `apps/frontend-manage/package.json`, `apps/frontend-pwa/package.json`,<br>`apps/func-incoming-responses/package.json`, `apps/func-response-processor/package.json`,<br>`apps/office-addin/package.json`, `packages/markdown/package.json`,<br>`packages/shared-components/package.json`, `packages/transactional/package.json` | Updated the `@uzh-bf/design-system` dependency version from 3.0.0-alpha.78 to 3.0.0-alpha.79. No other changes to dependencies, scripts, or configuration.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `apps/frontend-manage/src/components/questions/manipulation/ElementEditForm.tsx`            | Enhanced the `ElementEditForm` to manage and submit element status. Added `initialStatus` prop, internal status state, and updated submission logic to include status. Passed status and its setter to child components. Updated the `onSubmitElement` signature to include status.                                                                                                                                                                                                                                                                                                                                                                               |
| `apps/frontend-manage/src/components/questions/manipulation/ElementEditModal.tsx`           | Set up the `ElementEditForm` to receive `initialStatus` from fetched question data or default to `Ready`. Changed the query fetch policy to `'cache-and-network'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `apps/frontend-manage/src/components/questions/manipulation/ElementInformationFields.tsx`   | Refactored to manage element status via controlled props. Replaced Formik-controlled status field with a controlled `SelectField`. On status change, triggers a GraphQL mutation to update status on the server and updates Apollo cache. Updated props interface to include `elementId`, `elementStatus`, and `setElementStatus`.                                                                                                                                                                                                                                                                                        |
| `apps/frontend-manage/src/components/questions/manipulation/types.ts`                       | Removed `status: ElementStatus` from the `SharedQuestionFormProps` interface and simplified imports.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `apps/frontend-manage/src/components/questions/manipulation/useElementFormInitialValues.ts` | Removed `status` from initial form values for element creation and editing.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `apps/frontend-manage/src/components/activities/templates/TemplateNewElementModal.tsx`      | Added `initialStatus` prop with value `ElementStatus.Ready` to `ElementEditForm` when creating new template elements.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `apps/frontend-manage/src/components/activities/templates/extractFormValuesFromElementInstance.ts` | Removed `status` property from fallback return object in `extractFormValuesFromElementInstance` function.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `apps/frontend-manage/src/components/activities/templates/liveQuiz/processLiveQuizTemplateBlocksData.ts` | Added `status: ElementStatus.Ready` to `values` objects passed to element preparation functions for all element types in live quiz template processing.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `apps/frontend-manage/src/components/questions/manipulation/helpers.ts`                     | Updated all `Prepare*ArgsProps` interfaces to include `status: ElementStatus` in the `values` type. Preparation functions now expect and use the `status` field.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `packages/graphql/src/schema/mutation.ts`                                                   | Added new mutation `changeElementStatus(elementId: Int!, status: ElementStatus!): Boolean` requiring authentication and permission checks.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `packages/graphql/src/services/questions.ts`                                                | Added `changeElementStatus` service function to update element status in the database and emit an invalidation event.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant ElementEditForm
    participant ElementInformationFields
    participant GraphQL API
    participant DB

    User->>ElementEditForm: Open edit modal (with initialStatus)
    ElementEditForm->>ElementInformationFields: Render with elementStatus, setElementStatus
    User->>ElementInformationFields: Change status via SelectField
    ElementInformationFields->>GraphQL API: mutation changeElementStatus(elementId, newStatus)
    GraphQL API->>DB: Update element status
    GraphQL API-->>ElementInformationFields: Mutation result (success/failure)
    ElementInformationFields->>Apollo Cache: Update cached element status
    User->>ElementEditForm: Submit form
    ElementEditForm->>GraphQL API: Submit form values + status
```

## Possibly related PRs

- uzh-bf/klicker-uzh#4180: Introduces the element status feature including schema, mutations, UI components, filtering, and database migration; this PR builds upon and extends that functionality.

## Suggested labels

`dependencies`

## Suggested reviewers

- rschlaefli

</details>

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings
<details open="true">
<summary>🧪 Generate Unit Tests</summary>

- [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Create PR with Unit Tests
- [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Commit Unit Tests in branch `element-status-modification-shared`
- [ ] <!-- {"checkboxId": "07f1e7d6-8a8e-4e23-9900-8731c2c87f58", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Post Copyable Unit Tests in Comment

</details>

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=uzh-bf/klicker-uzh&utm_content=4694):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai generate unit tests` to generate unit tests for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-05-16T20:14:28Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=uzh-bf_klicker-uzh&pullRequest=4694) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [1 New issue](https://sonarcloud.io/project/issues?id=uzh-bf_klicker-uzh&pullRequest=4694&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=uzh-bf_klicker-uzh&pullRequest=4694&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=uzh-bf_klicker-uzh&pullRequest=4694&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=uzh-bf_klicker-uzh&pullRequest=4694&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=uzh-bf_klicker-uzh&pullRequest=4694&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=uzh-bf_klicker-uzh&pullRequest=4694)


author_association: NONE
user: login: cypress[bot]
created_at: 2025-05-16T21:16:56Z
body: 
<h3>
  <a href="https://cloud.cypress.io/projects/y436dx?utm_source=github&utm_medium=PASSED&utm_campaign=project">klicker-uzh</a>&nbsp;
  <img src="https://assets.cypress.io/github-pr-comment-icons/chevron.svg" alt="" height="14" width="14" />&nbsp;
  <a href="https://cloud.cypress.io/projects/y436dx/runs/5189/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">Run #5189</a>
</h3>

<details>
  <summary>
    <strong>Run Properties:</strong>&nbsp;
    <code><img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="status check passed" height="10" width="10" />&nbsp;Passed&nbsp;<a href="https://cloud.cypress.io/projects/y436dx/runs/5189/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">#5189</a></code> &nbsp;&bull;&nbsp;
    <code><img src="https://assets.cypress.io/github-pr-comment-icons/git-commit.svg" alt="git commit" width="10" height="10" /> <a href="https://github.com/uzh-bf/klicker-uzh/commit/4294204dfd7505456237388aab46a6dfb70b3c4d">4294204dfd <span style="cursor:help;" title="Your CI provider generated this commit by merging this branch into the target branch.">ℹ️</span></a>: Merge c26361f362f33fe81022c69323514c6d6f09a3f0 into 04e407527406871de905af3ca600...</code>
  </summary><br />

  <table width="744">
    <tbody>
      <tr />
      <tr height="48">
        <td width="224">
          <strong>Project</strong>
        </td>
        <td width="520">
          <code><a href="https://cloud.cypress.io/projects/y436dx?utm_source=github&utm_medium=PASSED&utm_campaign=project">klicker-uzh</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td width="224">
          <strong>Branch Review</strong>
        </th>
        <td>
          <code><a href="https://cloud.cypress.io/projects/y436dx/branches/element-status-modification-shared/review?utm_source=github&utm_medium=PASSED&utm_campaign=review%20changes&changeRequest=4694">element-status-modification-shared</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Run status</strong></td>
        <td>
          <code><img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="status check passed" height="10" width="10" />&nbsp;Passed&nbsp;<a href="https://cloud.cypress.io/projects/y436dx/runs/5189/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">#5189</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Run duration</strong></td>
        <td><code>55m 56s</code></td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Commit</strong></td>
        <td>
          <code><img src="https://assets.cypress.io/github-pr-comment-icons/git-commit.svg" alt="git commit" width="10" height="10" /> <a href="https://github.com/uzh-bf/klicker-uzh/commit/4294204dfd7505456237388aab46a6dfb70b3c4d">4294204dfd <span style="cursor:help;" title="Your CI provider generated this commit by merging this branch into the target branch.">ℹ️</span></a>: Merge c26361f362f33fe81022c69323514c6d6f09a3f0 into 04e407527406871de905af3ca600...</code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Committer</strong></td>
        <td><code>Julius Schlapbach</code></td>
      </tr>
    </tbody>
    <tfoot>
      <tr />
      <tr height="48">
        <td colspan="2">
          <a href="https://cloud.cypress.io/projects/y436dx/runs/5189/properties?utm_source=github&utm_medium=PASSED&utm_campaign=properties">View all properties for this run ↗︎</a>
        </td>
      </tr>
    </tfoot>
  </table>
  <hr />
</details>

<table width="744">
  <thead>
    <tr />
    <tr height="48">
      <th colspan="2" align="left" width="744">Test results</th>
    </tr>
  </thead>
  <tbody>
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/failed.svg" alt="Tests that failed" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5189/overview?reviewViewBy=FAILED&utm_source=github&utm_medium=PASSED&utm_campaign=failed%20tests">
          <strong>Failures</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/flaky-v3.svg" alt="Tests that were flaky" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5189/overview?reviewViewBy=FLAKY&utm_source=github&utm_medium=PASSED&utm_campaign=flaky%20tests">
          <strong>Flaky</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/pending.svg" alt="Tests that did not run due to a developer annotating a test with .skip" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5189/test-results?utm_source=github&utm_medium=PASSED&utm_campaign=pending%20tests&statuses=%5B%7B%22value%22%3A%22PENDING%22%2C%22label%22%3A%22PENDING%22%7D%5D">
          <strong>Pending</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/skipped-v3.svg" alt="Tests that did not run due to a failure in a mocha hook" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5189/test-results?utm_source=github&utm_medium=PASSED&utm_campaign=skipped%20tests&statuses=%5B%7B%22value%22%3A%22SKIPPED%22%2C%22label%22%3A%22SKIPPED%22%7D%5D">
          <strong>Skipped</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="Tests that passed" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5189/overview?utm_source=github&utm_medium=PASSED&utm_campaign=passed%20tests">
          <strong>Passing</strong>
        </a>
      </td>
      <td>
        <code><strong>772</strong></code>
      </td>
    </tr><tfoot>
    <tr><td colspan="2"><b>⚠️ You've recorded test results over your free plan limit.<br /><a href="https://cloud.cypress.io/organizations/1a5729a2-8fed-493d-8ac1-0fcf1628e4fa/billing?utm_source=github&utm_medium=PASSED&utm_campaign=upgrade%20plan">Upgrade your plan to view test results</a>.</b></td></tr>
    <tr />
    <tr height="48"><td colspan="2"><a href="https://cloud.cypress.io/projects/y436dx/branches/element-status-modification-shared/review?utm_source=github&utm_medium=PASSED&utm_campaign=review%20changes&changeRequest=4694">View all changes introduced in this branch ↗︎</a></td></tr></tfoot>
  </tbody>
</table>






author_association: NONE
user: login: cypress[bot]
created_at: 2025-05-16T22:29:56Z
body: 
<h3>
  <a href="https://cloud.cypress.io/projects/y436dx?utm_source=github&utm_medium=PASSED&utm_campaign=project">klicker-uzh</a>&nbsp;
  <img src="https://assets.cypress.io/github-pr-comment-icons/chevron.svg" alt="" height="14" width="14" />&nbsp;
  <a href="https://cloud.cypress.io/projects/y436dx/runs/5190/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">Run #5190</a>
</h3>

<details>
  <summary>
    <strong>Run Properties:</strong>&nbsp;
    <code><img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="status check passed" height="10" width="10" />&nbsp;Passed&nbsp;<a href="https://cloud.cypress.io/projects/y436dx/runs/5190/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">#5190</a></code> &nbsp;&bull;&nbsp;
    <code><img src="https://assets.cypress.io/github-pr-comment-icons/git-commit.svg" alt="git commit" width="10" height="10" /> <a href="https://github.com/uzh-bf/klicker-uzh/commit/94d3217fd18f50802d9704def7d9a2e9b3032335">94d3217fd1</a>: enhance: separate element status from remaining element form logic to allow user...</code>
  </summary><br />

  <table width="744">
    <tbody>
      <tr />
      <tr height="48">
        <td width="224">
          <strong>Project</strong>
        </td>
        <td width="520">
          <code><a href="https://cloud.cypress.io/projects/y436dx?utm_source=github&utm_medium=PASSED&utm_campaign=project">klicker-uzh</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td width="224">
          <strong>Branch Review</strong>
        </th>
        <td>
          <code><a href="https://cloud.cypress.io/projects/y436dx/branches/v3/review?utm_source=github&utm_medium=PASSED&utm_campaign=review%20changes&changeRequest=4694">v3</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Run status</strong></td>
        <td>
          <code><img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="status check passed" height="10" width="10" />&nbsp;Passed&nbsp;<a href="https://cloud.cypress.io/projects/y436dx/runs/5190/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">#5190</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Run duration</strong></td>
        <td><code>56m 35s</code></td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Commit</strong></td>
        <td>
          <code><img src="https://assets.cypress.io/github-pr-comment-icons/git-commit.svg" alt="git commit" width="10" height="10" /> <a href="https://github.com/uzh-bf/klicker-uzh/commit/94d3217fd18f50802d9704def7d9a2e9b3032335">94d3217fd1</a>: enhance: separate element status from remaining element form logic to allow user...</code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Committer</strong></td>
        <td><code>Julius Schlapbach</code></td>
      </tr>
    </tbody>
    <tfoot>
      <tr />
      <tr height="48">
        <td colspan="2">
          <a href="https://cloud.cypress.io/projects/y436dx/runs/5190/properties?utm_source=github&utm_medium=PASSED&utm_campaign=properties">View all properties for this run ↗︎</a>
        </td>
      </tr>
    </tfoot>
  </table>
  <hr />
</details>

<table width="744">
  <thead>
    <tr />
    <tr height="48">
      <th colspan="2" align="left" width="744">Test results</th>
    </tr>
  </thead>
  <tbody>
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/failed.svg" alt="Tests that failed" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5190/overview?reviewViewBy=FAILED&utm_source=github&utm_medium=PASSED&utm_campaign=failed%20tests">
          <strong>Failures</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/flaky-v3.svg" alt="Tests that were flaky" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5190/overview?reviewViewBy=FLAKY&utm_source=github&utm_medium=PASSED&utm_campaign=flaky%20tests">
          <strong>Flaky</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/pending.svg" alt="Tests that did not run due to a developer annotating a test with .skip" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5190/test-results?utm_source=github&utm_medium=PASSED&utm_campaign=pending%20tests&statuses=%5B%7B%22value%22%3A%22PENDING%22%2C%22label%22%3A%22PENDING%22%7D%5D">
          <strong>Pending</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/skipped-v3.svg" alt="Tests that did not run due to a failure in a mocha hook" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5190/test-results?utm_source=github&utm_medium=PASSED&utm_campaign=skipped%20tests&statuses=%5B%7B%22value%22%3A%22SKIPPED%22%2C%22label%22%3A%22SKIPPED%22%7D%5D">
          <strong>Skipped</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="Tests that passed" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/y436dx/runs/5190/overview?utm_source=github&utm_medium=PASSED&utm_campaign=passed%20tests">
          <strong>Passing</strong>
        </a>
      </td>
      <td>
        <code><strong>772</strong></code>
      </td>
    </tr><tfoot>
    <tr><td colspan="2"><b>⚠️ You've recorded test results over your free plan limit.<br /><a href="https://cloud.cypress.io/organizations/1a5729a2-8fed-493d-8ac1-0fcf1628e4fa/billing?utm_source=github&utm_medium=PASSED&utm_campaign=upgrade%20plan">Upgrade your plan to view test results</a>.</b></td></tr>
    <tr />
    <tr height="48"><td colspan="2"><a href="https://cloud.cypress.io/projects/y436dx/branches/v3/review?utm_source=github&utm_medium=PASSED&utm_campaign=review%20changes&changeRequest=4694">View all changes introduced in this branch ↗︎</a></td></tr></tfoot>
  </tbody>
</table>






author_association: NONE