{"version":3,"file":"js/506-9bd732011e89df216e8e.js","mappings":"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","sources":["webpack://app/./app/javascript/actions/app.js","webpack://app/./app/javascript/actions/dashboard.js","webpack://app/./app/javascript/actions/decryption.js","webpack://app/./app/javascript/api.ts","webpack://app/./app/javascript/api/appointment_key_store.js","webpack://app/./app/javascript/api/decryption.js","webpack://app/./app/javascript/api/user.js","webpack://app/./app/javascript/axios.ts","webpack://app/./app/javascript/components/common/CommonForm.jsx","webpack://app/./app/javascript/components/common/FormikErrorList.jsx","webpack://app/./app/javascript/components/common/LabeledRow.jsx","webpack://app/./app/javascript/components/common/TrueApiResponseLayer.tsx","webpack://app/./app/javascript/constants.js","webpack://app/./app/javascript/eventStatus.js","webpack://app/./app/javascript/i18n.js","webpack://app/./app/javascript/shared.js","webpack://app/./app/javascript/reducers/dashboard.js","webpack://app/./app/javascript/reducers/app.js","webpack://app/./app/javascript/reducers/index.js","webpack://app/./app/javascript/store/store.js"],"sourcesContent":["import { ModalID } from \"../constants\";\n\nexport const UPDATE_CURRENT_EVENT = \"UPDATE_CURRENT_EVENT\";\nexport const UPDATE_CURRENT_EVENT_SERIES = \"UPDATE_CURRENT_EVENT_SERIES\";\nexport const CLEAR_CURRENT_EVENT_SERIES = \"CLEAR_CURRENT_EVENT_SERIES\";\nexport const SHOW_MODAL = \"SHOW_MODAL\";\nexport const HIDE_EVENT_MODAL = \"HIDE_EVENT_MODAL\";\nexport const HIDE_CONFIRMATION_MODAL = \"HIDE_CONFIRMATION_MODAL\";\nexport const UPDATE_SELECTED_USER = \"UPDATE_SELECTED_USER\";\nexport const UPDATE_TTKS = \"UPDATE_TTKS\";\nexport const UPDATE_NEW_MEMBERS = \"UPDATE_NEW_MEMBERS\";\nexport const CONFIRMED_MEMBER = \"CONFIRMED_MEMBER\";\nexport const DECLINED_MEMBER = \"DECLINED_MEMBER\";\nexport const UPDATE_AUTH = \"UPDATE_AUTH\";\nexport const UPDATE_AUTH_CODE = \"UPDATE_AUTH_CODE\";\nexport const UPDATE_PASSWORD = \"UPDATE_PASSWORD\";\n\n/**\n * Replace currentEvent in appState\n * @param {object} currentEvent\n */\nexport function updateCurrentEvent(currentEvent) {\n return { type: UPDATE_CURRENT_EVENT, currentEvent };\n}\n/**\n * Replace currentEventSeries in appState\n * @param {object} currentEvent\n */\nexport function updateCurrentEventSeries(series) {\n return { type: UPDATE_CURRENT_EVENT_SERIES, series };\n}\n/**\n * Clears currentEventSeries in appState\n */\nexport function clearCurrentEventSeries() {\n return { type: CLEAR_CURRENT_EVENT_SERIES };\n}\n/**\n * Show or hides modal with given ID\n * @param {String} modalId\n */\nexport function updateShowModal(modalId) {\n return { type: SHOW_MODAL, modalId };\n}\n/**\n * Hides the EventModal, if visible\n */\nexport function hideEventModal() {\n return { type: HIDE_EVENT_MODAL };\n}\n\nexport function hideConfirmationModal() {\n return { type: SHOW_MODAL, modalId: ModalID.CONFIRMATION };\n}\n\n/**\n * Sends SHOW_MODAL action with modal parameter\n * Stored in store.appState.modalDetails.confirmationModal\n * @param {component} modal\n */\nexport function showConfirmationModal(modal) {\n const lsd = {\n type: SHOW_MODAL,\n modal,\n modalId: ModalID.CONFIRMATION,\n };\n return lsd;\n}\n\nexport function updateSelectedUser(selectedUser) {\n return { type: UPDATE_SELECTED_USER, selectedUser };\n}\n\nexport function updateTtks(ttks) {\n return { type: UPDATE_TTKS, ttks };\n}\n\nexport function updateNewMembers(members) {\n return { type: UPDATE_NEW_MEMBERS, members };\n}\nexport function confirmedMember(id) {\n return { type: CONFIRMED_MEMBER, id };\n}\nexport function declinedMember(id) {\n return { type: DECLINED_MEMBER, id };\n}\n\nexport function updateAuthCode(authCode) {\n return { type: UPDATE_AUTH_CODE, authCode };\n}\n\nexport const updatePassword = (password) => {\n return { type: UPDATE_PASSWORD, password };\n};\n\nexport const updateAuth = (authCode, password) => {\n return { type: UPDATE_AUTH, authCode, password };\n};\n","export const UPDATE_CURRENT_USER = 'UPDATE_CURRENT_USER'\nexport const UPDATE_CALENDARS = \"UPDATE_CALENDARS\";\nexport const UPDATE_CALENDAR_DETAILS = \"UPDATE_CALENDAR_DETAILS\";\nexport const REMOTE_EVENT_STATUS_CHANGE = \"REMOTE_EVENT_STATUS_CHANGE\";\n\nexport const updateCurrentUser = user => {\n return { type: UPDATE_CURRENT_USER, payload: user }\n}\n\nexport const updateCalendars = calendars => {\n return { type: UPDATE_CALENDARS, calendars }\n}\n\n/**\n * Update title of calendar with given id in store.\n * @param {number} id\n * @param {string} title\n * @returns redux action\n */\nexport const updateCalendarDetails = (id, details) => {\n return { type: UPDATE_CALENDAR_DETAILS, id, details }\n}\n\n/**\n * Forwards event status update from websocket into redux store\n * @param {object} event\n * @returns action\n */\nexport const remoteEventStatusChange = event => {\n return { type: REMOTE_EVENT_STATUS_CHANGE, event }\n}\n","export const UPDATE_PASSWORD = \"UPDATE_PASSWORD\";\nexport const PASSWORD_RESET = \"PASSWORD_RESET\";\nexport const PASSWORD_RESET_SUCCESSFUL = \"PASSWORD_RESET_SUCCESSFUL\";\nexport const PASSWORD_RESET_FAILED = \"PASSWORD_RESET_FAILED\";\n\nimport forge from \"node-forge\";\nimport { getPasswordResetData } from \"../api/decryption\";\n\nimport { createAppointmentKeyStore } from \"../api/appointment_key_store\";\nimport { getDecryptedPrivateKey } from \"../shared\";\n\n/**\n *\n * @param {object} encryptedPrivKey\n * @param {string} authcode\n * @returns privateKey or false when fail\n */\nexport const simpleDecryptPrivateKey = (encryptedPrivKey, authcode) => {\n const password = getPwFromLocalStorage(authcode);\n const pki = forge.pki;\n try {\n const privateKey = pki.decryptRsaPrivateKey(\n encryptedPrivKey,\n password + authcode\n );\n return privateKey;\n } catch (e) {\n return false;\n }\n};\n\nexport const slimPasswordReset = (authcode, encryptedPrivKey, userId) => {\n return new Promise((resolve, reject) => {\n getPasswordResetData(userId)\n .then((res) => {\n const decryptedPrivateKey = simpleDecryptPrivateKey(\n encryptedPrivKey,\n authcode\n );\n\n const data = res.data;\n const forged = forge;\n const pki = forged.pki;\n const publicKey = pki.publicKeyFromPem(data.new_public_key);\n const promises = [];\n\n data.key_stores_for_re_create.forEach((keyStoreData) => {\n const pro = passwordResetCreateNewKeyStore(\n keyStoreData,\n decryptedPrivateKey,\n publicKey,\n forged,\n userId\n );\n promises.push(pro);\n });\n\n Promise.all(promises).then(resolve).catch(reject);\n })\n .catch(reject);\n });\n};\n\nexport const passwordResetCreateNewKeyStore = (\n keyStoreData,\n decryptedPrivateKey,\n publicKey,\n forged,\n userId\n) => {\n const symKey = decryptedPrivateKey.decrypt(\n forged.util.decode64(keyStoreData.encrypted_sym_key)\n );\n const encryptedSymKey = forged.util.encode64(publicKey.encrypt(symKey));\n const keyStoreParams = {\n encrypted_sym_key: encryptedSymKey,\n user_id: userId,\n content: keyStoreData.content,\n appointment_id: keyStoreData.appointment_id,\n };\n return createAppointmentKeyStore(keyStoreParams);\n};\n\n/**\n * Decrypt the response for /api/v1/appointments/:id or /api/v1/events/:id/appointment\n * and return the decrpyted content object.\n * @param {object} appointment\n */\nexport const getAppointmentContent = (appointment, userId) => {\n const { attributes } = appointment;\n const myKeyStore = attributes.appointment_key_stores.find(\n (ks) => ks.user_id == userId\n );\n if (!myKeyStore) return console.error(\"No keystore found for this user\");\n\n const myPrivateKey = getDecryptedPrivateKey();\n const decryptedSymKey = myPrivateKey.decrypt(\n forge.util.decode64(myKeyStore.encrypted_sym_key)\n );\n return decipherContent(attributes.iv, myKeyStore.content, decryptedSymKey);\n};\n\nexport const decryptContent = (data, privateKey) => {\n const appointmentKeyStore = data.appointment_key_store;\n const decryptedSymKey = decryptSymKey(data, privateKey);\n return decipherContent(\n data.appointment_iv,\n appointmentKeyStore.content,\n decryptedSymKey\n );\n};\n\nexport const decipherContent = (iv, content, symKey) => {\n const decipher = forge.cipher.createDecipher(\"AES-CBC\", symKey);\n decipher.start({\n iv: forge.util.decode64(iv),\n });\n decipher.update(forge.util.createBuffer(forge.util.decode64(content)));\n decipher.finish();\n return JSON.parse(decipher.output.data);\n};\n\nexport const getPwFromLocalStorage = (authCode) => {\n if (!authCode) return false;\n const obj = JSON.parse(window.localStorage.getItem(\"obj\"));\n const salt = forge.util.decode64(obj.salt);\n const iv = forge.util.decode64(obj.iv);\n const key = forge.pkcs5.pbkdf2(authCode, salt, 4, 16);\n const decipher = forge.cipher.createDecipher(\"AES-CBC\", key);\n decipher.start({ iv });\n const cipherText = forge.util.decode64(obj.cipher_text);\n decipher.update(forge.util.createBuffer(cipherText));\n var result = decipher.finish(); // check 'result' for true/false\n if (result) return decipher.output.data;\n return false;\n};\n\nexport const decryptSymKey = (data, privateKey) => {\n const appointmentKeyStore = JSON.parse(data.appointment_key_store);\n const symKey = appointmentKeyStore.encrypted_sym_key;\n return privateKey.decrypt(forge.util.decode64(symKey));\n};\n\nexport const password_reset = () => {\n return { type: PASSWORD_RESET };\n};\n\nexport const password_reset_successfull = () => {\n return { type: PASSWORD_RESET_SUCCESSFUL };\n};\n\nexport const password_reset_failed = () => {\n return { type: PASSWORD_RESET_FAILED };\n};\n","const API_BASE = \"/api/v1\";\n\nexport function sendRequest(endpoint: string, method: string, data?: any) {\n const reqParams: RequestInit = { method }\n if (data) {\n const params = new URLSearchParams()\n\n Object.entries(data).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach((value) => params.append(`${key}[]`, value.toString()))\n } else if(value) {\n params.append(key, value.toString())\n } else {\n params.append(key, '')\n }\n });\n\n reqParams.body = params;\n }\n\n return new Promise((resolve, reject) => {\n fetchAuth(API_BASE + endpoint, reqParams).then(req => {\n if(endpoint.endsWith(\".html\")) {\n resolve(req);\n } else {\n jsonResponse(req).then(resolve).catch(reject);\n }\n }).catch(reject)\n })\n}\n\nexport function post(endpoint: string, data?: any) {\n return sendRequest(endpoint, \"POST\", data);\n}\n\nexport function get(endpoint: string, data?: any) {\n var url = new URL( window.location.protocol + \"//\" + window.location.host + API_BASE + endpoint);\n for (let k in data) { url.searchParams.append(k, data[k]); }\n return new Promise((resolve, reject) => {\n fetchAuth(url).then((res) => {\n jsonResponse(res).then(resolve).catch(reject);\n }).catch(reject)\n })\n}\n\nexport function deleter(endpoint: string, data?: any) {\n return sendRequest(endpoint, \"DELETE\", data);\n}\n\nexport function put(endpoint: string, data?: any) {\n return sendRequest(endpoint, \"PUT\", data);\n}\n\nexport function patch(endpoint: string, data?: any) {\n return sendRequest(endpoint, \"PATCH\", data);\n}\n\nfunction jsonResponse(request: any) {\n return new Promise((resolve, reject) => {\n request.json().then((json: any) => {\n resolve({ data: json, request });\n }).catch(reject)\n })\n}\n\nexport function fetchAuth(url: URL|string, reqParams?: RequestInit) {\n const token = localStorage.getItem(\"token\");\n if(token) {\n const authHeader = new Headers();\n authHeader.append('Authorization', `Bearer ${token}`);\n if(!reqParams) {\n reqParams = { headers: authHeader };\n } else {\n reqParams.headers = authHeader;\n }\n }\n return new Promise((resolve, reject) => {\n fetch(url, reqParams).then((response) => {\n if(response.status.toString().startsWith('4') || response.status.toString().startsWith('4')) {\n reject(response);\n } else {\n resolve(response)\n }\n }).catch(reject)\n })\n}","import ax from \"../axios\";\n\nexport const createAppointmentKeyStore = (params) => {\n return ax.post(\"/appointment_key_stores\", { params });\n};\n","import ax from \"../axios\";\n\nexport const getPasswordResetData = async (userId) => {\n const response = await ax.get(`/decryption/${userId}/password_reset`);\n return response;\n};\n\nexport const getPasswordChangeData = async (userId) => {\n const response = await ax.get(`/decryption/${userId}/change_password`);\n return response;\n};\n","import forge from \"node-forge\";\nimport {\n confirmedMember,\n declinedMember,\n updateNewMembers\n} from \"../actions/app\";\nimport { updateCurrentUser } from \"../actions/dashboard\";\nimport {\n passwordResetCreateNewKeyStore\n} from \"../actions/decryption\";\nimport ax from \"../axios\";\nimport { UserRole } from \"../constants\";\nimport { getCookie, getDecryptedPrivateKey, storableUser } from \"../shared\";\nimport { store } from \"../store/store\";\nimport { getPasswordChangeData } from \"./decryption\";\n\nexport const logIn = (params) => {\n store.dispatch(updateCurrentUser());\n return new Promise((resolve, reject) => {\n ax.post(`/auth/login`, params)\n .then((res) => {\n localStorage.setItem(\"token\", res.data.jwt);\n const { user } = res.data;\n resolve({ ...user.data.attributes, id: user.data.id });\n })\n .catch(reject);\n });\n};\n\n/**\n * Removes locally stored tokens and redirects to base href\n */\nexport const logOut = (redirectTarget = \"/\") => {\n emptyStorage()\n window.location.href = redirectTarget;\n};\n\nexport const emptyStorage = () => {\n localStorage.removeItem(\"token\");\n localStorage.removeItem(\"obj\");\n}\n\n/**\n * Returns a promise which resolves when we get user details from the backend\n * Rejects when the user is logged out\n * @returns Promise\n */\nexport const checkForUserInSession = async () => {\n store.dispatch(updateCurrentUser());\n\n if(!getCookie(\"inSession\")) {\n localStorage.removeItem(\"token\");\n return Promise.reject()\n }\n\n return new Promise((resolve, reject) => {\n currentUserSession()\n .then((res) => {\n const details = storableUser(res)\n store.dispatch(updateCurrentUser(details));\n resolve(res);\n })\n .catch(reject);\n });\n};\n\n/**\n * Deletes a User\n * @param {number} id\n * @returns\n */\nexport const deleteUser = (id, reason) => {\n return ax.delete(`/users/${id}?reason=${reason}`);\n};\n\nexport const updatePasswordResetStatus = async (userId, status) => {\n return await ax.post(`/users/${userId}/update_password`, { status });\n};\n\nexport const denyPasswordReset = async (userId) => {\n return await ax.post(`/users/${userId}/deny_password_reset`);\n};\n\nexport const initializePasswordReset = async (email) => {\n return await ax.post(`/users/reset_password`, { email });\n};\n\nexport const getUserData = async (email) => {\n const response = await ax.get(`/user/?email=${email}`);\n return response;\n};\n\nexport const getUser = async (id) => {\n const response = await ax.get(`/users/${id}`)\n return response;\n};\n\nexport const getUserFiles = async (id) => {\n const response = await ax.get(`/users/${id}/files`)\n return response\n}\n\nexport const getUserUploadLink = async (id) => {\n return await ax.get(`/users/${id}/files/upload_url`)\n}\nexport const getDownloadLink = async (id, nodeId) => {\n return await ax.get(`/users/${id}/files/download/${nodeId}`)\n}\nexport const deleteFile = async (id, nodeId) => {\n return await ax.delete(`/users/${id}/files/${nodeId}`)\n}\n\nexport const getAppliedCalendars = (id) => {\n return ax.get(`/users/${id}/applied_calendars`);\n};\n\nexport const currentUserSession = async () => {\n const token = localStorage.getItem(\"token\");\n if (token) {\n return ax.get(\"/auth/auto_login\");\n } else return Promise.reject();\n};\n\nexport const updateRight = async (id, right) => {\n return await ax.post(`/users/${id}/rights`, { right });\n};\n\n/**\n * Retrieve a list of available TTKs\n */\nexport function getTtks() {\n return ax.get(`/users/ttks`);\n}\n\nexport const getRequested = () => {\n return ax.get(\"/requested\").then((res) => {\n store.dispatch(updateNewMembers(res.data.data));\n });\n};\n\nexport const confirmNewMember = (id) => {\n return ax.post(`/users/${id}/confirm_registration`).then((res) => {\n if (res.request.status === 200) {\n store.dispatch(confirmedMember(id));\n }\n });\n};\n\nexport const declineNewMember = (id) => {\n return updateUser({ status: \"declined\" }, id).then((res) => {\n store.dispatch(declinedMember(id));\n });\n};\n\nexport const signUp = (userParams) => {\n return ax.post(`/users`, userParams);\n};\n\nexport const updateUser = (userParams, userId) => {\n return ax.patch(`/users/${userId}`, userParams);\n};\n\nexport const invite = (userParams) => {\n return ax.post(`/users`, { ...userParams, user_role: UserRole.TTK });\n};\n\nexport const changedPassword = (userId) => {\n return new Promise((resolve, reject) => {\n getPasswordChangeData(userId)\n .then(({ data }) => {\n const decryptedPrivateKey = getDecryptedPrivateKey();\n const forged = forge;\n const pki = forged.pki;\n const publicKey = pki.publicKeyFromPem(data.new_public_key);\n\n let promises = [];\n data.key_stores_for_re_create.forEach((keyStoreData) => {\n let pro = passwordResetCreateNewKeyStore(\n keyStoreData,\n decryptedPrivateKey,\n publicKey,\n forged,\n userId\n );\n promises.push(pro);\n });\n Promise.all(promises).then(resolve).catch(reject);\n })\n .catch(reject);\n });\n};\n","import * as api from './api'\n\nexport const ax = {\n get: api.get,\n post: api.post,\n put: api.put,\n patch: api.patch,\n delete: api.deleter\n}\n\nexport default ax;\n","import PropTypes from \"prop-types\";\nimport { useFormik } from \"formik\";\nimport React, { useState, createElement, useEffect } from \"react\";\nimport { Button, FormGroup, Row } from \"react-bootstrap\";\nimport { useTranslation } from \"react-i18next\";\nimport { FormikErrorList } from \"./FormikErrorList\";\nimport { NotificationLayer } from \"./NotificationLayer\";\nimport CommonSpinner from \"@lmu-med/ci-components/dist/components/CommonSpinner\";\nimport { LabeledRow } from \"./LabeledRow\";\nimport { TrueApiResponseLayer } from \"./TrueApiResponseLayer\";\n\nconst DEFAULT_INITIAL_VALUES = { first_name: \"\", last_name: \"\", email: \"\" };\n\n/**\n * Reusable Component that pipes data from \"fieldsComponent\" prop to\n * defined \"apiEndpoint\" prop and shows API response.\n * Error handling is taken care of.\n * @param {validationSchema} | Yup validation schema object\n * @param {apiEndpoint} | Function to invoke when form is sent. Needs to return a promise. Formik values are passed to this\n * @param {fieldsComponent} | Component containing the form fields\n * @param {translationScope} | Translation key containing field names, i.e. event\n * @param {initialValues} | initial values for the form\n * @returns form\n */\nexport const CommonForm = ({\n validationSchema,\n apiEndpoint,\n fieldsComponent,\n translationScope,\n initialValues,\n resultOnly,\n children,\n encType,\n}) => {\n const [t] = useTranslation();\n const [sending, setSending] = useState(false);\n const [apiResponse, setApiResponse] = useState(null);\n\n const formik = useFormik({\n initialValues: initialValues || DEFAULT_INITIAL_VALUES,\n validationSchema,\n enableReinitialize: true,\n onSubmit: (values) => {\n setSending(true);\n setApiResponse(null);\n apiEndpoint(values).then(onApiResult).catch(onApiResult);\n },\n });\n\n const onApiResult = (response) => {\n setSending(false);\n\n let request;\n if (!response.hasOwnProperty(\"request\")) {\n console.warn(\"Response does not have request, exiting\");\n request = response;\n } else {\n request = response.request;\n }\n\n if (request.status == 200) {\n console.log(\"respoinsesennse\");\n setApiResponse({\n status: 200,\n message: t(`${translationScope}.success_text`),\n });\n } else {\n const answer = {\n status: request.status,\n message: t(`${translationScope}.error_${request.status}`),\n };\n setApiResponse(answer);\n }\n };\n\n const getHeading = () => {\n const header1 = t(`${translationScope}.header`);\n return header1 ?

{header1}

: null;\n };\n\n if (resultOnly && apiResponse && apiResponse.status === 200) {\n return (\n
\n {getHeading()}\n
\n

{t(translationScope + \".success_text\")}

\n
\n
\n );\n }\n\n const fields = createElement(fieldsComponent, { formik: formik });\n return (\n \n {getHeading()}\n
\n

{t(translationScope + \".introduction_text\")}

\n
\n\n \n \n {fields}\n {children}\n\n {Object.keys(formik.errors).length > 0 && (\n \n \n \n )}\n\n {apiResponse && (\n \n )}\n\n {sending ? (\n \n ) : (\n 0}\n >\n {t(translationScope + \".submit\")}\n \n )}\n \n \n
\n );\n};\nCommonForm.defaultProps = {\n resultOnly: true,\n};\n\nCommonForm.propTypes = {\n apiEndpoint: PropTypes.func.isRequired,\n fieldsComponent: PropTypes.func.isRequired,\n initialValues: PropTypes.object,\n translationScope: PropTypes.string,\n validationSchema: PropTypes.object,\n resultOnly: PropTypes.bool,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nexport const FormikErrorList = ({ errors }) => {\n const errorEntry = (item, index) => {\n const [key, value] = item;\n return
  • {value}
  • ;\n };\n\n const entries = Object.entries(errors);\n\n if (!entries.length) return null;\n\n return ;\n};\n\nFormikErrorList.defaultProps = {\n errors: {},\n};\nFormikErrorList.propTypes = {\n errors: PropTypes.object,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport Col from \"react-bootstrap/Col\";\nimport Row from \"react-bootstrap/Row\";\nexport const LabeledRow = ({\n children,\n label,\n required,\n htmlFor,\n className = \"\",\n}) => {\n return (\n \n \n \n \n {children}\n \n );\n};\n\nLabeledRow.defaultProps = {\n required: false,\n};\n\nLabeledRow.propTypes = {\n children: PropTypes.any,\n htmlFor: PropTypes.string,\n label: PropTypes.string,\n required: PropTypes.bool,\n className: PropTypes.string,\n};\n","import React from 'react'\nimport { Alert } from \"react-bootstrap\";\nimport { SimpleApiResponse } from \"../../types\";\n\nexport const TrueApiResponseLayer = ({ status, message }: SimpleApiResponse) => {\n let variant = \"danger\"\n switch (status) {\n case 200:\n case 204:\n variant = \"success\"\n break;\n case 301:\n case 302:\n case 409:\n variant = \"warning\"\n break;\n case 400:\n case 404:\n case 500:\n variant = \"danger\"\n break;\n }\n\n return (\n \n {message}\n \n )\n}\n","export const WEBSOCKET_URL = window.location.host + \"/ws\";\nexport const DEFAULT_EVENT_BLOCKED_SECONDS = 60 * 5; // 5 minutes\nexport const UNBLOCK_WARNING_BEFORE_SECONDS = 60; // 5 minutes\nimport * as Yup from \"yup\";\n\nexport const ModalID = {\n PATIENT_DATA: \"patientDataModal\",\n EVENT: \"eventModal\",\n CONFIRMATION: \"confirmationModal\",\n ACCEPT_PASSWORD_RESET: \"acceptPasswordResetModal\",\n DENY_PASSWORD_RESET: \"denyPasswordResetModal\",\n};\n\nexport const MemberMapDefaults = {\n DEFAULT_ZOOM_LEVEL: 13,\n MUNICH_CENTER_LAT_LNG: {\n lat: 48.137252,\n lng: 11.575521,\n },\n};\n\nexport const PasswordResetStatus = {\n SET_ON_DREAMIN_FORT: \"set_on_dreamin_fort\",\n INACTIVE: \"inactive\",\n INITIALIZED: \"initialized\",\n};\n\nexport const AppointmentStatus = {\n ACCEPTED: \"accepted\",\n CANCELED: \"canceled\",\n};\n\nexport const UserRole = {\n WAA: \"waa\",\n HTK: \"htk\",\n TTK: \"ttk\",\n NAA: \"naa\",\n};\n\nexport const DEFAULT_EVENT_LENGTH_SECONDS = 3600;\n\nexport const ACCESS_RIGHTS = {\n calendar: \"calendar\",\n confirm_users: \"confirm_users\",\n invite_ttks: \"invite_ttks\",\n user_overview: \"user_overview\",\n file_transfer: \"file_transfer\",\n};\n\nexport const calendarValidationSchema = (requiredMessage) => {\n Yup.object().shape({ title: Yup.string().required(requiredMessage) });\n};\n","export const EventStatus = {\n CREATED: \"created\",\n BLOCKED: \"blocked\",\n REQUESTED: \"requested\",\n ACCEPTED: \"accepted\",\n CANCELED: \"canceled\",\n DRAFT: \"draft\",\n};\n\nexport const colorByStatus = {\n [EventStatus.ACCEPTED]: \"green\",\n [EventStatus.BLOCKED]: \"grey\",\n [EventStatus.REQUESTED]: \"yellow\",\n [EventStatus.CREATED]: \"blue\",\n [EventStatus.CANCELED]: \"red\",\n canceled_but_in_kas: \"light-red\",\n accepted_not_in_kas: \"light-green\",\n};\n\nexport const iconByStatus = {\n [EventStatus.ACCEPTED]: \"check\",\n [EventStatus.BLOCKED]: \"lock\",\n [EventStatus.REQUESTED]: \"clock\",\n [EventStatus.CREATED]: \"plus\",\n [EventStatus.CANCELED]: \"times\",\n canceled_but_in_kas: \"times\",\n accepted_not_in_kas: \"check\",\n};\n\nexport const titleByStatus = {\n [EventStatus.CREATED]: \"Termin ${title}\",\n [EventStatus.ACCEPTED]: \"Angenommen – ${title}\",\n [EventStatus.CANCELED]: \"Storniert – ${title}\",\n [EventStatus.BLOCKED]: \"Blockiert – ${title}\",\n [EventStatus.REQUESTED]: \"Terminanfrage für ${title}\",\n};\n\nexport const statusBackgroundColor = (status) => {\n const color = colorByStatus[status] || \"blue\";\n return `bg-${color}`;\n};\n\nexport const applyBackgroundColor = (eventInfo) => {\n const {status} = eventInfo?.event?.extendedProps;\n return statusBackgroundColor(status);\n};","import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\ni18n.use(initReactI18next).init({\n returnObjects: true,\n lng: \"de\",\n debug: window.location.host.includes(\"localhost\"),\n interpolation: {\n escapeValue: false, // not needed for react as it escapes by default\n },\n resources: {\n de: {\n translation: {\n ...window.ITREF.config.locales.de,\n },\n },\n },\n});\n\nexport default i18n;\n","import { getI18n } from \"react-i18next\";\nimport { updateCurrentEvent, updateShowModal } from \"./actions/app\";\nimport { simpleDecryptPrivateKey } from \"./actions/decryption\";\nimport { ACCESS_RIGHTS, ModalID, UserRole } from \"./constants\";\nimport { EventStatus } from \"./eventStatus\";\nimport { store } from \"./store/store\";\nimport forge from \"node-forge\";\nimport * as Yup from \"yup\";\n\n/**\n * function for defaulting to an empty string if the object of an attribute is undefined\n * @param {string} attribute\n * @param {object} obj\n * @returns empty string or passed in attribute of the obj\n */\nexport const attributeOrFallback = (obj, attribute) => {\n return obj ? obj[attribute] : \"\";\n};\n\n/**\n * function for checking if an Object is empty thus as no key values pairs\n * @param {object} obj\n */\nexport const isEmptyObject = (obj) => {\n return !Object.keys(obj).length;\n};\n\n/**\n * Updates appState with new event and shows event modal\n * @param {object} event\n */\nexport const openEventModal = (event) => {\n store.dispatch(updateCurrentEvent(event));\n store.dispatch(updateShowModal(ModalID.EVENT));\n};\n\n/**\n * @param {string} geocode | comma-seperated latitude and longitude\n * @returns Object with lat and lng for geo_coding\n */\nexport const latlngforMap = (geo_code) => {\n const geo_coords = geo_code.split(\",\");\n const lat = parseFloat(geo_coords[0]);\n const lng = parseFloat(geo_coords[1]);\n return { lat: lat, lng: lng };\n};\n\nexport const hasEncryption = (status) => {\n return status !== EventStatus.CREATED && status !== EventStatus.BLOCKED;\n};\n\n/**\n * Returns the localized short day name from index, i.e. 0 = Mon\n * @param {number} index\n */\nexport const getDayByIndex = (index) => {\n return getI18n().t(\"dates.abbr_day_names\")[index];\n};\n\n/**\n * Extract start and end date from start_hour, start_minute and duration properties\n * @param {object} values\n * @returns array with startTimeDate and endTimeDate date objects\n */\nexport const getEventSeriesDates = (values) => {\n if (\n !values ||\n empty(values.start_hour) ||\n empty(values.start_minute) ||\n !values.duration\n ) {\n return [];\n }\n const startTimeDate = new Date();\n startTimeDate.setHours(\n parseInt(values.start_hour),\n parseInt(values.start_minute),\n 0,\n 0\n );\n\n const endTimeDate = new Date(startTimeDate);\n endTimeDate.setMinutes(endTimeDate.getMinutes() + parseInt(values.duration));\n return [startTimeDate, endTimeDate];\n};\n\nconst empty = (value) => {\n return typeof value === \"undefined\" || value === null || value === \"\";\n};\n\n/**\n * Return formatted name string\n * @param {object} | ansb_user\n * @returns string with last name and first name, i.e. Smith, John\n */\nexport const getDisplayName = ({ email, first_name, last_name }) => {\n return `${email}(${last_name}, ${first_name})`;\n};\n\n/**\n * Returns true if either HTK or current user has this right\n * @param {string} neededRight\n */\nexport const hasRight = (neededRight) => {\n const { currentUser } = store.getState().dashboard;\n if (!currentUser) return false;\n if (!currentUser.user_role) {\n return false;\n }\n\n return (\n currentUser.user_role === UserRole.HTK ||\n currentUser.rights?.includes(neededRight)\n );\n};\n\n/**\n * Return the decrypted private key for this user\n * Requires authCode and currentUser in redux store, password in localStorage\n * @returns result of decryptRsaPrivateKey from forge\n */\nexport const getDecryptedPrivateKey = () => {\n const { authCode } = store.getState().appState;\n const { currentUser } = store.getState().dashboard;\n\n return simpleDecryptPrivateKey(currentUser.private_key, authCode);\n};\n\nexport const verifyCredentials = (user, pw, auth) => {\n return new Promise((resolve, reject) => {\n try {\n const password = pw + auth;\n const pki = forge.pki;\n const decryptedPrivateKey = pki.decryptRsaPrivateKey(\n user.private_key,\n password\n );\n\n if (decryptedPrivateKey != \"\" && decryptedPrivateKey != null) {\n resolve();\n } else {\n reject({ message: \"could not decrypt private key\", status: 500 });\n }\n } catch (e) {\n console.log('verifyCredentials failed');\n reject({ message: \"Cannot decrypt credentials\", status: 500 });\n }\n });\n};\n\n/**\n * calculate duration between 2 dates in full hours\n * @param {date} start\n * @param {date} end\n * @returns number\n */\nexport function durationInMs(start, end) {\n return (\n end.getTime() - start.getTime()\n );\n}\n\n/**\n * checks max allowed duration in Hour between two dates\n * @param {date} start\n * @param {date} end\n * @param {number} durationHour\n * @returns boolean\n */\nexport function checkMaxDurationInHour(start, end, durationHour) {\n return (\n durationInMs(start, end) < durationHour*60*60*1000\n );\n}\n\n/**\n * set a cookie\n * @param {string} name\n * @param {string} value\n * @param {number} days\n */\nexport function setCookie(name, value, days) {\n var expires = \"\";\n if (days) {\n var date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n expires = \"; expires=\" + date.toUTCString();\n }\n document.cookie = name + \"=\" + (value || \"\") + expires + \"; path=/\";\n}\n\n/**\n * get a cookie value\n * @param {string} name\n * @returns value or null\n */\nexport function getCookie(name) {\n var nameEQ = name + \"=\";\n var ca = document.cookie.split(\";\");\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i];\n while (c.charAt(0) == \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n}\n\n/**\n * Retrieve title of calendar by its ID\n * @param {number} calId\n * @returns Calendar Name or ID\n */\nexport function getCalendarName (calId) {\n const { calendars } = store.getState().dashboard\n if (!calendars) return calId;\n if(calId === 'none') return getI18n().t(\"event.series.no_calendar\")\n const cal = calendars.find((c) => c.id === calId);\n return cal?.attributes?.title || calId;\n};\n\n\nvar yesterday = new Date();\nyesterday.setDate(yesterday.getDate() - 1);\n\n/**\n * Sorts and array of events by their calendar id\n * @param {array} events\n */\nexport function sortByCalendars(events) {\n let newList = {};\n events.forEach((entry) => {\n const { calendar_id, end } = entry.attributes\n // ditch old events\n var endDate = new Date(end)\n if(endDate.getTime() < yesterday.getTime()) return\n if (!newList[calendar_id]) newList[calendar_id] = [];\n newList[calendar_id].push({id: entry.id, ...entry.attributes});\n });\n return newList\n}\n\n/**\n * Merges ID with attributes from response\n * @param {axios promise} response\n */\nexport function storableUser(response) {\n const userDetails = {\n ...response.data.data.attributes,\n id: response.data.data.id,\n };\n return userDetails;\n}\n\n/**\n *\n * @param {string} url\n * @returns url without https or http\n */\nexport function slimURL(url) {\n return url.replace(/(^\\w+:|^)\\/\\//, '');\n}\n\n/**\n * Return a file size in bytes in their appropriate unit.\n * @param {number} bytes\n * @param {number} decimals\n * @returns formatted display of file size\n */\nexport const formatBytes = (bytes, decimals = 2) => {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n\nconst pwreg = /^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\\d]){1,})(?=(.*[\\W]){1,})(?!.*\\s).{8,}$/;\n\nexport const passwordValidationSchema = (t) => Yup.object().shape({\n default_password: Yup.string().required(\n t(\"validation.field_required\", { field: t(\"passwords.default_password\") })\n ),\n password: Yup.string().required(\n t(\"validation.field_required\", { field: t(\"passwords.password\") })\n ).min(8, t(\"passwords.password\") + t(\"passwords.password_length\")).matches(pwreg, t(\"passwords.password\") + t(\"passwords.password_requirements\")),\n password_confirmation: Yup.string().required(\n t(\"validation.field_required\", {\n field: t(\"passwords.password_confirmation\"),\n })\n ).oneOf([Yup.ref(\"password\"), null], t(\"passwords.must_match\")),\n authcode: Yup.string().required(\n t(\"validation.field_required\", { field: t(\"passwords.authcode\") })\n ).min(8, t(\"passwords.authcode\") + t(\"passwords.password_length\")).matches(pwreg, t(\"passwords.authcode\") + t(\"passwords.password_requirements\")),\n authcode_confirmation: Yup.string().required(\n t(\"validation.field_required\", {\n field: t(\"passwords.authcode_confirmation\"),\n })\n ).oneOf([Yup.ref(\"authcode\"), null], t(\"passwords.authcodes_must_match\")),\n});\n\n/**\n * Can this user edit files?\n * @returns boolean\n */\nexport const canEditFiles = () => {\n return window.ITREF.config.enable_file_transfer && hasRight(ACCESS_RIGHTS.file_transfer)\n}\n\n/**\n * Give user details\n * @param {object} details\n * @returns string\n */\nexport const extractUsername = (details) => {\n if(!details || !details.attributes) return ''\n const { first_name, last_name, email } = details.attributes\n let username = `${first_name} ${last_name} (${email})\\n`\n return username\n}\n\n/**\n * Give user details\n * @param {object} details\n * @returns string\n */\nexport const extractUserInfo = (details) => {\n if(!details || !details.attributes) return ''\n const { location, first_name, last_name, email } = details.attributes\n let userinfo = `${email}\\n`\n const loco = ['clinic_name', 'city']\n for (let index = 0; index < loco.length; index++) {\n if(location[loco[index]]) {\n userinfo += location[loco[index]] + \"\\n\"\n }\n }\n return userinfo\n}\n\n/**\n *\n * @param {number} id\n * @returns special field object with title and id\n */\nexport const getSpecialField = (id) => {\n return window.ITREF.special_fields.find((sp) => sp.id.toString() === id.toString())\n}\n","import {\n REMOTE_EVENT_STATUS_CHANGE,\n UPDATE_CALENDARS,\n UPDATE_CALENDAR_DETAILS,\n UPDATE_CURRENT_USER,\n} from \"../actions/dashboard\";\n\nconst INITIAL_STATE = {\n loading: false,\n requestedCalendars: [],\n calendars: [],\n declinedEvents: [],\n currentUser: null,\n};\n\nexport const dashboardReducer = (state = INITIAL_STATE, action = {}) => {\n switch (action.type) {\n case UPDATE_CURRENT_USER:\n return {\n ...state,\n currentUser: action.payload,\n };\n case UPDATE_CALENDARS:\n return {\n ...state,\n calendars: action.calendars,\n };\n case UPDATE_CALENDAR_DETAILS:\n const newState = {\n ...state,\n };\n for (let index = 0; index < newState.calendars.length; index++) {\n const cal = newState.calendars[index];\n if (cal.id === action.id) {\n cal.attributes.title = action.details.title;\n cal.attributes.description = action.details.description;\n break;\n }\n }\n return newState;\n default:\n return state;\n }\n};\n","import { combineReducers } from \"redux\";\nimport {\n UPDATE_CURRENT_EVENT,\n HIDE_EVENT_MODAL,\n SHOW_MODAL,\n UPDATE_SELECTED_USER,\n UPDATE_TTKS,\n UPDATE_NEW_MEMBERS,\n CONFIRMED_MEMBER,\n DECLINED_MEMBER,\n UPDATE_CURRENT_EVENT_SERIES,\n CLEAR_CURRENT_EVENT_SERIES,\n UPDATE_AUTH_CODE,\n UPDATE_PASSWORD,\n UPDATE_AUTH,\n} from \"../actions/app\";\nimport { REMOTE_EVENT_STATUS_CHANGE } from \"../actions/dashboard\";\nimport { ModalID } from \"../constants\";\nimport { EventStatus } from \"../eventStatus\";\n\nexport function currentEvent(state = null, action) {\n switch (action.type) {\n case UPDATE_CURRENT_EVENT:\n if (action.currentEvent) {\n const { start, end } = action.currentEvent;\n if (typeof start === \"string\")\n action.currentEvent.start = new Date(start);\n if (typeof end === \"string\") action.currentEvent.end = new Date(end);\n }\n return action.currentEvent;\n case REMOTE_EVENT_STATUS_CHANGE:\n if (\n state?.id == action.event.id &&\n action.event.status !== EventStatus.BLOCKED\n ) {\n // TODO: store who's the blocking user of an event so we can\n // still show the input form in EventModal\n // https://apm.lmu-klinikum.de/issues/435\n return { ...state, status: action.event.status };\n }\n break;\n }\n return state;\n}\n\nexport function currentEventSeries(state = null, action) {\n switch (action.type) {\n case UPDATE_CURRENT_EVENT_SERIES:\n if (action.series) {\n action.series.runtime_start = new Date(action.series.runtime_start);\n action.series.runtime_end = new Date(action.series.runtime_end);\n return action.series;\n }\n return null;\n case CLEAR_CURRENT_EVENT_SERIES:\n return null;\n }\n return state;\n}\n\nfunction showModal(state = [], action) {\n switch (action.type) {\n case HIDE_EVENT_MODAL:\n if (state.includes(ModalID.EVENT)) {\n let newState = [...state];\n newState.pop(ModalID.EVENT);\n return newState;\n }\n break;\n case SHOW_MODAL:\n const { modalId } = action;\n let newState = [...state];\n if (state.includes(modalId)) {\n newState.pop(modalId);\n } else {\n newState.push(modalId);\n }\n return newState;\n }\n return state;\n}\n\nfunction modalDetails(state = {}, action) {\n switch (action.type) {\n case SHOW_MODAL:\n let newState = { ...state };\n if (state[action.modalId]) {\n delete newState[action.modalId];\n } else {\n newState[action.modalId] = action.modal;\n }\n return newState;\n }\n return state;\n}\n\nexport function selectedUser(state = {}, action) {\n switch (action.type) {\n case UPDATE_SELECTED_USER:\n return action.selectedUser;\n }\n return state;\n}\n\nexport function ttks(state = [], action) {\n switch (action.type) {\n case UPDATE_TTKS:\n return action.ttks;\n }\n return state;\n}\n\nexport function newMembers(state = [], action) {\n switch (action.type) {\n case UPDATE_NEW_MEMBERS:\n return action.members;\n case CONFIRMED_MEMBER:\n case DECLINED_MEMBER:\n return state.filter((member) => member.id !== action.id);\n }\n return state;\n}\n\nexport function remoteEventUpdates(state = [], action) {\n switch (action.type) {\n case REMOTE_EVENT_STATUS_CHANGE:\n let newState = [...state];\n newState.push(action.event);\n if (newState.length > 10) newState.pop();\n return newState;\n }\n return state;\n}\n\nexport function authCode(state = \"\", action) {\n if (action.type === UPDATE_AUTH_CODE || action.type === UPDATE_AUTH) {\n return action.authCode;\n }\n return state;\n}\n\nexport function password(state = \"\", action) {\n if (action.type === UPDATE_PASSWORD || action.type === UPDATE_AUTH)\n return action.password;\n return state;\n}\n\nexport const appStateReducer = combineReducers({\n currentEvent,\n currentEventSeries,\n showModal,\n modalDetails,\n selectedUser,\n ttks,\n newMembers,\n remoteEventUpdates,\n authCode,\n password,\n});\n","import { dashboardReducer } from \"./dashboard\";\nimport { appStateReducer } from \"./app\";\nimport { combineReducers } from \"redux\";\n\nexport const appReducer = combineReducers({\n dashboard: dashboardReducer,\n appState: appStateReducer,\n});\n","import { createStore, applyMiddleware } from \"redux\";\nimport { composeWithDevTools } from \"redux-devtools-extension\";\nimport { appReducer } from \"../reducers\";\nconst thunkMiddleware = require(\"redux-thunk\").default;\n\nexport const store = createStore(\n appReducer,\n {},\n composeWithDevTools(applyMiddleware(thunkMiddleware))\n);\n"],"names":["UPDATE_CURRENT_EVENT","UPDATE_CURRENT_EVENT_SERIES","CLEAR_CURRENT_EVENT_SERIES","SHOW_MODAL","HIDE_EVENT_MODAL","UPDATE_SELECTED_USER","UPDATE_TTKS","UPDATE_NEW_MEMBERS","CONFIRMED_MEMBER","DECLINED_MEMBER","UPDATE_AUTH","UPDATE_AUTH_CODE","UPDATE_PASSWORD","updateCurrentEvent","currentEvent","type","updateCurrentEventSeries","series","clearCurrentEventSeries","updateShowModal","modalId","hideEventModal","hideConfirmationModal","ModalID","showConfirmationModal","modal","updateSelectedUser","selectedUser","updateTtks","ttks","updateNewMembers","members","confirmedMember","id","declinedMember","updateAuthCode","authCode","updateAuth","password","UPDATE_CURRENT_USER","UPDATE_CALENDARS","UPDATE_CALENDAR_DETAILS","REMOTE_EVENT_STATUS_CHANGE","updateCurrentUser","user","payload","updateCalendars","calendars","updateCalendarDetails","details","remoteEventStatusChange","event","simpleDecryptPrivateKey","encryptedPrivKey","authcode","getPwFromLocalStorage","pki","forge","decryptRsaPrivateKey","e","slimPasswordReset","userId","Promise","resolve","reject","getPasswordResetData","then","res","decryptedPrivateKey","data","forged","publicKey","publicKeyFromPem","new_public_key","promises","key_stores_for_re_create","forEach","keyStoreData","pro","passwordResetCreateNewKeyStore","push","all","catch","symKey","decrypt","util","decode64","encrypted_sym_key","keyStoreParams","encode64","encrypt","user_id","content","appointment_id","createAppointmentKeyStore","getAppointmentContent","appointment","attributes","myKeyStore","appointment_key_stores","find","ks","console","error","decryptedSymKey","getDecryptedPrivateKey","decipherContent","iv","decipher","start","update","finish","JSON","parse","output","obj","window","localStorage","getItem","salt","key","cipherText","cipher_text","API_BASE","sendRequest","endpoint","method","reqParams","params","URLSearchParams","Object","entries","value","Array","isArray","append","toString","body","fetchAuth","req","endsWith","jsonResponse","post","get","url","URL","location","protocol","host","k","searchParams","deleter","put","patch","request","json","token","authHeader","Headers","headers","fetch","response","status","startsWith","ax","async","getPasswordChangeData","logIn","store","setItem","jwt","logOut","redirectTarget","emptyStorage","href","removeItem","checkForUserInSession","getCookie","currentUserSession","storableUser","deleteUser","reason","denyPasswordReset","initializePasswordReset","email","getUserData","getUser","getUserUploadLink","getDownloadLink","nodeId","deleteFile","updateRight","right","getTtks","getRequested","confirmNewMember","declineNewMember","updateUser","signUp","userParams","invite","user_role","UserRole","changedPassword","api","delete","DEFAULT_INITIAL_VALUES","first_name","last_name","CommonForm","validationSchema","apiEndpoint","fieldsComponent","translationScope","initialValues","resultOnly","children","encType","t","useTranslation","sending","setSending","useState","apiResponse","setApiResponse","formik","useFormik","enableReinitialize","onSubmit","values","onApiResult","hasOwnProperty","warn","log","message","answer","getHeading","header1","fields","createElement","className","handleSubmit","keys","errors","length","variant","disabled","defaultProps","propTypes","PropTypes","FormikErrorList","map","item","index","LabeledRow","label","required","htmlFor","sm","title","TrueApiResponseLayer","transition","WEBSOCKET_URL","DEFAULT_EVENT_BLOCKED_SECONDS","UNBLOCK_WARNING_BEFORE_SECONDS","PATIENT_DATA","EVENT","CONFIRMATION","ACCEPT_PASSWORD_RESET","DENY_PASSWORD_RESET","MemberMapDefaults","DEFAULT_ZOOM_LEVEL","MUNICH_CENTER_LAT_LNG","lat","lng","PasswordResetStatus","SET_ON_DREAMIN_FORT","INACTIVE","INITIALIZED","AppointmentStatus","ACCEPTED","CANCELED","WAA","HTK","TTK","NAA","DEFAULT_EVENT_LENGTH_SECONDS","ACCESS_RIGHTS","calendar","confirm_users","invite_ttks","user_overview","file_transfer","calendarValidationSchema","requiredMessage","Yup","shape","EventStatus","CREATED","BLOCKED","REQUESTED","DRAFT","colorByStatus","canceled_but_in_kas","accepted_not_in_kas","iconByStatus","titleByStatus","statusBackgroundColor","i18n","initReactI18next","init","returnObjects","debug","includes","interpolation","escapeValue","resources","de","translation","ITREF","config","locales","attributeOrFallback","attribute","isEmptyObject","openEventModal","latlngforMap","geo_code","geo_coords","split","parseFloat","getDayByIndex","getI18n","getEventSeriesDates","empty","start_hour","start_minute","duration","startTimeDate","Date","setHours","parseInt","endTimeDate","setMinutes","getMinutes","getDisplayName","hasRight","neededRight","currentUser","dashboard","rights","appState","private_key","verifyCredentials","pw","auth","setCookie","name","days","expires","date","setTime","getTime","toUTCString","document","cookie","nameEQ","ca","i","c","charAt","substring","indexOf","getCalendarName","calId","cal","yesterday","sortByCalendars","events","newList","entry","calendar_id","end","slimURL","replace","setDate","getDate","formatBytes","bytes","decimals","dm","sizes","Math","floor","pow","toFixed","pwreg","passwordValidationSchema","default_password","field","min","matches","password_confirmation","oneOf","authcode_confirmation","canEditFiles","enable_file_transfer","extractUsername","getSpecialField","special_fields","sp","INITIAL_STATE","loading","requestedCalendars","declinedEvents","appStateReducer","combineReducers","state","action","currentEventSeries","runtime_start","runtime_end","showModal","newState","pop","modalDetails","newMembers","filter","member","remoteEventUpdates","appReducer","description","thunkMiddleware","require","createStore","composeWithDevTools","applyMiddleware"],"sourceRoot":""}