{"version":3,"file":"js/application-0ec927433dd7eb5de9b4.js","mappings":"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","sources":["webpack:///./app/javascript/actions/chat.js","webpack:///./app/javascript/components/chat/shared/Muted.tsx","webpack:///./app/javascript/components/chat/ChatList/Row.js","webpack:///./app/javascript/components/chat/ChatList/index.js","webpack:///./app/javascript/selectors/chat/apiRequests.js","webpack:///./app/javascript/components/chat/shared/GroupedItems.js","webpack:///./app/javascript/components/chat/ChatNew/Tile.js","webpack:///./app/javascript/components/chat/ChatNew/index.js","webpack:///./app/javascript/components/chat/ChatRoom/QuickChatSelect.js","webpack:///./app/javascript/components/chat/ChatRoom/ChatRoomSettingsButton.js","webpack:///./app/javascript/components/chat/shared/ScrollContainer.js","webpack:///./app/javascript/components/chat/ChatRoom/ChatMessage/MessageAuthor.js","webpack:///./app/javascript/components/chat/ChatRoom/ChatMessage/MessageSettings.tsx","webpack:///./app/javascript/components/chat/utils/emojis.js","webpack:///./app/javascript/components/chat/utils/markdown.js","webpack:///./app/javascript/components/chat/ChatRoom/ChatMessage/MessageText.js","webpack:///./app/javascript/components/chat/ChatRoom/ChatMessage/QuotedMessage.js","webpack:///./app/javascript/components/chat/ChatRoom/ChatMessage/MessageDeliveryStatus.js","webpack:///./app/javascript/components/chat/ChatRoom/ChatMessage/index.js","webpack:///./app/javascript/components/chat/ChatRoom/DaySeparator.js","webpack:///./app/javascript/components/chat/ChatRoom/Chat.js","webpack:///./app/javascript/components/chat/ChatRoom/MessageComposer/MessageToQuote.js","webpack:///./app/javascript/components/chat/ChatRoom/MessageComposer/index.tsx","webpack:///./app/javascript/selectors/chat/composer.js","webpack:///./app/javascript/hooks/usePersistentSate.ts","webpack:///./app/javascript/components/chat/ChatRoom/index.js","webpack:///./app/javascript/components/chat/shared/BackButton.js","webpack:///./app/javascript/components/chat/shared/ChatHeader.tsx","webpack:///./app/javascript/components/chat/shared/OnlineStatus.js","webpack:///./app/javascript/components/chat/shared/ChatImage.js","webpack:///./app/javascript/components/chat/shared/Composing.tsx","webpack:///./app/javascript/components/chat/shared/Notification.js","webpack:///./app/javascript/components/layout/GroupNavigation.tsx","webpack:///./app/javascript/components/shared/Loading.tsx","webpack:///./app/javascript/components/shared/MemberSelect.tsx","webpack:///./app/javascript/components/shared/Pagination.tsx","webpack:///./app/javascript/components/shared/Spectrum.tsx","webpack:///./app/javascript/components/shared/TabBar.tsx","webpack:///./app/javascript/components/shared/fields/TextField.tsx","webpack:///./app/javascript/helpers/components/wrapProvider.js","webpack:///./app/javascript/helpers/legacy/backbone/createAdaptBackboneView.js","webpack:///./app/javascript/helpers/legacy/backbone/connectBackbone.js","webpack:///./app/javascript/helpers/legacy/adaptBackboneView.js","webpack:///./app/javascript/helpers/queryClient.tsx","webpack:///./app/javascript/helpers/tixxt-router/compilation.tsx","webpack:///./app/javascript/helpers/tixxt-router.tsx","webpack:///./app/javascript/helpers/tixxt-router/history-events.tsx","webpack:///./app/javascript/helpers/useQueryParams.ts","webpack:///./app/javascript/hooks/useMaxHeight.ts","webpack:///./app/javascript/layout/togglebar.ts","webpack:///./app/javascript/controllers/application.js","webpack:///./app/javascript/controllers/accordion_scroll_controller.js","webpack:///./app/javascript/controllers/administration/activitystream/close_activity_reply_month_controller.js","webpack:///./app/javascript/components/shared/Flash.tsx","webpack:///./app/javascript/components/administration/appointments/categories/CategoryRow.tsx","webpack:///./app/javascript/components/shared/InfoText.tsx","webpack:///./app/javascript/components/administration/appointments/categories/CategoriesEditor.tsx","webpack:///./app/javascript/controllers/administration/edit_categories_controller.js","webpack:///./app/javascript/controllers/administration/groups/join_request_message_controller.jsx","webpack:///./app/javascript/controllers/administration/invites/send_batch_actions_controller.js","webpack:///./app/javascript/controllers/administration/invites/sent_controller.js","webpack:///./app/javascript/controllers/administration/invites/toggle_batch_actions_controller.js","webpack:///./app/javascript/controllers/administration/newsletter/drag_and_drop_controller.js","webpack:///./app/javascript/controllers/administration/newsletter/interval_controller.js","webpack:///./app/javascript/controllers/administration/newsletter/unlayer_form_controller.js","webpack:///./app/javascript/controllers/administration/role_assignments_controller.js","webpack:///./app/javascript/controllers/administration/teams/fallback_upn_assignments_controller.js","webpack:///./app/javascript/controllers/clipboard_controller.js","webpack:///./app/javascript/controllers/external_activitystreams_controller.js","webpack:///./app/javascript/controllers/invites/handle_external_invite_controller.js","webpack:///./app/javascript/controllers/ministry_controller.js","webpack:///./app/javascript/controllers/shared/go_back_button_controller.js","webpack:///./app/javascript/components/administration/propertySets/properties/selection/finalizeSelectionOptions.js","webpack:///./app/javascript/components/administration/propertySets/TabbableFields.tsx","webpack:///./app/javascript/components/administration/propertySets/properties/selection/SelectionOptionsFields.tsx","webpack:///./app/javascript/components/administration/propertySets/properties/PropertyForm.tsx","webpack:///./app/javascript/components/administration/propertySets/BasicPropertySetForm.tsx","webpack:///./app/javascript/components/administration/propertySets/modifications/AddOptions.tsx","webpack:///./app/javascript/components/administration/propertySets/modifications/ModificationForm.tsx","webpack:///./app/javascript/components/administration/propertySets/ModifiedPropertySetForm.tsx","webpack:///./app/javascript/components/administration/propertySets/Editor.tsx","webpack:///./app/javascript/components/administration/PropertySetEdit.tsx","webpack:///./app/javascript/components/administration/PropertySetEditWrapper.js","webpack:///./app/javascript/controllers/shared/property_set_edit_controller.jsx","webpack:///./app/javascript/controllers/shared/select_all_controller.js","webpack:///./app/javascript/controllers/shared/tabbar_controller.js","webpack:///./app/javascript/controllers/shared/toggle_controller.js","webpack:///./app/javascript/components/authentication/api.js","webpack:///./app/javascript/components/authentication/RouteContext.js","webpack:///./app/javascript/components/authentication/FactorActions.js","webpack:///./app/javascript/components/authentication/FactorsPage.js","webpack:///./app/javascript/components/authentication/AddTotpPage.js","webpack:///./app/javascript/components/authentication/DeleteFactorPage.js","webpack:///./app/javascript/components/authentication/ResetBackupCodesPage.js","webpack:///./app/javascript/components/authentication/AddEmailPage.js","webpack:///./app/javascript/components/authentication/FactorsWrapper.js","webpack:///./app/javascript/controllers/two_factor_authentications_controller.jsx","webpack:///./app/javascript/controllers/index.js","webpack:///./app/javascript/layout/bootstrap/index.js","webpack:///./app/javascript/layout/fontawesome.ts","webpack:///./app/javascript/components/appointments/ParticipantsList.js","webpack:///./app/javascript/selectors/invites.js","webpack:///./app/javascript/components/shared/UnreadBadge.tsx","webpack:///./app/javascript/components/appointments/AppointmentInvite.js","webpack:///./app/javascript/components/appointments/RecurringAppointmentInvite.js","webpack:///./app/javascript/components/appointments/AppointmentParticipation.js","webpack:///./app/javascript/components/invites/InvitesList.js","webpack:///./app/javascript/api/unreads.ts","webpack:///./app/javascript/components/appointments/Invites.js","webpack:///./app/javascript/components/appointments/api.ts","webpack:///./app/javascript/components/appointments/Contact.js","webpack:///./app/javascript/components/activitystreams/composer/index.module.css?dec3","webpack:///./app/javascript/components/activitystreams/composer/inlineTagPlugin.tsx","webpack:///./app/javascript/components/activitystreams/composer/withPlugins.tsx","webpack:///./app/javascript/hooks/useInterceptorPrompt.ts","webpack:///./app/javascript/components/activitystreams/composer/index.js","webpack:///./app/javascript/components/activitystreams/composer/TixxtComposerAdapter.tsx","webpack:///./app/javascript/components/activitystreams/replyComposer/ReplyComposer.module.css?7fa1","webpack:///./app/javascript/components/activitystreams/replyComposer/Attachments.tsx","webpack:///./app/javascript/components/activitystreams/replyComposer/api.js","webpack:///./app/javascript/components/shared/hooks/useFileProcessing.ts","webpack:///./app/javascript/components/activitystreams/replyComposer/index.tsx","webpack:///./app/javascript/components/shared/propertySets/EmbeddedValueSetForm.tsx","webpack:///./app/javascript/components/files/FolderForm.js","webpack:///./app/javascript/components/files/FolderSelectModal.tsx","webpack:///./app/javascript/components/files/FolderSelectionField.js","webpack:///./app/javascript/components/files/files.module.css","webpack:///./app/javascript/components/files/EditFileForm.js","webpack:///./app/javascript/components/shared/propertySets/ValueSetTable.tsx","webpack:///./app/javascript/components/files/BatchActions.js","webpack:///./app/javascript/components/globalSearch/urls.js","webpack:///./app/javascript/components/files/UrlContextProvider.js","webpack:///./app/javascript/components/shared/GenericErrorBoundary.tsx","webpack:///./app/javascript/helpers/pickImage.js","webpack:///./app/javascript/components/globalSearch/globalSearch.module.css?b83e","webpack:///./app/javascript/components/activitystreams/types/Note.tsx","webpack:///./app/javascript/components/activitystreams/types/Survey.tsx","webpack:///./app/javascript/components/activitystreams/types/Appointment.tsx","webpack:///./app/javascript/components/activitystreams/activitystreams.module.css?cd01","webpack:///./app/javascript/components/activitystreams/attachments/ImageAttachments.tsx","webpack:///./app/javascript/components/activitystreams/attachments/FileAttachments.tsx","webpack:///./app/javascript/components/activitystreams/attachments/LinkAttachment.tsx","webpack:///./app/javascript/components/activitystreams/attachments/TagAttachments.tsx","webpack:///./app/javascript/components/activitystreams/attachments/MentionAttachments.tsx","webpack:///./app/javascript/components/activitystreams/ActivityAttachments.tsx","webpack:///./app/javascript/components/globalSearch/hits/ActivityHit.js","webpack:///./app/javascript/components/activitystreams/types/Question.tsx","webpack:///./app/javascript/components/globalSearch/hits/MessageHit.js","webpack:///./app/javascript/components/appointments/DateRange.js","webpack:///./app/javascript/components/appointments/CalendarList.js","webpack:///./app/javascript/components/globalSearch/hits/AppointmentHit.js","webpack:///./app/javascript/components/globalSearch/hits/RecurringAppointmentHit.js","webpack:///./app/javascript/components/globalSearch/hits/ModifiedRecurringAppointmentHit.js","webpack:///./app/javascript/components/globalSearch/hits/Highlights.js","webpack:///./app/javascript/components/globalSearch/SearchQueryPaginationContext.ts","webpack:///./app/javascript/components/globalSearch/hits/FileHits.js","webpack:///./app/javascript/components/globalSearch/hits/FolderHits.js","webpack:///./app/javascript/components/globalSearch/hits/MembershipHit.js","webpack:///./app/javascript/components/globalSearch/hits/GroupHit.js","webpack:///./app/javascript/components/globalSearch/hits/PageHit.js","webpack:///./app/javascript/components/globalSearch/hits/ItemHit.tsx","webpack:///./app/javascript/components/globalSearch/api.ts","webpack:///./app/javascript/components/globalSearch/SearchResultPagination.tsx","webpack:///./app/javascript/components/globalSearch/SearchSortSelector.tsx","webpack:///./app/javascript/components/globalSearch/SearchQueryResult.tsx","webpack:///./app/javascript/components/globalSearch/FilterModule.tsx","webpack:///./app/javascript/components/globalSearch/SearchResults.js","webpack:///./app/javascript/components/globalSearch/EmbeddedSearchResults.js","webpack:///./app/javascript/components/files/search/mergeFileAndFolderProfiles.js","webpack:///./app/javascript/components/files/search/index.js","webpack:///./app/javascript/components/files/FolderActions.tsx","webpack:///./app/javascript/components/shared/FullSizeContent.tsx","webpack:///./app/javascript/hooks/useFullWidthLayout.ts","webpack:///./app/javascript/components/files/FolderListing.js","webpack:///./app/javascript/components/files/FileProfileRows.js","webpack:///./app/javascript/components/files/documents/documents.module.css?6c7b","webpack:///./app/javascript/components/files/documents/DocumentAction.js","webpack:///./app/javascript/components/files/documents/DocumentActions.js","webpack:///./app/javascript/components/files/documents/WopiActions.js","webpack:///./app/javascript/components/files/documents/OnlyOfficeActions.js","webpack:///./app/javascript/components/files/adaptedFileComponents.js","webpack:///./app/javascript/components/shared/styles/select.module.css?c5ac","webpack:///./app/javascript/components/shared/MeetinRoomSelect.js","webpack:///./app/javascript/components/shared/DropDown.tsx","webpack:///./app/javascript/components/shared/TimeAgo.tsx","webpack:///./app/javascript/components/shared/SimpleExporter.tsx","webpack:///./app/javascript/components/shared/RecurringAppointmentDecisionModal.tsx","webpack:///./app/javascript/components/shared/adaptedSharedComponents.js","webpack:///./app/javascript/components/shared/TranslationControls.tsx","webpack:///./app/javascript/components/appCreatorTemporary/LayoutToggle.js","webpack:///./app/javascript/components/appCreatorTemporary/LayoutSelect.js","webpack:///./app/javascript/components/appCreatorTemporary/DragSourceProperty.js","webpack:///./app/javascript/components/appCreatorTemporary/DropTargetColumn.js","webpack:///./app/javascript/components/appCreatorTemporary/ColumnConfigurator.js","webpack:///./app/javascript/components/appCreatorTemporary/TabConfigurator.js","webpack:///./app/javascript/components/appCreatorTemporary/ItemLayoutEditor.js","webpack:///./app/javascript/components/appCreatorTemporary/IntegrationsEditor/PropertiesReference.js","webpack:///./app/javascript/components/appCreatorTemporary/IntegrationsEditor/ActivityIntegration.js","webpack:///./app/javascript/components/appCreatorTemporary/IntegrationsEditor/SingleEmailIntegration.js","webpack:///./app/javascript/components/appCreatorTemporary/IntegrationsEditor/EmailIntegration.js","webpack:///./app/javascript/components/appCreatorTemporary/IntegrationsEditor/index.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/details/AssignedMember.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/details/AssignedMembers.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/details/Tags.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/details/Info.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/details/FileCounter.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/details/Title.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/details/ArchiveInfo.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/Card.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/Column.js","webpack:///./app/javascript/components/layout/portals.tsx","webpack:///./app/javascript/components/appCreatorTemporary/wallView/HeaderButtons.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/AppStage.js","webpack:///./app/javascript/components/appCreatorTemporary/wallView/UnassignedItems.js","webpack:///./app/javascript/components/appCreatorTemporary/ItemsWallView.js","webpack:///./app/javascript/components/appCreatorTemporary/adaptedAppCreatorComponents.js","webpack:///./app/javascript/helpers/selectors/networkSelectors.js","webpack:///./app/javascript/helpers/selectors/widgetbarSelectors.js","webpack:///./app/javascript/components/administration/widgetbar/fields/MultiselectField.module.css?0018","webpack:///./app/javascript/components/administration/widgetbar/fields/MultiselectField.tsx","webpack:///./app/javascript/components/administration/widgetbar/fields/NumberField.tsx","webpack:///./app/javascript/components/administration/widgetbar/fields/RadioField.tsx","webpack:///./app/javascript/components/administration/widgetbar/fields/SelectField.tsx","webpack:///./app/javascript/components/administration/widgetbar/fields/TextareaField.tsx","webpack:///./app/javascript/components/administration/widgetbar/fields/TextField.tsx","webpack:///./app/javascript/helpers/widgets/widgets.js","webpack:///./app/javascript/components/administration/widgetbar/fields/AdditionalCalendarField.tsx","webpack:///./app/javascript/components/administration/widgetbar/Widget.tsx","webpack:///./app/javascript/components/administration/widgetbar/WidgetTypes.tsx","webpack:///./app/javascript/components/administration/widgetbar/WidgetbarLayout.js","webpack:///./app/javascript/components/administration/widgetbar/WidgetProperties.tsx","webpack:///./app/javascript/components/administration/widgetbar/WidgetPropertiesLayout.tsx","webpack:///./app/javascript/components/shared/errors/NotFound.tsx","webpack:///./app/javascript/components/administration/widgetbar/WidgetbarForm.js","webpack:///./app/javascript/components/administration/WidgetbarEdit.tsx","webpack:///./app/javascript/components/administration/widgetbar/WidgetbarSelection.tsx","webpack:///./app/javascript/components/administration/WidgetbarIndex.tsx","webpack:///./app/javascript/components/administration/legalTexts/api.js","webpack:///./app/javascript/components/administration/legalTexts/LegalTextIndex.tsx","webpack:///./app/javascript/components/administration/imprints/api.js","webpack:///./app/javascript/components/shared/markdownEditor/MarkdownEditorAdapter.tsx","webpack:///./app/javascript/components/administration/imprints/ImprintEdit.tsx","webpack:///./app/javascript/components/administration/MembershipRolesManager.tsx","webpack:///./app/javascript/components/administration/adaptedAdministrationComponents.js","webpack:///./app/javascript/components/appointments/calendarSheet/AppointmentLine.js","webpack:///./app/javascript/components/appointments/calendarSheet/CalendarSheetCell.js","webpack:///./app/javascript/components/shared/hooks/useHover.js","webpack:///./app/javascript/components/appointments/CalendarSheet.js","webpack:///./app/javascript/components/rundschreiben/ExternalIdComponent.tsx","webpack:///./app/javascript/components/administration/designManager/themeToCss.ts","webpack:///./app/javascript/components/shared/GroupCategorySections.tsx","webpack:///./app/javascript/hooks/userbar.ts","webpack:///./app/javascript/components/layout/Userbar.tsx","webpack:///./app/javascript/components/layout/ModuleSwitcher.tsx","webpack:///./app/javascript/components/layout/TixxtModuleSwitcher.tsx","webpack:///./app/javascript/components/info/Userbar.tsx","webpack:///./app/javascript/components/shared/hooks/useOpenJoinRequests.ts","webpack:///./app/javascript/components/activitystreams/Userbar.tsx","webpack:///./app/javascript/components/messages/Userbar.tsx","webpack:///./app/javascript/components/appointments/Userbar.tsx","webpack:///./app/javascript/components/tasks/Userbar.tsx","webpack:///./app/javascript/components/files/Userbar.tsx","webpack:///./app/javascript/components/administration/Userbar.tsx","webpack:///./app/javascript/components/administration/api.ts","webpack:///./app/javascript/components/globalSearch/Userbar.tsx","webpack:///./app/javascript/components/memberships/Userbar.tsx","webpack:///./app/javascript/api/memberships.ts","webpack:///./app/javascript/components/directory/Userbar.tsx","webpack:///./app/javascript/components/pages/Userbar.tsx","webpack:///./app/javascript/components/appCreator/Userbar.tsx","webpack:///./app/javascript/components/layout/TixxtUserbar.tsx","webpack:///./app/javascript/components/layout/TixxtChatbar.tsx","webpack:///./app/javascript/components/layout/TixxtGroupNavigation.tsx","webpack:///./app/javascript/components/layout/TixxtPageTitle.tsx","webpack:///./app/javascript/hooks/useRecurringAppointment.ts","webpack:///./app/javascript/components/appointments/AppointmentPageTitle.tsx","webpack:///./app/javascript/components/tixxt/BackboneFeature.tsx","webpack:///./app/javascript/components/activitystreams/routes.tsx","webpack:///./app/javascript/components/appointments/AppointmentToolbar.tsx","webpack:///./app/javascript/components/appointments/helpers.ts","webpack:///./app/javascript/components/appointments/appointmentsList/AllDayTag.tsx","webpack:///./app/javascript/components/appointments/appointmentsList/AppointmentItem.tsx","webpack:///./app/javascript/components/appointments/appointmentsList/CalendarDay.tsx","webpack:///./app/javascript/components/appointments/appointmentsList/CalendarWeek.tsx","webpack:///./app/javascript/components/appointments/appointmentsList/index.tsx","webpack:///./app/javascript/components/appointments/useAppointmentView.ts","webpack:///./app/javascript/components/appointments/AppointmentPage.tsx","webpack:///./app/javascript/components/appointments/calendars/helpers.tsx","webpack:///./app/javascript/components/appointments/calendars/CalendarListItem.tsx","webpack:///./app/javascript/components/appointments/calendars/CalendarList.tsx","webpack:///./app/javascript/components/appointments/calendars/CalendarListView.tsx","webpack:///./app/javascript/components/appointments/calendars/ManageCalendarsPage.tsx","webpack:///./app/javascript/components/appointments/calendars/api.ts","webpack:///./app/javascript/components/appointments/calendars/CalendarSubscribeModal.tsx","webpack:///./app/javascript/components/appointments/calendars/SubscribeCalendarsPage.tsx","webpack:///./app/javascript/components/appointments/participants/AppointmentPreview.js","webpack:///./app/javascript/components/appointments/participants/NewParticipantForm.tsx","webpack:///./app/javascript/components/appointments/participants/api.ts","webpack:///./app/javascript/components/appointments/participants/StatusButton.tsx","webpack:///./app/javascript/components/appointments/participants/ParticipantRow.tsx","webpack:///./app/javascript/components/appointments/participants/ParticipantsOverview.tsx","webpack:///./app/javascript/components/appointments/participants/ParticipantsView.tsx","webpack:///./app/javascript/components/appointments/calendars/CalendarForm.tsx","webpack:///./app/javascript/components/appointments/calendars/NewCalendarPage.tsx","webpack:///./app/javascript/components/appointments/calendars/EditCalendarPage.tsx","webpack:///./app/javascript/components/appointments/routes.tsx","webpack:///./app/javascript/components/messages/MessageRow.tsx","webpack:///./app/javascript/components/messages/InteractionsButton.tsx","webpack:///./app/javascript/components/messages/api.tsx","webpack:///./app/javascript/components/messages/MessagesInteractions.tsx","webpack:///./app/javascript/components/messages/MessagesList.tsx","webpack:///./app/javascript/components/messages/InboxPage.tsx","webpack:///./app/javascript/components/messages/SentPage.tsx","webpack:///./app/javascript/components/shared/BackButton.tsx","webpack:///./app/javascript/components/shared/fields/CheckboxField.tsx","webpack:///./app/javascript/components/shared/MembershipAndGroupField.tsx","webpack:///./app/javascript/components/messages/composer/MessageForm.tsx","webpack:///./app/javascript/components/messages/composer/index.tsx","webpack:///./app/javascript/components/messages/NewMessagePage.tsx","webpack:///./app/javascript/components/messages/message/MessageInteractions.tsx","webpack:///./app/javascript/components/messages/message/MessageContainer.tsx","webpack:///./app/javascript/components/messages/message/index.tsx","webpack:///./app/javascript/components/messages/ShowMessagePage.tsx","webpack:///./app/javascript/components/messages/routes.tsx","webpack:///./app/javascript/components/files/NewFilesPage.js","webpack:///./app/javascript/components/files/approval/api.js","webpack:///./app/javascript/components/files/approval/VersionApproval.js","webpack:///./app/javascript/components/files/approval/ReviewStatus.js","webpack:///./app/javascript/components/files/approval/ApprovalPage.tsx","webpack:///./app/javascript/components/files/routes.tsx","webpack:///./app/javascript/components/tasks/routes.tsx","webpack:///./app/javascript/components/globalSearch/Content.js","webpack:///./app/javascript/components/globalSearch/routes.tsx","webpack:///./app/javascript/components/administration/networkSettings/api.js","webpack:///./app/javascript/components/administration/networkSettings/BasicSettings.tsx","webpack:///./app/javascript/components/shared/fields/GroupSelectField.tsx","webpack:///./app/javascript/components/administration/networkSettings/JoinSettings.tsx","webpack:///./app/javascript/components/administration/networkSettings/MemberSettings.tsx","webpack:///./app/javascript/components/administration/networkSettings/MailSettings.tsx","webpack:///./app/javascript/components/administration/networkSettings/NetworkSettingsForm.tsx","webpack:///./app/javascript/components/administration/networkSettings/index.tsx","webpack:///./app/javascript/components/administration/navigationManager/LinkForm.tsx","webpack:///./app/javascript/components/administration/navigationManager/SelectContent.tsx","webpack:///./app/javascript/components/administration/navigationManager/MainFields.tsx","webpack:///./app/javascript/components/administration/navigationManager/Checkboxes.tsx","webpack:///./app/javascript/components/administration/navigationManager/NavigationManagerForm.tsx","webpack:///./app/javascript/components/administration/navigationManager/ItemButton.tsx","webpack:///./app/javascript/components/administration/NavigationManager.tsx","webpack:///./app/javascript/components/administration/groupCategorySorter/Card.tsx","webpack:///./app/javascript/components/administration/GroupCategorySorter.tsx","webpack:///./app/javascript/actions/administration/memberships.js","webpack:///./app/javascript/components/administration/MembershipEdit.tsx","webpack:///./app/javascript/components/administration/MembershipNew.tsx","webpack:///./app/javascript/components/administration/legalTexts/LegalTextForm.tsx","webpack:///./app/javascript/components/administration/legalTexts/LegalTextEdit.tsx","webpack:///./app/javascript/components/administration/legalTexts/LegalTextNew.tsx","webpack:///./app/javascript/components/administration/legalTexts/LegalTextVersion.tsx","webpack:///./app/javascript/components/administration/legalTexts/LegalTextVersions.tsx","webpack:///./app/javascript/actions/administration/appNavigation.ts","webpack:///./app/javascript/hooks/administration/appNavigation.ts","webpack:///./app/javascript/components/administration/appNavigationManager/form/types/Default.tsx","webpack:///./app/javascript/components/administration/appNavigationManager/form/types/Link.tsx","webpack:///./app/javascript/components/administration/appNavigationManager/iconSelection.module.css?7e78","webpack:///./app/javascript/components/administration/appNavigationManager/IconSelection.tsx","webpack:///./app/javascript/components/administration/appNavigationManager/form/TypeSelector.tsx","webpack:///./app/javascript/components/administration/appNavigationManager/ItemForm.tsx","webpack:///./app/javascript/components/administration/appNavigationManager/form/types/More.tsx","webpack:///./app/javascript/components/administration/appNavigationManager/form/types/Page.tsx","webpack:///./app/javascript/components/administration/appNavigationManager/form/types/Activitystream.tsx","webpack:///./app/javascript/api/activitystreams.ts","webpack:///./app/javascript/components/administration/appNavigationManager/NodeTitle.tsx","webpack:///./app/javascript/components/administration/appNavigationManager/index.tsx","webpack:///./app/javascript/components/administration/GroupAdministrationMainPage.tsx","webpack:///./app/javascript/components/administration/routes.tsx","webpack:///./app/javascript/components/directory/routes.tsx","webpack:///./app/javascript/components/memberships/EditMembership.js","webpack:///./app/javascript/components/memberships/NewChangeRequest.js","webpack:///./app/javascript/components/shared/fields/CheckboxFields.tsx","webpack:///./app/javascript/components/memberships/membershipSettings/DigestSettings.js","webpack:///./app/javascript/components/memberships/membershipSettings/EmailConfigList.js","webpack:///./app/javascript/components/memberships/PushNotificationSettingsForm.tsx","webpack:///./app/javascript/components/memberships/api.tsx","webpack:///./app/javascript/components/memberships/EditMembershipSettings.tsx","webpack:///./app/javascript/components/memberships/routes.tsx","webpack:///./app/javascript/components/groups/form/BasicSettings.js","webpack:///./app/javascript/components/groups/form/GroupAccess.js","webpack:///./app/javascript/components/groups/form/JoinSettings.js","webpack:///./app/javascript/components/groups/form/MiscSettings.tsx","webpack:///./app/javascript/components/groups/form/ChatSettings.tsx","webpack:///./app/javascript/components/groups/form/index.js","webpack:///./app/javascript/components/groups/api.ts","webpack:///./app/javascript/components/groups/EditGroupActions.js","webpack:///./app/javascript/components/groups/EditGroup.js","webpack:///./app/javascript/components/groups/NewGroup.js","webpack:///./app/javascript/components/groups/Invites.tsx","webpack:///./app/javascript/components/groups/routes.tsx","webpack:///./app/javascript/actions/onboarding.js","webpack:///./app/javascript/components/onboarding/ProfileOnboarding.js","webpack:///./app/javascript/components/onboarding/routes.tsx","webpack:///./app/javascript/components/invites/routes.tsx","webpack:///./app/javascript/components/memberMap/routes.tsx","webpack:///./app/javascript/components/chat/MobileAppChat.tsx","webpack:///./app/javascript/components/tixxt/RedirectToStartpage.tsx","webpack:///./app/javascript/routes.tsx","webpack:///./app/javascript/components/chat/routes.tsx","webpack:///./app/javascript/components/tixxt/BackboneHistoryShim.tsx","webpack:///./app/javascript/components/layout/TixxtContent.tsx","webpack:///./app/javascript/hooks/useSelectNavigation.ts","webpack:///./app/javascript/components/layout/searchBar/helpers.tsx","webpack:///./app/javascript/components/layout/SearchBar.tsx","webpack:///./app/javascript/components/layout/userCentral/ChatButton.tsx","webpack:///./app/javascript/components/layout/UserCentral.tsx","webpack:///./app/javascript/components/layout/useLogoScrollResize.ts","webpack:///./app/javascript/components/layout/CustomerCentralUpdateCheck.tsx","webpack:///./app/javascript/components/layout/TeamsRenewOAuthCredentialsCheck.tsx","webpack:///./app/javascript/components/layout/TixxtHeader.tsx","webpack:///./app/javascript/components/administration/designManager/ApplyOverrideTheme.tsx","webpack:///./app/javascript/components/administration/designManagerLight/functions.tsx","webpack:///./app/javascript/components/administration/designManagerLight/ApplyOverrideGroupTheme.tsx","webpack:///./app/javascript/components/administration/designManagerLight/ApplyOverrideGroupCategoryTheme.tsx","webpack:///./app/javascript/components/layout/AppSearchHeader.tsx","webpack:///./app/javascript/components/App.tsx","webpack:///./app/javascript/helpers/legacy/customLodashCompat.ts","webpack:///./app/javascript/turbo/bridge.tsx","webpack:///./app/javascript/components/widgetbars/shared/MemberRow.tsx","webpack:///./app/javascript/components/widgetbars/widgets/AdminMembersWidget.tsx","webpack:///./app/javascript/components/widgetbars/shared/AppointmentRow.tsx","webpack:///./app/javascript/components/widgetbars/widgets/AppointmentsWidget.tsx","webpack:///./app/javascript/components/widgetbars/widgets/BirthdayWidget.tsx","webpack:///./app/javascript/components/widgetbars/widgets/GroupInfoWidget.tsx","webpack:///./app/javascript/components/widgetbars/widgets/NewestMembersWidget.tsx","webpack:///./app/javascript/components/widgetbars/widgets/OnlineMembersWidget.tsx","webpack:///./app/javascript/components/widgetbars/widgets/RssWidget.tsx","webpack:///./app/javascript/components/widgetbars/widgets/SpeedDialWidget.tsx","webpack:///./app/javascript/components/widgetbars/widgets/TextWidget.tsx","webpack:///./app/javascript/components/widgetbars/ActivitystreamWidgetbar.tsx","webpack:///./app/javascript/components/widgetbars/api.ts","webpack:///./app/javascript/packs/application.js","webpack:///./app/javascript/turbo/confirm_compat.js","webpack:///./app/javascript/helpers/showCookieModal.ts","webpack:///./app/javascript/reducers/chat/chatStateReducers.js","webpack:///./app/javascript/reducers/chat/chats.js","webpack:///./app/javascript/reducers/chat/messages.js","webpack:///./app/javascript/reducers/chat/apiRequests.js","webpack:///./app/javascript/reducers/chat/composing.js","webpack:///./app/javascript/reducers/chat/homies.js","webpack:///./app/javascript/reducers/chat/index.js","webpack:///./app/javascript/reducers/chat/session.js","webpack:///./app/javascript/reducers/chat/composer.js","webpack:///./app/javascript/sagas/chat/helpers.js","webpack:///./app/javascript/sagas/chat/presence.js","webpack:///./app/javascript/sagas/chat/api.js","webpack:///./app/javascript/sagas/chat/application.js","webpack:///./app/javascript/sagas/chat/channels.js","webpack:///./app/javascript/sagas/chat/notifications.js","webpack:///./app/javascript/sagas/chat/index.js","webpack:///./app/javascript/selectors/chat/application.js","webpack:///./app/javascript/selectors/chat/homies.js","webpack:///./app/javascript/selectors/chat/chat.js","webpack:///./app/javascript/selectors/chat/messages.js","webpack:///./app/javascript/selectors/chat/profile.js"],"sourcesContent":["import { stringify } from \"query-string\";\n\nexport const IS_CHAT_QUERY = \"__IS_CHAT_QUERY__\";\nexport const IS_NETWORK_QUERY = \"__IS_NETWORK_QUERY__\";\n\n/**\n * All actions, for documentation:\n * - chat/CHAT/SCROLL_START_REACHED\n * - chat/CHAT/SCROLL_END_REACHED\n * - chat/CHAT/MARK_AS_READ/START_TIMER\n */\n\nexport const createChatQueryAction = (event) => {\n  const type = `chat/${event.toUpperCase()}`;\n  const actionCreator = (data) => ({\n    ...data,\n    type,\n    [IS_CHAT_QUERY]: true,\n  });\n\n  actionCreator.type = type;\n  actionCreator.replyType = `${type}/REPLY`;\n\n  return actionCreator;\n};\nexport const createNetworkQueryAction = (event) => {\n  const basicActionCreator = createChatQueryAction(event);\n  return (data) => ({\n    [IS_NETWORK_QUERY]: true,\n    ...basicActionCreator(data),\n  });\n};\n\n// Loads initial message history and other chat details, like permissions\nexport const loadChatDetails = createChatQueryAction(\"chat_details\");\nexport const loadMoreMessages = createChatQueryAction(\"more_messages\");\nexport const markAsRead = createChatQueryAction(\"mark_as_read\");\nexport const muteChat = createChatQueryAction(\"mute_chat\");\nexport const muteAppChat = createChatQueryAction(\"app_mute_chat\");\nexport const unmuteChat = createChatQueryAction(\"unmute_chat\");\nexport const unmuteAppChat = createChatQueryAction(\"app_unmute_chat\");\nexport const createChat = createNetworkQueryAction(\"create_chat\");\n\nexport const IS_API_REQUEST = \"__IS_API_REQUEST__\";\nexport const createApiAction = (event, { endpoint }) => {\n  const type = `chat/${event.toUpperCase()}`;\n  const actionCreator = (meta) => ({\n    type,\n    [IS_API_REQUEST]: true,\n    endpoint: endpoint(meta),\n  });\n\n  actionCreator.type = type;\n\n  return actionCreator;\n};\n\nexport const fetchAvailableChats = createApiAction(\"available_chats\", {\n  endpoint: ({ q }) =>\n    `/directory?${stringify({\n      q,\n      only_my_groups: true,\n      only_chat_enabled: true,\n    })}`,\n});\n\nexport const setChatStatus = createNetworkQueryAction(\"set_status\");\n","import React from \"react\";\n\nexport default function Muted() {\n  return (\n    <span className=\"fa-layers absolute bottom-0 left-0 leading-none\">\n      <i className=\"fa-solid fa-volume-xmark text-white\" />\n      <i className=\"fa-regular fa-volume-xmark text-danger\" />\n    </span>\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { compose, withProps } from \"recompose\";\nimport { startsWith, min } from \"lodash\";\nimport moment from \"moment\";\n\nimport {\n  getCounterForChat,\n  getComposingHomie,\n  isMuted,\n} from \"../../../selectors/chat/chat\";\nimport ChatImage from \"../shared/ChatImage\";\nimport Notification from \"../shared/Notification\";\nimport Composing from \"../shared/Composing\";\nimport Muted from \"../shared/Muted\";\n\nconst Row = ({\n  id,\n  select,\n  name,\n  last_message,\n  last_interacted_at,\n  counter,\n  muted,\n  state,\n  type,\n  composingHomie,\n}) => {\n  const mom = min([moment(last_interacted_at), moment()]);\n\n  return (\n    <div\n      className=\"chat__list_row flex gap-2 items-center px-3 py-2 cursor-pointer border-b border-neutral\"\n      onClick={select}\n      title={name}\n    >\n      <div className={\"relative shrink-0\"}>\n        <ChatImage chatId={id} />\n        <Notification\n          className=\"absolute top-0 right-0\"\n          counter={state && state.last_read_id ? counter : -1}\n        />\n        {composingHomie ? <Composing /> : null}\n        {muted ? <Muted /> : null}\n      </div>\n      <div className=\"chatButtonElement texts grow truncate\">\n        <div className=\"chatName truncate font-semibold leading-tight\">\n          {name}\n        </div>\n        {last_message ? (\n          <div className=\"chatTeaser text-xs text-muted truncate\">\n            {type === \"group\" ? <span>{last_message.from.name}: </span> : null}\n            {last_message.text}\n          </div>\n        ) : null}\n      </div>\n      <div className=\"chatButtonElement chatLastInteraction text-xs text-muted shrink-0\">\n        <time title={mom.format(\"DD.MM.YYYY HH:mm\")}>{mom.fromNow()}</time>\n      </div>\n      <i className=\"fa fa-chevron-right chatButtonElement openChatIcon\" />\n    </div>\n  );\n};\nRow.propTypes = {\n  select: PropTypes.func,\n  name: PropTypes.string,\n  type: PropTypes.string,\n  counter: PropTypes.number,\n};\n\nexport default compose(\n  withProps(({ id }) => {\n    return {\n      type: startsWith(id, \"member\") ? \"member\" : \"group\",\n    };\n  }),\n  connect(\n    (state, { id }) => ({\n      counter: getCounterForChat(state, { chatId: id }),\n      muted: isMuted(state, { chatId: id }),\n      composingHomie: getComposingHomie(state, { chatId: id }),\n    }),\n    (dispatch, { id }) => ({\n      select: () => {\n        dispatch({\n          type: \"chat/NAVIGATE\",\n          payload: { route: \"showChat\", params: { chatId: id } },\n        });\n\n        if (\n          window.Notification &&\n          window.Notification.permission !== \"granted\"\n        ) {\n          window.Notification.requestPermission();\n        }\n      },\n    }),\n  ),\n)(Row);\n","import React, { useState, useEffect, useRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect, useDispatch, useSelector } from \"react-redux\";\nimport { get, map, isEmpty } from \"lodash\";\nimport classNames from \"classnames\";\nimport {\n  getMemberBusyStatus,\n  getMemberOnlineStatus,\n  getSortedChats,\n} from \"../../../selectors/chat/chat\";\nimport ChatHeader from \"../shared/ChatHeader\";\nimport Row from \"./Row\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport Textarea from \"react-textarea-autosize\";\nimport { regular, solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { toggleChatbar } from \"../../../layout/togglebar\";\nimport { setChatStatus } from \"../../../actions/chat\";\n\nconst statusOption = {\n  busy: \"busy\",\n  online: \"online\",\n  invisible: \"invisible\",\n};\n\nconst useCurrentStatus = () => {\n  const isOnline = useSelector((state) =>\n    getMemberOnlineStatus(state, window.Preload.current_member.id),\n  );\n\n  const presence = useSelector((state) =>\n    getMemberBusyStatus(state, window.Preload.current_member.id),\n  );\n\n  return (\n    presence?.type || (isOnline ? statusOption.online : statusOption.invisible)\n  );\n};\n\nconst StartNewButton = connect(null, (dispatch) => ({\n  navigateToNewChat: () =>\n    dispatch({ type: \"chat/NAVIGATE\", payload: { route: \"newChat\" } }),\n}))(({ disabled, navigateToNewChat }) => (\n  <button\n    className=\"btn btn-light btn-sm newChatButton\"\n    onClick={navigateToNewChat}\n    disabled={disabled}\n  >\n    <FontAwesomeIcon\n      icon={regular(\"comment\")}\n      className={\"mr-1 text-primary\"}\n    />\n    {I18n.t(\"js.chat.list.start_new\")}\n  </button>\n));\n\nfunction ChatStatusCircle({ status }) {\n  switch (status) {\n    case statusOption.online:\n      return (\n        <FontAwesomeIcon\n          icon={solid(\"circle\")}\n          className={\"chat__status--online\"}\n        />\n      );\n\n    case statusOption.busy:\n      return (\n        <FontAwesomeIcon\n          icon={solid(\"circle\")}\n          className={\"chat__status--busy\"}\n        />\n      );\n    case statusOption.invisible:\n      return (\n        <FontAwesomeIcon\n          icon={solid(\"eye-slash\")}\n          className={\"chat__status--invisible\"}\n        />\n      );\n  }\n}\n\nfunction StatusButton({ toggleStatusMessageForm }) {\n  const status = useCurrentStatus();\n  return (\n    <button\n      className={\"btn btn-light btn-sm\"}\n      onClick={() => toggleStatusMessageForm(true)}\n    >\n      <ChatStatusCircle status={status} /> Status\n    </button>\n  );\n}\n\nfunction OnlineStatusDropdown({ selectedOption, setSelectedOption }) {\n  const handleOptionChange = (e, option) => {\n    e.preventDefault();\n    setSelectedOption(option);\n  };\n\n  return (\n    <>\n      <div className=\"btn-group\">\n        <button\n          type=\"button\"\n          className=\"btn border btn-light  dropdown-toggle flex items-center\"\n          data-bs-toggle=\"dropdown\"\n          aria-expanded=\"false\"\n          role=\"button\"\n        >\n          <ChatStatusCircle status={selectedOption} />\n        </button>\n        <ul className=\"dropdown-menu\">\n          <li>\n            <a\n              className=\"dropdown-item\"\n              href=\"#\"\n              onClick={(e) => handleOptionChange(e, statusOption.online)}\n            >\n              <span className=\"flex items-center space-x-1\">\n                <FontAwesomeIcon\n                  icon={\"fa-circle\"}\n                  className={\"chat__status--online\"}\n                />\n                <span className=\"flex-1\">\n                  {I18n.t(\"js.chat.status_text.online.label\")}\n                </span>\n              </span>\n            </a>\n          </li>\n          <li>\n            <a\n              className=\"dropdown-item\"\n              href=\"#\"\n              onClick={(e) => handleOptionChange(e, statusOption.busy)}\n            >\n              <span className=\"flex items-center space-x-1\">\n                <FontAwesomeIcon\n                  icon={\"fa-circle\"}\n                  className={\"chat__status--busy\"}\n                />\n                <span className=\"flex-1\">\n                  {I18n.t(\"js.chat.status_text.busy.label\")}\n                </span>\n              </span>\n            </a>\n          </li>\n          {window.Preload.current_network.config.show_online_status ==\n            \"optional\" && (\n            <li>\n              <a\n                className=\"dropdown-item\"\n                href=\"#\"\n                onClick={(e) => handleOptionChange(e, statusOption.invisible)}\n              >\n                <span className=\"flex items-center space-x-1\">\n                  <FontAwesomeIcon\n                    icon={\"fa-eye-slash\"}\n                    className={\"chat__status--invisible\"}\n                  />\n                  <span className=\"flex-1\">\n                    {I18n.t(\"js.chat.status_text.invisible.label\")}\n                  </span>\n                </span>\n              </a>\n            </li>\n          )}\n        </ul>\n      </div>\n    </>\n  );\n}\n\nfunction StatusMessageForm({ toggleStatusMessageForm }) {\n  const presence = useSelector((state) =>\n    getMemberBusyStatus(state, window.Preload.current_member.id),\n  );\n  const initialRender = useRef(true);\n  const [statusText, setStatusText] = useState(presence?.text || \"\");\n  const currentStatus = useCurrentStatus();\n  const [selectedOption, setSelectedOption] = useState(currentStatus);\n\n  const dispatch = useDispatch();\n\n  function submitStatus(status) {\n    if (status.text) status.text = status.text.replace(/[\\n\\r]/g, \" \");\n    dispatch(setChatStatus({ payload: status }));\n  }\n\n  function removeStatusText() {\n    setStatusText(\"\");\n    submitStatus({ text: \"\", type: selectedOption });\n  }\n\n  useEffect(() => {\n    if (initialRender.current) {\n      initialRender.current = false;\n      return;\n    }\n\n    if (selectedOption == statusOption.invisible) {\n      submitStatus({ text: statusText, type: statusOption.invisible });\n      toggleStatusMessageForm(false);\n    }\n\n    if (\n      selectedOption === statusOption.busy &&\n      (isEmpty(statusText) ||\n        statusText === I18n.t(\"js.chat.status_text.online.default\"))\n    ) {\n      setStatusText(I18n.t(\"js.chat.status_text.busy.default\"));\n    } else if (\n      selectedOption === statusOption.online &&\n      (isEmpty(statusText) ||\n        statusText === I18n.t(\"js.chat.status_text.busy.default\"))\n    ) {\n      setStatusText(I18n.t(\"js.chat.status_text.online.default\"));\n    }\n  }, [selectedOption, setSelectedOption]);\n\n  return (\n    <div\n      className={classNames(\"p-2 py-4 flex gap-2\", {\n        chat__header: !window.isApp,\n        \"sticky left-0 right-0 bg-white z-10 top-10\": window.isApp,\n      })}\n    >\n      <OnlineStatusDropdown\n        selectedOption={selectedOption}\n        setSelectedOption={setSelectedOption}\n      />\n\n      {selectedOption != \"invisible\" && (\n        <>\n          <Textarea\n            maxLength=\"100\"\n            minRows={1}\n            maxRows={2}\n            value={statusText}\n            autoFocus\n            onChange={(e) => setStatusText(e.target.value)}\n            className={\n              \"grow text-sm rounded-none border-0 border-r border-neutral resize-none\"\n            }\n          />\n\n          <div className=\"btn-group\">\n            <button\n              className={\"btn btn-light btn-sm\"}\n              onClick={() => {\n                submitStatus({ text: statusText, type: selectedOption });\n                toggleStatusMessageForm(false);\n              }}\n            >\n              <FontAwesomeIcon\n                icon=\"fa-regular fa-check\"\n                className=\"text-primary\"\n              />\n            </button>\n            <button\n              className={\"btn btn-light btn-sm\"}\n              onClick={() => {\n                removeStatusText();\n                toggleStatusMessageForm(false);\n              }}\n            >\n              <FontAwesomeIcon\n                icon=\"fa-regular fa-trash\"\n                className=\"text-danger\"\n              />\n            </button>\n          </div>\n        </>\n      )}\n    </div>\n  );\n}\n\nfunction CloseButton() {\n  return (\n    <button\n      className={\"btn btn-light btn-sm\"}\n      title={I18n.t(\"js.chat.close\")}\n      onClick={toggleChatbar}\n    >\n      <FontAwesomeIcon icon={regular(\"xmark\")} />\n    </button>\n  );\n}\n\nconst ChatList = ({ connected, chats }) => {\n  const [showStatusMessageForm, toggleStatusMessageForm] = useState(false);\n\n  return (\n    <>\n      <ChatHeader\n        title={I18n.t(\"js.chat.list.headline\")}\n        ButtonLeft={!window.isApp && <CloseButton />}\n        ButtonRight={\n          <div className=\"btn-group\">\n            {window.Preload.current_network.config.show_online_status !=\n              \"disabled\" && (\n              <StatusButton toggleStatusMessageForm={toggleStatusMessageForm} />\n            )}\n\n            <StartNewButton disabled={!connected} />\n          </div>\n        }\n      />\n      {showStatusMessageForm && (\n        <StatusMessageForm toggleStatusMessageForm={toggleStatusMessageForm} />\n      )}\n      <div\n        className={classNames(\n          \"chat__list grow overflow-y-auto overflow-x-hidden w-full\",\n          {\n            mobile_app_chat__list: window.isApp,\n          },\n        )}\n      >\n        {map(chats, (item, index) => (\n          <Row key={index} {...item} />\n        ))}\n      </div>\n    </>\n  );\n};\nChatList.propTypes = {\n  chats: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.string,\n      name: PropTypes.string,\n      image_id: PropTypes.string,\n    }),\n  ),\n};\n\nexport default connect((state) => ({\n  chats: getSortedChats(state),\n  connected: get(state, [\"chat\", \"session\", \"connected\"]),\n}))(ChatList);\n","import { get } from \"lodash\";\nexport const getApiRequestState = (state, action) =>\n  get(state, [\"chat\", \"apiRequests\", action.type]);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map } from \"lodash\";\nimport { compose, withState, withHandlers } from \"recompose\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nconst GroupedItems = ({\n  open,\n  toggleOpen,\n  items,\n  title,\n  allowToggle,\n  renderItemComponent,\n}) => (\n  <div className=\"groupedRows px-3\">\n    {title ? (\n      <div\n        className={classNames(\"groupedRowsHeader my-2\", { allowToggle })}\n        onClick={allowToggle ? toggleOpen : null}\n      >\n        {allowToggle ? (\n          <FontAwesomeIcon\n            icon={regular(\"chevron-right\")}\n            className={classNames(\n              \"fa-xs text-gray-500 transition-transform mr-2\",\n              {\n                \"rotate-90\": open,\n              },\n            )}\n          />\n        ) : null}\n        <span className=\"title font-semibold uppercase text-sm\">{title}</span>\n      </div>\n    ) : null}\n    {open ? (\n      <div className=\"groupedRowsItems flex flex-wrap gap-1\">\n        {map(items, (item, index) => renderItemComponent(item, index))}\n      </div>\n    ) : null}\n  </div>\n);\nGroupedItems.propTypes = {\n  title: PropTypes.string,\n  allowToggle: PropTypes.bool,\n  open: PropTypes.bool,\n  toggleOpen: PropTypes.func,\n  getItemComponent: PropTypes.func,\n  items: PropTypes.arrayOf(PropTypes.object),\n  additionalItemProps: PropTypes.object,\n};\n\nexport default compose(\n  withState(\"open\", \"setOpen\", true),\n  withHandlers({\n    toggleOpen:\n      ({ open, setOpen }) =>\n      () =>\n        setOpen(!open),\n  }),\n)(GroupedItems);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { createChat } from \"../../../actions/chat\";\nimport classnames from \"classnames\";\n\nconst Tile = ({ createChat, id, name, type }) => (\n  <button\n    key={id}\n    onClick={createChat}\n    className={classnames(\"btn btn-light btn-sm\", {\n      memberChat: type === \"member\",\n      groupChat: type === \"group\",\n    })}\n  >\n    <i\n      className={classnames(\"mr-1 text-muted\", {\n        \"fa fa-user\": type === \"member\",\n        \"fa fa-users\": type === \"group\",\n      })}\n    />\n    {name}\n  </button>\n);\nTile.propTypes = {\n  id: PropTypes.string,\n  name: PropTypes.string,\n  type: PropTypes.string,\n  createChat: PropTypes.func,\n};\n\nexport default connect(null, (dispatch, { id, type }) => ({\n  createChat: (e) => {\n    e.preventDefault();\n    dispatch(createChat({ payload: { id, type } }));\n  },\n}))(Tile);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { map, get, isEmpty } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport classNames from \"classnames\";\n\nimport { fetchAvailableChats } from \"../../../actions/chat\";\nimport { getApiRequestState } from \"../../../selectors/chat/apiRequests\";\nimport ChatHeader from \"../shared/ChatHeader\";\nimport GroupedItems from \"../shared/GroupedItems\";\nimport Tile from \"./Tile\";\nimport { BackToRootButton } from \"../shared/BackButton\";\n\nclass NewChat extends React.Component {\n  render() {\n    const { member, ...groupsByCategoryName } = this.props.availableChats || {};\n\n    return (\n      <>\n        <ChatHeader\n          title={I18n.t(\"js.chat.new.headline\")}\n          ButtonLeft={<BackToRootButton />}\n        />\n        <form\n          className={classNames(\"px-3 py-2 chatNewForm flex overflow-visible\", {\n            \"mt-14\": window.isApp,\n          })}\n          onSubmit={this.submitSearch}\n        >\n          <div className={\"input-group\"}>\n            <input\n              type=\"text\"\n              name=\"q\"\n              placeholder={I18n.t(\"js.chat.new.search_placeholder\")}\n              autoFocus\n              className={\"grow\"}\n            />\n            <button\n              className=\"btn btn-primary\"\n              type=\"submit\"\n              disabled={this.props.requestState === \"request\"}\n            >\n              {this.props.requestState === \"request\" ? (\n                <FontAwesomeIcon\n                  className={\"fa-spin\"}\n                  icon={regular(\"spinner\")}\n                />\n              ) : (\n                <FontAwesomeIcon icon={regular(\"search\")} />\n              )}\n            </button>\n          </div>\n        </form>\n        {isEmpty(member) ? null : (\n          <GroupedItems\n            key=\"members\"\n            items={member}\n            renderItemComponent={(item, index) => (\n              <Tile key={index} type=\"member\" {...item} />\n            )}\n            title={I18n.t(\"js.chat.new.users\")}\n            allowToggle={true}\n          />\n        )}\n        {map(groupsByCategoryName, (groups, name) => [\n          <GroupedItems\n            key={name}\n            items={groups}\n            renderItemComponent={(item, index) => (\n              <Tile key={index} type=\"group\" {...item} />\n            )}\n            title={name}\n            allowToggle={true}\n          />,\n        ])}\n      </>\n    );\n  }\n\n  componentDidMount() {\n    this.props.fetchAvailableChats(\"\");\n  }\n\n  submitSearch = (e) => {\n    e.preventDefault();\n    this.props.fetchAvailableChats(e.currentTarget.elements.q.value);\n  };\n}\n\nexport default connect(\n  (state) => ({\n    availableChats: get(state, [\"chat\", \"availableChats\"]),\n    requestState: getApiRequestState(state, fetchAvailableChats),\n  }),\n  (dispatch) => ({\n    fetchAvailableChats: (q) => dispatch(fetchAvailableChats({ q })),\n  }),\n)(NewChat);\n","import React from \"react\";\nimport { map, slice, findIndex, trim, compact, times } from \"lodash\";\nimport { connect } from \"react-redux\";\nimport { compose, withHandlers } from \"recompose\";\nimport classnames from \"classnames\";\n// import Hotkeys from \"hotkeys-js\";\n\nimport { getCurrentChat } from \"../../../selectors/chat/application\";\nimport {\n  getSortedChats,\n  getComposingHomie,\n  getCounterForChat,\n} from \"../../../selectors/chat/chat\";\nimport ChatImage from \"../shared/ChatImage\";\nimport Notification from \"../shared/Notification\";\nimport Composing from \"../shared/Composing\";\n\nconst chatInitials = (chatName) => {\n  if (chatName.length < 2) {\n    return chatName.toUpperCase();\n  }\n\n  const parts = compact(chatName.split(/[-_/\\\\.@\\s]/));\n  const initials =\n    parts.length >= 2\n      ? trim(parts[0])[0] + trim(parts[1])[0]\n      : chatName[0] + chatName[1];\n\n  return initials.toUpperCase();\n};\n\nconst Chat = connect(\n  (state, { id }) => ({\n    counter: getCounterForChat(state, { chatId: id }),\n    composingHomie: getComposingHomie(state, { chatId: id }),\n  }),\n  (dispatch, { id }) => ({\n    select: () =>\n      dispatch({\n        type: \"chat/NAVIGATE\",\n        payload: { route: \"showChat\", params: { chatId: id } },\n      }),\n  }),\n)(({ id, name, selected, select, counter, state, composingHomie }) => (\n  <button\n    className={classnames(\n      \"chat__quick_select_item relative flex flex-col items-center px-2 py-1 bg-secondary/25\",\n      {\n        \"chat__quick_select_item--active\": selected,\n      },\n    )}\n    onClick={select}\n    title={name}\n  >\n    <div className={\"relative\"}>\n      <ChatImage chatId={id} />\n      <Notification\n        counter={state?.last_read_id ? counter : -1}\n        className={\"absolute top-0 right-0\"}\n      />\n      {composingHomie ? <Composing /> : null}\n    </div>\n    <span className=\"chatName font-semibold text-xs\">{chatInitials(name)}</span>\n  </button>\n));\n\nconst QuickChatSelect = ({ chats, chatId }) => (\n  <div className=\"chat__quick_select border-t border-neutral\">\n    {map(\n      chats,\n      (chat) =>\n        chat.id && (\n          <Chat key={chat.id} selected={chat.id === chatId} {...chat} />\n        ),\n    )}\n    {times(10 - chats.length, (i) => (\n      <div key={i} className={\"placeholder\"} />\n    ))}\n  </div>\n);\n\nexport default compose(\n  connect(\n    (state) => ({\n      currentChat: getCurrentChat(state),\n      chats: slice(getSortedChats(state), 0, 10),\n    }),\n    (dispatch) => ({\n      selectChat: (chatId) =>\n        dispatch({\n          type: \"chat/NAVIGATE\",\n          payload: { route: \"showChat\", params: { chatId } },\n        }),\n    }),\n  ),\n  withHandlers({\n    nextChat:\n      ({ chats, selectChat, currentChat }) =>\n      () => {\n        const currIndex = findIndex(chats, (c) => c.id === currentChat);\n        const nextIndex =\n          currIndex < 0 || currIndex + 1 >= chats.length ? 0 : currIndex + 1;\n        selectChat(chats[nextIndex].id);\n      },\n    prevChat:\n      ({ chats, selectChat, currentChat }) =>\n      () => {\n        const currIndex = findIndex(chats, (c) => c.id === currentChat);\n        const prevIndex =\n          currIndex < 0 || currIndex - 1 < 0 ? chats.length - 1 : currIndex - 1;\n        selectChat(chats[prevIndex].id);\n      },\n  }),\n  // lifecycle({\n  //   componentDidMount() {\n  //     Hotkeys(\"ctrl+command+right\", this.props.nextChat);\n  //     Hotkeys(\"ctrl+command+left\", this.props.prevChat);\n  //   },\n  //   componentWillUnmount() {\n  //     Hotkeys.unbind(\"ctrl+command+right\");\n  //     Hotkeys.unbind(\"ctrl+command+left\");\n  //   },\n  // }),\n)(QuickChatSelect);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport moment from \"moment\";\nimport { memoize } from \"lodash\";\n\nimport { isMuted } from \"../../../selectors/chat/chat\";\nimport {\n  muteChat,\n  unmuteChat,\n  muteAppChat,\n  unmuteAppChat,\n} from \"../../../actions/chat\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nconst MUTE_DURATIONS = memoize(() => [\n  [\n    I18n.t(\"js.chat.room.mute_hour\"),\n    () => moment().add(1, \"hour\").toDate(),\n    false,\n  ],\n  [\n    I18n.t(\"js.chat.room.mute_rest_of_day\"),\n    () => moment().endOf(\"day\").toDate(),\n    false,\n  ],\n  [\n    I18n.t(\"js.chat.room.mute_rest_of_week\"),\n    () => moment().endOf(\"week\").toDate(),\n    false,\n  ],\n  [I18n.t(\"js.chat.room.forever\"), () => moment(\"9999-12-31\").toDate(), true],\n]);\n\nconst MuteLink = connect(null, (dispatch, { chatId, muteUntil }) => ({\n  onClick: (e) => {\n    e.preventDefault();\n    const meta = { chatId };\n    let dispatchAction;\n\n    if (muteUntil) {\n      dispatchAction = window.isApp ? muteAppChat : muteChat;\n    } else {\n      dispatchAction = window.isApp ? unmuteAppChat : unmuteChat;\n    }\n\n    dispatch(\n      dispatchAction({\n        meta,\n        payload: muteUntil ? { muted_until: muteUntil() } : {},\n      }),\n    );\n  },\n}))(({ label, onClick }) => (\n  <a onClick={onClick} href=\"#\">\n    {label}\n  </a>\n));\n\nconst ChatRoomSettingsButton = ({ muted, chatId }) => (\n  <div className=\"chatRoomSettingsButton chatHeaderActions\">\n    {muted ? (\n      <FontAwesomeIcon\n        icon={solid(\"volume-off\")}\n        className={\"chatMuted chatHeaderStatus\"}\n      />\n    ) : null}\n    <div className={\"dropdown\"}>\n      <button className={\"btn btn-light btn-sm\"} data-bs-toggle=\"dropdown\">\n        <FontAwesomeIcon icon={solid(\"ellipsis-h\")} />\n      </button>\n      <ul className=\"dropdown-menu\">\n        {muted ? (\n          <li>\n            <MuteLink\n              label={I18n.t(\"js.chat.room.mute_disable\")}\n              muteUntil={null}\n              chatId={chatId}\n            />\n          </li>\n        ) : (\n          MUTE_DURATIONS().map(([label, muteUntil, appOnly], i) =>\n            appOnly && !window.isApp ? null : (\n              <li key={i}>\n                <MuteLink label={label} muteUntil={muteUntil} chatId={chatId} />\n              </li>\n            ),\n          )\n        )}\n      </ul>\n    </div>\n  </div>\n);\nChatRoomSettingsButton.propTypes = {\n  muted: PropTypes.bool,\n};\n\nexport default connect((state, { chatId }) => ({\n  muted: isMuted(state, { chatId }),\n}))(ChatRoomSettingsButton);\n","import React from \"react\";\nimport { throttle, debounce } from \"lodash\";\nimport classNames from \"classnames\";\n\nconst THROTTLE = 250;\n\n/**\n * Component which handles scrolling stuff\n * div that scrolls when a new child (i.e. a chat message) is added\n *\n * [bool] autoscroll - enables autoscrolling if the children will change\n * [integer] autoscrollThreashold - the percentage border at the bottom to break the autoscroll\n * [integer] callbackThreshold - the percentage border when onStartReached and onEndReached triggers\n * [function] onStartReached - callback when scroll to the top\n * [function] onEndReached - callback when scroll to the bottom\n */\nclass ScrollContainer extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.container = React.createRef();\n    this.bumper = React.createRef();\n\n    this.state = {\n      autoscrollBreaked: false,\n    };\n\n    this.lastScrollPoint = 0;\n    this.lastScrollPosition = -1;\n  }\n\n  componentDidMount() {\n    this.container.current.addEventListener(\"wheel\", this.handleWheel);\n    this.container.current.addEventListener(\"scroll\", this.handleScrolling);\n    window.addEventListener(\"resize\", this.handleResize);\n\n    this.scroll({ smooth: false });\n  }\n\n  componentWillUnmount() {\n    this.container.current.removeEventListener(\"wheel\", this.handleWheel);\n    this.container.current.removeEventListener(\"scroll\", this.handleScrolling);\n    window.removeEventListener(\"resize\", this.handleResize);\n  }\n\n  componentDidUpdate(prevProps) {\n    if (this.props.id !== prevProps.id) {\n      this.setState({ autoscrollBreaked: false });\n      this.scroll({ smooth: false });\n    } else if (\n      React.Children.count(this.props.children) !==\n      React.Children.count(prevProps.children)\n    ) {\n      this.scroll({ smooth: true });\n    }\n  }\n\n  // Cancel wheel event and prevent parent scroll\n  cancelScrollEvent = (e) => {\n    e.stopImmediatePropagation();\n    e.preventDefault();\n    e.returnValue = false;\n  };\n\n  // Handle wheel event and calculate scroll position\n  // cancel the wheel event when scroll is at top or bottom\n  // this will prevent the parent container from scrolling\n  //\n  // calls trackScrolling() after cancel. This is required,\n  // because scroll event will never triggered if the wheel event is canceled\n  handleWheel = (e) => {\n    const div = this.container.current;\n    const scrollTop = div.scrollTop;\n    const scrollHeight = div.scrollHeight;\n    const height = div.clientHeight;\n    const wheelDelta = e.deltaY;\n    const isDeltaPositive = wheelDelta > 0;\n\n    if (isDeltaPositive && wheelDelta > scrollHeight - height - scrollTop) {\n      this.cancelScrollEvent(e);\n      this.trackScrolling();\n      return false;\n    } else if (!isDeltaPositive && -wheelDelta > scrollTop) {\n      this.cancelScrollEvent(e);\n      this.trackScrolling();\n      return false;\n    }\n  };\n\n  // Calculate and check threasholds and maybe call callbacks\n  trackScrolling = () => {\n    const div = this.container.current;\n\n    if (div.scrollTop !== this.lastScrollPosition) {\n      const direction = div.scrollTop > this.lastScrollPosition ? 1 : -1;\n      const callbackThreshold =\n        (div.scrollHeight / 100) * this.props.callbackThreshold;\n      const autoscrollThreashold =\n        (div.scrollHeight / 100) * this.props.autoscrollThreashold;\n\n      //console.log(\"handle scroll\", \"height:\", div.clientHeight, \"scrollHeight:\", div.scrollHeight, \"scrollTop:\", div.scrollTop, \"direction:\", direction, \"callbackThreshold:\", callbackThreshold, \"autoscrollThreashold:\", autoscrollThreashold);\n\n      // Handle autoscrollThreashold\n      if (\n        div.scrollTop <\n        div.scrollHeight - div.clientHeight - autoscrollThreashold\n      ) {\n        this.setState({ autoscrollBreaked: true });\n      } else {\n        this.setState({ autoscrollBreaked: false });\n      }\n\n      // Handle callbackThreshold\n      if (direction < 0 && div.scrollTop <= callbackThreshold) {\n        // scrolling up and be in the threshold at the top\n        this.callStartReached();\n      } else if (\n        direction > 0 &&\n        div.scrollTop >= div.scrollHeight - div.clientHeight - callbackThreshold\n      ) {\n        // scrolling down and be in the threshold at the bottom\n        this.callEndReached();\n      }\n    }\n\n    // Check bumper\n    if (this.bumper.current.clientHeight > 10) {\n      //console.log(\"BUMPER bumped\");\n      this.callStartReached();\n    }\n\n    // cache scrollPosition and lastScrollHeight\n    this.lastScrollPosition = div.scrollTop;\n    this.lastScrollPoint = div.scrollHeight - div.scrollTop;\n  };\n\n  // Ensure a debounced call on the onStartReached callback\n  callStartReached = debounce(\n    () => {\n      this.props.onStartReached && this.props.onStartReached();\n    },\n    THROTTLE,\n    { leading: true, trailing: true },\n  );\n\n  // Ensure a debounced call on the onEndReached callback\n  callEndReached = debounce(\n    () => {\n      this.props.onEndReached && this.props.onEndReached();\n    },\n    THROTTLE,\n    { leading: true, trailing: true },\n  );\n\n  // Perform scrolling or adjust scroll\n  scroll = ({ smooth }) => {\n    const div = this.container.current;\n    if (!div) {\n      return;\n    }\n\n    if (this.props.autoscroll && !this.state.autoscrollBreaked) {\n      //console.log(\"scroll to bottom\");\n      this.performScroll({ smooth });\n      this.callEndReached();\n    } else {\n      //console.log(\"adjust scroll\");\n      // prevent jumping, by preserving the scroll position\n      if (div.scrollHeight !== this.lastScrollHeight) {\n        div.scrollTop = div.scrollHeight - this.lastScrollPoint;\n      }\n    }\n\n    // track the new scroll position\n    this.trackScrolling();\n  };\n\n  performScroll = ({ smooth }) => {\n    const div = this.container.current;\n    if (!div) {\n      return;\n    }\n\n    if (smooth && div.scrollTop) {\n      div.style.scrollBehavior = \"smooth\";\n    } else {\n      div.style.scrollBehavior = \"auto\";\n    }\n\n    div.scrollTop = div.scrollHeight - div.offsetHeight;\n    window.DIV = div;\n\n    setTimeout(() => (div.style.scrollBehavior = \"auto\"), 250);\n  };\n\n  onClickScrollToBottom = () => {\n    this.performScroll({ smooth: true });\n    this.trackScrolling();\n  };\n\n  // throttled calls for use in events\n  handleScrolling = throttle(this.trackScrolling, THROTTLE);\n  handleResize = throttle(this.trackScrolling, THROTTLE);\n\n  render() {\n    return (\n      <div\n        ref={this.container}\n        className={classNames(\n          \"overflow-x-hidden overflow-y-auto\",\n          this.props.className,\n        )}\n      >\n        {this.props.startElement}\n        <div key=\"bumperTop\" className=\"bumperTop\" ref={this.bumper} />\n        {this.props.children}\n        <div key=\"bumperBottom\" className=\"bumperBottom\" />\n        {this.props.endElement}\n        {this.state.autoscrollBreaked ? (\n          <div className=\"scrollToBottom\">\n            <i\n              className=\"fa fa-chevron-circle-down\"\n              onClick={this.onClickScrollToBottom}\n            />\n          </div>\n        ) : null}\n      </div>\n    );\n  }\n}\n\nexport default ScrollContainer;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst MessageAuthor = ({ id, name, imageUrl }) => (\n  <div className=\"chatMessageAuthor flex gap-2 items-center\">\n    {imageUrl ? (\n      <img\n        className=\"chatMessageImage h-5 w-5 rounded-full\"\n        alt={name}\n        src={imageUrl}\n      />\n    ) : null}\n    <a className={\"grow text-sm font-semibold\"} href={`/members/${id}`}>\n      {name}\n    </a>\n  </div>\n);\nMessageAuthor.propTypes = {\n  id: PropTypes.string,\n  name: PropTypes.string,\n  imageUrl: PropTypes.string,\n};\n\nexport default MessageAuthor;\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport classNames from \"classnames\";\n\ntype MessageSettingsArgs = {\n  id: string;\n  chatId: string;\n  fromId: string;\n  fromDeleted: boolean;\n  myMessage: boolean;\n  className?: string;\n};\n\nimport { createChat } from \"../../../../actions/chat\";\n\nexport default function MessageSettings({\n  myMessage,\n  className,\n  id,\n  chatId,\n  fromId,\n  fromDeleted,\n}: MessageSettingsArgs) {\n  const dispatch = useDispatch();\n  const type = chatId.indexOf(\"group\") === 0 ? \"group\" : \"member\";\n  const hideStartPrivateChat =\n    fromDeleted ||\n    myMessage ||\n    type === \"member\" ||\n    Preload.current_member?.is_external;\n\n  function setMessageToQuote(e: React.MouseEvent<HTMLAnchorElement>) {\n    e.preventDefault();\n    dispatch({\n      type: \"chat/COMPOSER/SET_MESSAGE_TO_QUOTE\",\n      messageId: id,\n      chatId,\n    });\n  }\n\n  function createPrivateChat(e: React.MouseEvent<HTMLAnchorElement>) {\n    e.preventDefault();\n    dispatch(createChat({ payload: { id: fromId, type: \"member\" } }));\n  }\n\n  return (\n    <div className={classNames(\"chatMessageSettings\", className)}>\n      <div className={\"dropdown\"}>\n        <button\n          className={\"btn btn-light btn-sm leading-none px-1\"}\n          data-bs-toggle=\"dropdown\"\n        >\n          <i className=\"fa fa-ellipsis-h fa-sm\" />\n        </button>\n        <ul className=\"dropdown-menu\">\n          <li>\n            <a onClick={setMessageToQuote} href={\"#\"}>\n              {I18n.t(\"js.chat.room.message.quote_message\")}\n            </a>\n          </li>\n          {!hideStartPrivateChat && (\n            <li>\n              <a onClick={createPrivateChat} href={\"#\"}>\n                {I18n.t(\"js.chat.room.message.start_private_chat\")}\n              </a>\n            </li>\n          )}\n        </ul>\n      </div>\n    </div>\n  );\n}\n","import { every } from \"lodash\";\nimport createEmojiRegex from \"emoji-regex\";\nimport { length, toArray } from \"stringz\";\n\nconst EMOJI_REGEX = createEmojiRegex();\n\nexport const isEmoji = (symbol) => {\n  // reset lastIndex instead of reinitialize the whole regexp object\n  EMOJI_REGEX.lastIndex = 0;\n  return EMOJI_REGEX.test(symbol);\n};\n\nexport const onlyEmojis = (text) => {\n  return every(toArray(text), (sym) => isEmoji(sym));\n};\n\nexport const getEmojiClassName = (text, max = 3) => {\n  const symbols_count = length(text);\n\n  if (symbols_count > max) {\n    return;\n  }\n\n  if (onlyEmojis(text)) {\n    return `emoji emoji_${symbols_count}`;\n  }\n};\n","import { Remarkable } from \"remarkable\";\nimport { linkify } from \"remarkable/linkify\";\nimport { noop } from \"lodash\";\n\nconst noMarkdown = {\n  render: (text) => text,\n};\n\nconst getNewDevRenderer = (options) => new Remarkable(options).use(linkify);\nconst getRenderer =\n  (window.Application && window.Application.getNewMarkdownRenderer) ||\n  (Remarkable && getNewDevRenderer) ||\n  noop;\n\nconst markdownRenderer = getRenderer({\n  html: false,\n  breaks: true,\n  linkTarget: \"_blank\",\n});\n\nif (markdownRenderer) {\n  markdownRenderer.core.ruler.disable([\n    \"replacements\",\n    \"abbr2\",\n    \"footnote_tail\",\n  ]);\n  markdownRenderer.inline.ruler.disable([\"footnote_ref\", \"htmltag\"]);\n  markdownRenderer.inline.ruler.enable([\"ins\", \"mark\"]);\n  markdownRenderer.block.ruler.disable([\n    \"blockquote\",\n    \"code\",\n    \"fences\",\n    \"footnote\",\n    \"heading\",\n    \"hr\",\n    \"htmlblock\",\n    \"lheading\",\n    \"table\",\n  ]);\n}\n\nexport default markdownRenderer || noMarkdown;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport { getEmojiClassName } from \"../../utils/emojis\";\nimport markdown from \"../../utils/markdown\";\n\nconst markdownTextToHtml = (text) => {\n  let html = null;\n\n  try {\n    html = markdown.render(text);\n  } catch (e) {\n    console.log(\"Markdown error\", e);\n    html = `<span class=\"text-danger\">${I18n.t(\n      \"js.chat.room.message.rendering_error\",\n    )}</span>`;\n  }\n\n  return html;\n};\n\nfunction MessageText({ text }) {\n  const emoji = getEmojiClassName(text);\n\n  return (\n    <div className={\"chat__message_text\"}>\n      <div\n        className={emoji ? emoji : \"inline prose prose-sm break-words\"}\n        dangerouslySetInnerHTML={{ __html: markdownTextToHtml(text) }}\n      />\n    </div>\n  );\n}\n\nMessageText.propTypes = { text: PropTypes.string };\n\n// Check if the MessageText should be rendered again via React.memo HOC\nexport default React.memo(\n  MessageText,\n  (prevProps, nextProps) => prevProps.text == nextProps.text,\n);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport MessageAuthor from \"./MessageAuthor\";\nimport MessageText from \"./MessageText\";\n\nconst QuotedMessage = ({ message }) => (\n  <div className=\"chat__quote rounded\">\n    <MessageAuthor id={message.from.id} name={message.from.name} />\n    <MessageText text={message.text} />\n  </div>\n);\nQuotedMessage.propTypes = {\n  id: PropTypes.string,\n  message: PropTypes.shape({\n    text: PropTypes.string,\n    from: PropTypes.shape(MessageAuthor.propTypes),\n  }),\n};\n\nexport default QuotedMessage;\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nexport const getIcon = (deliveryStatus) => {\n  switch (deliveryStatus) {\n    case \"pushed\":\n      return (\n        <FontAwesomeIcon icon={solid(\"spinner\")} className=\"fa-sm fa-spin\" />\n      );\n    case \"persisted\":\n      return <FontAwesomeIcon icon={solid(\"check\")} className=\"fa-sm\" />;\n    case \"received\":\n      return <FontAwesomeIcon icon={solid(\"check-double\")} className=\"fa-sm\" />;\n    case \"read\":\n      return <FontAwesomeIcon icon={solid(\"check-double\")} className=\"fa-sm\" />;\n    default:\n      return null;\n  }\n};\n\nexport const getTitle = (deliveryStatus) => {\n  switch (deliveryStatus) {\n    case \"pushed\":\n      return \"wird gespeichert\";\n    case \"persisted\":\n      return \"gespeichert\";\n    case \"received\":\n      return \"zugestellt\";\n    case \"read\":\n      return \"gelesen\";\n    default:\n      return null;\n  }\n};\n\nconst MessageDeliveryStatus = ({ deliveryStatus }) => {\n  return (\n    <span\n      className={`chat__delivery_status chat__delivery_status--${deliveryStatus}`}\n      title={getTitle(deliveryStatus)}\n    >\n      {getIcon(deliveryStatus)}\n    </span>\n  );\n};\n\nMessageDeliveryStatus.propTypes = {\n  deliveryStatus: PropTypes.oneOf([\"pushed\", \"persisted\", \"received\", \"read\"]),\n};\n\nexport default MessageDeliveryStatus;\n","import classnames from \"classnames\";\nimport { get, isEmpty } from \"lodash\";\nimport moment from \"moment\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { connect } from \"react-redux\";\nimport { compose } from \"recompose\";\n\nimport { getImageUrl } from \"../../../../selectors/chat/application\";\nimport { getMessageDeliveryStatus } from \"../../../../selectors/chat/messages\";\nimport { getMyId, getMyProfile } from \"../../../../selectors/chat/profile\";\nimport MessageAuthor from \"./MessageAuthor\";\nimport MessageSettings from \"./MessageSettings\";\nimport MessageText from \"./MessageText\";\nimport QuotedMessage from \"./QuotedMessage\";\nimport MessageDeliveryStatus from \"./MessageDeliveryStatus\";\n\nconst MessageDate = ({ date, format, className }) => {\n  const fullDate = moment(date).format(\"DD.MM.YYYY HH:mm\");\n\n  return (\n    <time\n      className={classnames(\"chatMessageDate\", className)}\n      dateTime={fullDate}\n      title={fullDate}\n    >\n      {moment(date).format(format)}\n    </time>\n  );\n};\n\nMessageDate.propTypes = {\n  date: PropTypes.string,\n  format: PropTypes.string,\n  className: PropTypes.string,\n};\n\nconst ChatMessage = ({\n  id,\n  chat_id,\n  text,\n  from,\n  created_at,\n  myMessage,\n  groupedMessage,\n  quoted_message,\n  deliveryStatus,\n}) => (\n  <div\n    className={classnames(\"chat__message group hover:relative focus:relative\", {\n      \"chat__message--my\": myMessage,\n      \"chat__message--grouped\": groupedMessage,\n      \"chat__message--unread\": !myMessage && deliveryStatus === \"received\",\n    })}\n  >\n    <div className=\"chat__bubble_arrow\" />\n    <div className=\"chat__message_header flex gap-2 mb-1 items-center\">\n      <MessageAuthor {...from} />\n    </div>\n    {!isEmpty(quoted_message) ? (\n      <QuotedMessage message={quoted_message} />\n    ) : null}\n    <MessageText text={text} />\n    <div className=\"chat__message_meta text-xs text-muted flex gap-1 items-center\">\n      <MessageDate date={created_at} format=\"HH:mm\" className=\"time\" />\n      {myMessage ? (\n        <MessageDeliveryStatus deliveryStatus={deliveryStatus} />\n      ) : null}\n    </div>\n    <MessageSettings\n      id={id}\n      chatId={chat_id}\n      fromId={from.id}\n      fromDeleted={from.deleted}\n      myMessage={myMessage}\n      className={\n        \"hidden group-hover:block group-focus:block absolute right-0 top-0 drop-shadow\"\n      }\n    />\n  </div>\n);\nChatMessage.propTypes = {\n  id: PropTypes.string,\n  chat_id: PropTypes.string,\n  text: PropTypes.string,\n  from: PropTypes.shape(MessageAuthor.propTypes),\n  quoted_message: PropTypes.object,\n  created_at: PropTypes.string,\n  myMessage: PropTypes.bool,\n  groupedMessage: PropTypes.bool,\n  qoutedMessageId: PropTypes.string,\n  settings: PropTypes.bool,\n  deliveryStatus: PropTypes.oneOf([\"pushed\", \"persisted\", \"received\", \"read\"]),\n};\n\nexport default compose(\n  connect((state, { id, chat_id: chatId, from }) => {\n    const myMessage = from.id === getMyId(state);\n    // From can be undefined in some cases\n    const fromProfile = myMessage ? getMyProfile(state) : from;\n\n    return {\n      myMessage,\n      deliveryStatus: getMessageDeliveryStatus(state, { id, chatId }),\n      from: {\n        ...fromProfile,\n        imageUrl: getImageUrl(state, get(fromProfile, \"image_id\"), \"80x80\"),\n      },\n    };\n  }),\n)(ChatMessage);\n","import React from \"react\";\nimport moment from \"moment\";\n\nconst DaySeparator = ({ date }) => (\n  <section className=\"chat__seperator text-center border-b border-dashed border-neutral text-muted h-3 text-sm mb-5 mt-2\">\n    <span className={\"px-2\"}>{moment(date).format(\"DD.MM.YYYY\")}</span>\n  </section>\n);\n\nexport default DaySeparator;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { flatMap } from \"lodash\";\nimport moment from \"moment\";\n\nimport { getRequestStateForChat } from \"../../../selectors/chat/chat\";\nimport { getMessagesForChat } from \"../../../selectors/chat/messages\";\n\nimport ScrollContainer from \"../shared/ScrollContainer\";\nimport ChatMessage from \"./ChatMessage\";\nimport DaySeparator from \"./DaySeparator\";\nimport classNames from \"classnames\";\n\nconst Chat = ({\n  id,\n  messages,\n  onStartReached,\n  onEndReached,\n  loadingMessages,\n  moreMessagesAvailable,\n}) => {\n  let lastMessageFrom = null;\n  let lastMessageDate = null;\n\n  return (\n    <ScrollContainer\n      id={id}\n      className={classNames(\"grow messagesContainer flex flex-col gap-3 py-3\", {\n        mobile_app_chat_room_android:\n          window.isApp && window.bridge?.isAndroid(),\n        mobile_app_chat_room_ios: window.isApp && window.bridge?.isIOS(),\n      })}\n      onStartReached={onStartReached}\n      onEndReached={onEndReached}\n      callbackThreshold={2}\n      autoscroll\n      autoscrollThreashold={10}\n      startElement={\n        moreMessagesAvailable ? null : (\n          <div className=\"chatNoMoreMessages text-center text-muted text-sm mt-2\">\n            {I18n.t(\"js.chat.room.no_more_messages\")}\n          </div>\n        )\n      }\n    >\n      {loadingMessages ? (\n        <div className=\"chatLoadMessagesIndicator text-center py-2\">\n          <i className=\"fa fa-spinner fa-spin text-muted\" />\n        </div>\n      ) : null}\n      {flatMap(messages, (message, i) => {\n        const result = [];\n        const sameAuthor = lastMessageFrom === message.from.id;\n        const sameDay = moment(message.created_at).isSame(\n          lastMessageDate,\n          \"day\",\n        );\n\n        if (!sameDay) {\n          result.push(\n            <DaySeparator\n              key={message.created_at || `sep+${i}`}\n              date={message.created_at}\n            />,\n          );\n        }\n\n        result.push(\n          <ChatMessage\n            key={message.id || `new+${i}`}\n            groupedMessage={sameAuthor && sameDay}\n            {...message}\n          />,\n        );\n\n        lastMessageFrom = message.from.id;\n        lastMessageDate = moment(message.created_at);\n\n        return result;\n      })}\n    </ScrollContainer>\n  );\n};\nChat.propTypes = {\n  id: PropTypes.string,\n  messages: PropTypes.array,\n  onStartReached: PropTypes.func,\n  onEndReached: PropTypes.func,\n  loadingMessages: PropTypes.bool,\n  moreMessagesAvailable: PropTypes.bool,\n};\n\nexport default connect(\n  (state, { id }) => ({\n    ...getRequestStateForChat(state, { chatId: id }),\n    messages: getMessagesForChat(state, { chatId: id }),\n  }),\n  (dispatch, { id }) => ({\n    onStartReached: () =>\n      dispatch({\n        type: \"chat/CHAT/SCROLL_START_REACHED\",\n        chatId: id,\n      }),\n    onEndReached: () =>\n      dispatch({\n        type: \"chat/CHAT/SCROLL_END_REACHED\",\n        chatId: id,\n      }),\n  }),\n)(Chat);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { isEmpty } from \"lodash\";\n\nimport { getMessageById } from \"../../../../selectors/chat/messages\";\n\nimport MessageAuthor from \"../ChatMessage/MessageAuthor\";\nimport MessageText from \"../ChatMessage/MessageText\";\n\nconst MessageToQuote = ({ message, removeMessageToQuote }) =>\n  !isEmpty(message) ? (\n    <div\n      className={\"relative bg-white gap-2 px-2 py-2 border-b border-neutral\"}\n    >\n      <div className=\"chat__quote rounded\">\n        <MessageAuthor id={message.from.id} name={message.from.name} />\n        <MessageText text={message.text} />\n      </div>\n      <button\n        className=\"btn btn-sm text-muted absolute top-2 right-2\"\n        onClick={removeMessageToQuote}\n      >\n        <i className=\"fa fa-times\" />\n      </button>\n    </div>\n  ) : null;\nMessageToQuote.propTypes = {\n  id: PropTypes.string,\n  chatId: PropTypes.string,\n  message: PropTypes.shape({}),\n  removeMessageToQuote: PropTypes.func,\n};\n\nexport default connect(\n  (state, { id, chatId }) => ({\n    message: getMessageById(state, { id, chatId }),\n  }),\n  (dispatch, { chatId }) => ({\n    removeMessageToQuote: () =>\n      dispatch({ type: \"chat/COMPOSER/SET_MESSAGE_TO_QUOTE\", id: \"\", chatId }),\n  }),\n)(MessageToQuote);\n","import React, { useEffect, useMemo } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { isEmpty, trim, throttle } from \"lodash\";\nimport Textarea from \"react-textarea-autosize\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nimport { getComposerMessageToQuoteId } from \"../../../../selectors/chat/composer\";\nimport { getCanForChat } from \"../../../../selectors/chat/chat\";\nimport MessageToQuote from \"./MessageToQuote\";\nimport classNames from \"classnames\";\nimport { useForm } from \"react-hook-form\";\nimport usePersistentState from \"../../../../hooks/usePersistentSate\";\n\ntype FormData = { text: string };\n\nexport default function MessageComposer({ chatId }: { chatId: string }) {\n  const dispatch = useDispatch();\n  const messageToQuoteId = useSelector((state) =>\n    getComposerMessageToQuoteId(state, { chatId }),\n  );\n  const [composerTextByChatId, setComposerTextByChatId] = usePersistentState(\n    \"composerTextByChatId\",\n    {},\n  );\n\n  const { handleSubmit, register, getValues, setFocus, setValue, reset } =\n    useForm<FormData>();\n\n  const invokeDebounced = useMemo(\n    () =>\n      throttle((text) => {\n        dispatch({ type: \"chat/COMPOSER/SET_TEXT\", chatId, text });\n      }, 1000),\n    [chatId],\n  );\n\n  function changeText(e: { target: { value: string } }) {\n    setComposerTextByChatId({\n      ...composerTextByChatId,\n      [chatId]: e.target.value,\n    });\n    invokeDebounced(e.target.value);\n  }\n\n  function submit({ text }: FormData) {\n    if (isEmpty(trim(text))) {\n      return;\n    }\n\n    dispatch({\n      type: \"chat/SEND_MESSAGE\",\n      meta: { chatId },\n      payload: { text, quoted_message_id: messageToQuoteId },\n    });\n\n    setComposerTextByChatId({ ...composerTextByChatId, [chatId]: \"\" });\n    reset();\n  }\n\n  function onKeyDown(e: React.KeyboardEvent<HTMLTextAreaElement>) {\n    if (e.keyCode == 13) {\n      if (!e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {\n        handleSubmit(submit)(e);\n      }\n    }\n  }\n\n  useEffect(() => {\n    setFocus(\"text\");\n  }, [chatId, messageToQuoteId]);\n\n  useEffect(() => {\n    setValue(\"text\", composerTextByChatId[chatId]);\n  }, [chatId]);\n\n  const can = useSelector((state) => getCanForChat(state, { chatId }));\n  const disabled = can && !can.write; // optimistically enable if we haven't received permissions yet\n\n  return (\n    <div\n      className={classNames(\n        \"messageComposer flex flex-col border-t border-neutral\",\n      )}\n    >\n      <MessageToQuote id={messageToQuoteId} chatId={chatId} />\n      <form onSubmit={handleSubmit(submit)} className={\"flex items-stretch\"}>\n        <Textarea\n          {...register(\"text\", {\n            required: true,\n            onChange: changeText,\n          })}\n          minRows={1}\n          maxRows={8}\n          placeholder={\n            disabled\n              ? I18n.t(\"js.chat.composer.disabled\")\n              : I18n.t(\"js.chat.composer.placeholder\")\n          }\n          onKeyDown={onKeyDown}\n          autoFocus\n          className={\n            \"chat__message-composer grow text-sm rounded-none border-0 border-r border-neutral\"\n          }\n          disabled={disabled}\n        />\n        <button\n          className=\"btn btn-primary btn-sm rounded-none messageComposerAction\"\n          type=\"submit\"\n          disabled={!trim(getValues(\"text\"))}\n        >\n          <FontAwesomeIcon icon={solid(\"paper-plane\")} />\n        </button>\n      </form>\n    </div>\n  );\n}\n","import { get } from \"lodash\";\n\nexport const getComposerMessageToQuoteId = (state, { chatId }) =>\n  get(state, [\"chat\", \"composer\", chatId, \"messageToQuoteId\"]);\n","import { useEffect, useState } from \"react\";\n\nexport default function usePersistentState<T>(key: string, initialValue: T) {\n  const [value, setValue] = useState<T>(() => {\n    const storedValue = localStorage.getItem(key);\n    return storedValue ? JSON.parse(storedValue) : initialValue;\n  });\n\n  useEffect(() => {\n    localStorage.setItem(key, JSON.stringify(value));\n  }, [key, value]);\n\n  return [value, setValue] as const;\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\n\nimport {\n  getChatProfile,\n  getComposingHomie,\n} from \"../../../selectors/chat/chat\";\n\nimport ChatHeader from \"../shared/ChatHeader\";\nimport { BackToRootButton } from \"../shared/BackButton\";\nimport QuickChatSelect from \"./QuickChatSelect\";\nimport ChatRoomSettingsButton from \"./ChatRoomSettingsButton\";\nimport Chat from \"./Chat\";\nimport MessageComposer from \"./MessageComposer\";\n\nconst MobileAppWrapper = ({ children }) => {\n  if (window.isApp) {\n    return <div className={\"flex flex-col h-screen\"}>{children}</div>;\n  } else {\n    return <>{children}</>;\n  }\n};\n\nconst ChatRoom = ({ chatId, name, composingHomie }) => {\n  return (\n    <MobileAppWrapper>\n      <ChatHeader\n        title={name}\n        subtitle={\n          composingHomie\n            ? chatId.indexOf(\"member/\") === 0\n              ? I18n.t(\"js.chat.room.somebody_is_typing\")\n              : I18n.t(\"js.chat.room.member_is_typing\", {\n                  name: composingHomie.name,\n                })\n            : null\n        }\n        chatId={chatId}\n        ButtonLeft={<BackToRootButton chatId={chatId} />}\n        ButtonRight={<ChatRoomSettingsButton chatId={chatId} />}\n      />\n      <Chat id={chatId} />\n      <MessageComposer chatId={chatId} />\n      <QuickChatSelect chatId={chatId} />\n    </MobileAppWrapper>\n  );\n};\nChatRoom.propTypes = {\n  id: PropTypes.string,\n  name: PropTypes.string,\n  composingHomie: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n};\n\nexport default connect((state, { chatId }) => ({\n  ...getChatProfile(state, { chatId }),\n  composingHomie: getComposingHomie(state, { chatId }),\n}))(ChatRoom);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\n\nimport {\n  getUnreadChatsCount,\n  getUnreadChatsCountWithoutChat,\n} from \"../../../selectors/chat/chat\";\nimport Notification from \"./Notification\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nconst BackButton = ({ onClick, counter }) => (\n  <button\n    onClick={onClick}\n    className=\"btn btn-light btn-sm backButton relative\"\n  >\n    <FontAwesomeIcon icon={solid(\"arrow-left\")} />\n    <Notification counter={counter} className={\"!absolute\"} />\n  </button>\n);\nBackButton.propTypes = {\n  counter: PropTypes.number,\n  chatId: PropTypes.string,\n};\n\nconst BackToRootButton = connect(\n  (state, { chatId }) => ({\n    counter: chatId\n      ? getUnreadChatsCountWithoutChat(state, { chatId })\n      : getUnreadChatsCount(state),\n  }),\n  (dispatch) => ({\n    onClick: () =>\n      dispatch({ type: \"chat/NAVIGATE\", payload: { route: \"root\" } }),\n  }),\n)(BackButton);\n\nexport { BackToRootButton };\n\nexport default BackButton;\n","import React, { ReactElement, useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport ChatImage from \"./ChatImage\";\nimport classNames from \"classnames\";\nimport { get } from \"lodash\";\n\ntype ChatHeaderArgs = {\n  chatId: string;\n  title: string;\n  subtitle: string;\n  ButtonLeft: ReactElement;\n  ButtonRight: ReactElement;\n};\n\nexport default function ChatHeader({\n  chatId,\n  title,\n  subtitle,\n  ButtonLeft,\n  ButtonRight,\n}: ChatHeaderArgs) {\n  const chatStatus = useSelector((state) =>\n    get(state, [\"chat\", \"chats\", chatId, \"status\"]),\n  );\n\n  useEffect(() => {\n    if (window.isApp) {\n      // hide navigation in chat\n      const navigation = document.getElementById(\"main-navigation\");\n\n      if (navigation) {\n        navigation.classList.remove(\"tixxt__navigation\"); // remove styles otherwise hidden is overwritten\n        navigation.hidden = true;\n      }\n    }\n  }, []);\n\n  return (\n    <div\n      className={classNames(\n        \"px-3 flex items-center border-b border-neutral gap-3 shrink-0 h-topbar\",\n        {\n          chat__header: !window.isApp,\n          \"fixed left-0 right-0 bg-white border-none z-10\": window.isApp,\n        },\n      )}\n    >\n      {ButtonLeft ? ButtonLeft : null}\n      {chatId ? <ChatImage chatId={chatId} name={title} /> : null}\n      <div\n        className=\"chat__title grow flex flex-col overflow-hidden\"\n        title={title}\n      >\n        <span className=\"font-semibold truncate text-ellipsis text-xl\">\n          {title}\n        </span>\n\n        {subtitle ? (\n          <>\n            <span className=\"subtitle leading-none\">{subtitle}</span>\n          </>\n        ) : chatStatus?.text ? (\n          <span\n            className=\"subtitle leading-none truncate\"\n            title={chatStatus?.text}\n          >\n            {chatStatus?.text}\n          </span>\n        ) : null}\n      </div>\n\n      {ButtonRight ? ButtonRight : null}\n    </div>\n  );\n}\n","import React from \"react\";\n\nexport const OnlineStatus = ({ isOnline, isBusy, children }) => (\n  <div className=\"chat__status relative\">\n    {isBusy ? (\n      <span className=\"busy\">{I18n.t(\"js.chat.member_busy\")}</span>\n    ) : isOnline ? (\n      <span className=\"online\">{I18n.t(\"js.chat.member_online\")}</span>\n    ) : null}\n    {children}\n  </div>\n);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport classnames from \"classnames\";\n\nimport {\n  getChatImageUrl,\n  getChatOnlineStatus,\n  getChatBusyStatus,\n} from \"../../../selectors/chat/chat\";\nimport { OnlineStatus } from \"./OnlineStatus\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nconst ICONS = {\n  member: solid(\"user\"),\n  group: solid(\"users\"),\n};\n\nconst Image = ({ type, imageUrl, name }) =>\n  imageUrl ? (\n    <img\n      className=\"chatImage h-10 w-10 rounded-full\"\n      alt={name}\n      title={name}\n      src={imageUrl}\n    />\n  ) : (\n    <FontAwesomeIcon\n      icon={ICONS[type]}\n      title={name}\n      className={classnames(\n        \"chatIcon h-10 w-10 text-muted flex items-center justify-center fa-xl\",\n      )}\n    />\n  );\n\nImage.propTypes = {\n  type: PropTypes.string,\n  imageUrl: PropTypes.string,\n  name: PropTypes.string,\n};\n\nconst ChatImage = ({ type, imageUrl, name, isOnline, isBusy }) => {\n  return (\n    <div className=\"shrink-0\">\n      <OnlineStatus isOnline={isOnline} isBusy={isBusy}>\n        <Image type={type} name={name} imageUrl={imageUrl} />\n      </OnlineStatus>\n    </div>\n  );\n};\n\nexport default connect((state, { chatId }) => ({\n  imageUrl: getChatImageUrl(state, chatId),\n  isOnline: getChatOnlineStatus(state, chatId),\n  isBusy: getChatBusyStatus(state, chatId)?.type === \"busy\",\n  type: chatId.split(\"/\")[0],\n}))(ChatImage);\n","import React from \"react\";\n\nexport default function Composing() {\n  return (\n    <span className=\"fa-layers absolute leading-none chat__composing\">\n      <i className=\"fa-solid fa-comment text-white\" />\n      <i className=\"fa-regular fa-comment-dots text-muted\" />\n    </span>\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport classnames from \"classnames\";\n\nconst Notification = ({ className, counter }) =>\n  counter ? (\n    <span\n      className={classnames(\n        \"badge rounded-xl bg-unread text-[10px]\",\n        className,\n      )}\n    >\n      {counter === -1\n        ? I18n.t(\"js.chat.notifications.new\")\n        : counter > 99\n          ? \"99+\"\n          : counter}\n    </span>\n  ) : null;\n\nNotification.propTypes = {\n  counter: PropTypes.number,\n};\n\nexport default Notification;\n","import React from \"react\";\nimport { useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport classNames from \"classnames\";\nimport { matchPath, useLocation } from \"helpers/tixxt-router\";\n\ntype GroupNavigationItem = {\n  text: string;\n  link: string;\n  new_window?: boolean;\n  join_request_count?: number;\n  navigation_items?: {\n    text: string;\n    link: string;\n    new_window?: boolean;\n  }[];\n  active_match?: string;\n};\n\nfunction useGroupNavigationItems(groupSlug: string | null | undefined) {\n  return useQuery<GroupNavigationItem[]>(\n    [\"groupNavigationItems\", groupSlug],\n    () => fetchApi(`/groups/${groupSlug}/navigation`),\n    {\n      enabled: !!groupSlug && groupSlug !== \"new\",\n      refetchOnWindowFocus: false,\n    },\n  );\n}\n\n/* Use this if you want to pass the groupSlug in as a prop */\nexport default function GroupNavigation({\n  groupSlug,\n}: {\n  groupSlug?: string | null;\n}) {\n  const { isLoading, data } = useGroupNavigationItems(groupSlug);\n\n  if (!groupSlug) return null;\n\n  return (\n    <ul className={\"group-navigation mb-8 flex flex-wrap flex-stretch\"}>\n      {isLoading\n        ? [\n            I18n.t(\"js.groups.navigation.activities\"),\n            I18n.t(\"js.groups.navigation.members\"),\n            I18n.t(\"js.groups.navigation.calendar\"),\n            I18n.t(\"js.groups.navigation.tasks\"),\n            I18n.t(\"js.groups.navigation.files\"),\n            I18n.t(\"js.groups.navigation.profile\"),\n          ].map((text, i) => <Placeholder key={i}>{text}</Placeholder>)\n        : data?.map((nav, i) => (\n            <NavigationItem key={i} last={i === data.length - 1} {...nav} />\n          ))}\n      <li className={\"flex-1 border-b border-neutral\"} />\n    </ul>\n  );\n}\n\nfunction NavigationItem({\n  text,\n  link,\n  new_window,\n  navigation_items,\n  last,\n  active_match,\n  join_request_count,\n}: GroupNavigationItem & { last?: boolean }) {\n  const location = useLocation();\n  // active_match provided? use this to match\n  const isActive = active_match\n    ? matchPath(active_match, location.pathname)\n    : // Link looks like a module link? Match on prefix, equality otherwise\n      link.match(/^\\/groups\\/.+?\\//)\n      ? location.pathname.indexOf(link) === 0\n      : location.pathname === link;\n  const hasNavigationItems = navigation_items && navigation_items.length > 0;\n\n  return (\n    <li\n      className={classNames(\"flex border-b border-neutral h-8\", {\n        \"pr-4\": !last,\n        dropdown: hasNavigationItems,\n      })}\n    >\n      <a\n        className={classNames(\"muted flex items-center text-sm\", {\n          \"border-b-2 border-primary font-semibold -mb-[1px]\": isActive,\n        })}\n        href={link}\n        data-bs-toggle={hasNavigationItems ? \"dropdown\" : null}\n        target={new_window ? \"_blank\" : undefined}\n        rel=\"noreferrer\"\n      >\n        {text}\n        {hasNavigationItems && <i className={\"fa fa-caret-down fa-xs ml-1\"} />}\n      </a>\n      {hasNavigationItems && (\n        <ul className=\"dropdown-menu\">\n          {navigation_items.map(({ text, link }, i) => (\n            <li key={i}>\n              <a className=\"dropdown-item\" href={link}>\n                {text}\n              </a>\n            </li>\n          ))}\n        </ul>\n      )}\n      {join_request_count ? (\n        <span className=\"ml-1 badge rounded-xl self-center bg-unread text-[10px]\">\n          {join_request_count}\n        </span>\n      ) : null}\n    </li>\n  );\n}\n\nfunction Placeholder({ children }: { children?: React.ReactNode }) {\n  return (\n    <li className={\"flex border-b border-neutral pr-4 h-8\"}>\n      <span className=\"flex items-center text-sm\">\n        <span className={\"inline-block bg-gray-300 animate-pulse rounded-sm\"}>\n          <span className={\"invisible\"}>{children || \"&nbsp;\"}</span>\n        </span>\n      </span>\n    </li>\n  );\n}\n","import React from \"react\";\n\nexport default function Loading() {\n  return (\n    <div className=\"Loading\">\n      <i className=\"fa fa-spinner fa-spin\" />\n    </div>\n  );\n}\n","import React, { ReactNode, useEffect } from \"react\";\nimport { connect } from \"react-redux\";\nimport Async from \"react-select/async\";\nimport { stringify } from \"query-string\";\nimport { map, isEmpty, get, keys, isEqual, filter, forEach } from \"lodash\";\n\nimport { createApiAction } from \"helpers/api\";\nimport { showNameWithProfileField } from \"components/memberships/MemberNameWithAdditions\";\nimport { FieldElement } from \"react-hook-form\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nconst fetchMembers = createApiAction({\n  baseType: \"FETCH_MEMBERS\",\n  endpoint: ({\n    groupSlug,\n    includeConsumers,\n    input,\n    excludeGroupMembersOf,\n    recipientId,\n  }) => {\n    const params = isEqual(input, recipientId) ? {} : { q: input };\n\n    if (includeConsumers) Reflect.set(params, \"include_consumers\", true);\n    if (!isEmpty(excludeGroupMembersOf))\n      Reflect.set(params, \"exclude_group_members_of\", excludeGroupMembersOf);\n\n    return [\n      groupSlug ? `/groups/${groupSlug}` : null,\n      `/members?`,\n      stringify(params),\n    ].join(\"\");\n  },\n});\n\nconst fetchMembersAndGroups = createApiAction({\n  baseType: \"FETCH_MEMBERS_AND_GROUPS\",\n  endpoint: ({ input, recipientId, includeMembershipRoles = false }) =>\n    `/directory?${\n      isEqual(input, recipientId)\n        ? \"\"\n        : stringify({\n            q: input,\n            include_membership_roles: includeMembershipRoles,\n          })\n    }`,\n});\n\nconst optionsKey = (key) => {\n  switch (key) {\n    case (key = \"member\"):\n      return I18n.t(\"js.member_select.options.key.member\");\n    case (key = \"group\"):\n      return I18n.t(\"js.member_select.options.key.group\");\n    default:\n      return key;\n  }\n};\n\ntype options = Array<{\n  value: string | undefined;\n  label: Array<React.ReactNode>;\n  type: string;\n}>;\nconst groupOptions = (options: options) => {\n  const groupedOptions = {\n    member: [] as options,\n    group: [] as options,\n    other: [] as options,\n  };\n\n  forEach(options, (option) => {\n    switch (option.type) {\n      case \"member\":\n        groupedOptions[\"member\"].push(option);\n        break;\n      case \"membershipRole\":\n      case \"group\":\n        groupedOptions[\"group\"].push(option);\n        break;\n      default:\n        groupedOptions[\"other\"].push(option);\n    }\n  });\n  return groupedOptions;\n};\n\ntype Entries = Entry[];\ntype Entry = {\n  type: string;\n  name: string;\n  membership_roles: MembershipRole[];\n};\n\nexport type Value = {\n  value?: string;\n  label?: string | ReactNode[];\n  type?: string;\n};\n\ntype MembershipRole = {\n  type: string;\n  name: string;\n  membership_status_of_current_member?: string;\n  id?: string;\n  detection_profile_field?: string;\n  is_external?: boolean;\n};\n\nconst mergeEntries = (entries: Entries) => {\n  const mergedEntries: Entries[number][\"membership_roles\"][number][] = [];\n\n  forEach(entries, (entry) => {\n    if (entry.type === \"group\") {\n      const name = `${entry.name} (${I18n.t(\n        \"js.member_select.all_group_members\",\n      )})`;\n      mergedEntries.push({ ...entry, name });\n\n      if (entry.membership_roles && entry.membership_roles.length > 0) {\n        forEach(entry.membership_roles, (membershipRole) => {\n          const name = entry.name + \" - \" + membershipRole.name;\n          mergedEntries.push({ ...membershipRole, name });\n        });\n      }\n    } else {\n      mergedEntries.push(entry);\n    }\n  });\n  return mergedEntries;\n};\n\ninterface MemberSelectTypes {\n  groupSlug?: string;\n  includeConsumers?: boolean;\n  includeMembershipRoles?: boolean;\n  excludeGroupMembersOf?: string;\n\n  fetchMembers?(...args: unknown[]): Promise<{\n    payload: Array<{\n      displayName: string;\n      id: string;\n      name: string;\n      detection_profile_field: string;\n      is_external: boolean;\n    }>;\n  }>;\n\n  fetchMembersAndGroups?(...args: unknown[]): Promise<unknown>;\n\n  input?: {\n    onChange: (selectedEntries: Value[]) => void;\n    onBlur?(...args: unknown[]): unknown;\n    value?: Value[] | undefined;\n  };\n  onChange?: (selectedEntries: Value[]) => void;\n  multi: boolean;\n  membersAndGroups?: boolean;\n  className?: string;\n  wrapperStyle?: Record<PropertyKey, string>;\n  value?: Value[] | undefined;\n  recipientId?: string;\n  onlyMyGroups?: boolean;\n  id?: string;\n  field?: FieldElement;\n}\n\nfunction MemberSelect(props: MemberSelectTypes) {\n  // Local fetch through redux api middleware for now\n  // Can be optimized later i.e. by using redux state to memoize stuff\n  function loadOptions(input): Promise<unknown> {\n    return new Promise((resolve, reject) => {\n      const {\n        groupSlug,\n        includeConsumers,\n        includeMembershipRoles,\n        excludeGroupMembersOf,\n        recipientId,\n        onlyMyGroups,\n      } = props;\n      props.membersAndGroups\n        ? props\n            .fetchMembersAndGroups?.({\n              input,\n              recipientId,\n              includeMembershipRoles,\n            })\n            .then((success) => {\n              if (!success) {\n                return reject(\"error\");\n              }\n\n              const entries = get(\n                success,\n                \"payload.entries\",\n              ) as unknown as Entries;\n\n              const mergedEntries = mergeEntries(entries);\n\n              const mappedOptions = map(\n                onlyMyGroups\n                  ? filter(mergedEntries, (e) =>\n                      e.membership_status_of_current_member\n                        ? isEqual(\n                            e.membership_status_of_current_member,\n                            \"member\",\n                          )\n                        : e,\n                    )\n                  : mergedEntries,\n                (entry: MembershipRole) => {\n                  if (recipientId && isEqual(entry.id, recipientId)) {\n                    props.input?.onChange?.([\n                      {\n                        value: entry.id,\n                        label: [\n                          <FontAwesomeIcon key=\"icon\" icon={regular(\"user\")} />,\n                          \" \",\n                          entry.name,\n                        ],\n                        type: \"member\",\n                      },\n                    ]);\n                  }\n\n                  const icon = {\n                    member: regular(\"user\"),\n                    group: regular(\"users\"),\n                    standard: regular(\"chevron-right\"),\n                  };\n\n                  return {\n                    value: entry.id,\n                    label: [\n                      <FontAwesomeIcon\n                        key=\"icon\"\n                        icon={icon[entry.type || \"standard\"]}\n                      />,\n                      \" \",\n                      showNameWithProfileField({\n                        name: entry.name,\n                        detectionProfileField: entry.detection_profile_field,\n                        isExternal: entry.is_external,\n                      }),\n                    ],\n                    type: entry.type,\n                  };\n                },\n              );\n\n              const groupedOptions = groupOptions(\n                mappedOptions as unknown as {\n                  value: string | undefined;\n                  label: React.ReactNode[];\n                  type: string;\n                }[],\n              );\n\n              const options = map(keys(groupedOptions), (key) => ({\n                label: optionsKey(key),\n                options: groupedOptions[key],\n              }));\n\n              resolve(options);\n            })\n            .catch(reject)\n        : props\n            .fetchMembers?.({\n              groupSlug,\n              includeConsumers,\n              input,\n              excludeGroupMembersOf,\n              recipientId,\n            })\n            .then((success) => {\n              if (!success) {\n                return reject(\"error\");\n              }\n\n              const options = map(success.payload, (m) => {\n                if (isEqual(m.id, recipientId)) {\n                  props.input?.onChange?.([\n                    { value: m.id, label: m.displayName },\n                  ]);\n                }\n                return {\n                  value: m.id,\n                  label: showNameWithProfileField({\n                    name: m.displayName,\n                    detectionProfileField: m.detection_profile_field,\n                    isExternal: m.is_external,\n                  }),\n                };\n              });\n\n              resolve(options);\n            })\n            .catch(reject);\n    });\n  }\n\n  useEffect(() => {\n    if (props.recipientId) loadOptions(props.recipientId);\n  }, []);\n\n  const { input, multi, wrapperStyle, id, field, ...selectProps } = props;\n  const asyncPropsOptions = {\n    ...selectProps,\n    isMulti: multi,\n    loadOptions,\n    placeholder: I18n.t(\"js.member_select.placeholder\"),\n    loadingMessage: () => I18n.t(\"js.plugins.select2.searching\"),\n    noOptionsMessage: ({ inputValue }) =>\n      isEmpty(inputValue)\n        ? I18n.t(\"js.plugins.select2.enter_more_characters.one\")\n        : I18n.t(\"js.plugins.select2.no_match\"),\n    inputId: id,\n  };\n  if (input) {\n    // for use with redux form\n    return (\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore: Should be rewritten\n      <Async\n        {...asyncPropsOptions}\n        {...input}\n        onBlur={() => input?.onBlur?.(input.value)}\n        openMenuOnFocus\n        styles={{\n          container: (base) => ({ ...base, ...wrapperStyle, \"z-index\": 3 }),\n        }}\n      />\n    );\n  } else {\n    // for use without redux form\n    return (\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore: Should be rewritten\n      <Async\n        {...asyncPropsOptions}\n        {...field}\n        styles={{\n          container: (base) => ({ ...base, ...wrapperStyle, \"z-index\": 3 }),\n          input: (base) => ({ ...base, \"box-shadow\": \"none\" }),\n        }}\n      />\n    );\n  }\n}\n\nexport default connect(null, { fetchMembers, fetchMembersAndGroups })(\n  MemberSelect,\n);\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { range } from \"lodash\";\nimport { parse, stringify } from \"query-string\";\n\n// Example:\n// page: 10, totalPages: 20, width: 3\n// => min: 10-3-1 => 6\n// => max: 10+3 => 13\n// => range: 0,1,2,3,4,5,6,7,8,9,\"10\",11,12,13,14,15,16,17,18,19,20\n// => slice: min, max => 6,13 => 6,7,8,9,10,11,12\n// => plusOne: 7,8,9,\"10\",11,12,13\n// => add null (for ...)\n// final window: null,7,8,9,\"10\",11,12,13,null\nconst plusOne = (i) => i + 1;\nconst pages = ({ page, totalPages, width = 3 }) => {\n  const cappedPage = Math.min(page, totalPages); // in case we ended up on page greater than total page count\n  const min = Math.max(0, cappedPage - width - 1);\n  const max = Math.min(totalPages, cappedPage + width);\n  const window = range(0, totalPages).slice(min, max).map(plusOne);\n  if (window.length === 0) {\n    window.push(1);\n  }\n  if (max < totalPages) {\n    window.push(null);\n  }\n  if (min > 0) {\n    window.unshift(null);\n  }\n  return window;\n};\n\ninterface PaginationButtonTypes {\n  disabled: boolean;\n  active?: boolean;\n  page: number;\n\n  onPaginate(...args: unknown[]): unknown;\n\n  children?: React.ReactNode;\n}\n\nfunction PaginationButton({\n  disabled,\n  active,\n  page,\n  onPaginate,\n  children,\n}: PaginationButtonTypes) {\n  const query = stringify({ ...parse(location.search), page });\n  const className = classNames(\"btn btn-light border-0\", { disabled, active });\n\n  return (\n    <li>\n      {active || disabled ? (\n        <span className={className}>{children}</span>\n      ) : (\n        <a\n          className={className}\n          href={\n            (location.pathname === \"/\" ? \"\" : location.pathname) + `?${query}`\n          }\n          onClick={onPaginate}\n          data-page={page}\n        >\n          {children}\n        </a>\n      )}\n    </li>\n  );\n}\n\ntype PaginationProps = {\n  page: number;\n  totalPages?: number;\n  onPaginate: (page: number) => void;\n  loading: boolean;\n  width?: number;\n  hideIfEmpty?: boolean;\n  className?: string;\n};\n\nfunction Pagination({\n  page,\n  totalPages = 1,\n  onPaginate,\n  loading,\n  width = 2,\n  hideIfEmpty,\n  className,\n}: PaginationProps) {\n  const handlePaginate = (event) => {\n    event.preventDefault();\n    onPaginate(event.currentTarget.dataset.page * 1);\n    window.scrollTo({ top: 0 });\n  };\n\n  if (hideIfEmpty && totalPages && totalPages <= 1) return null;\n\n  return (\n    <ul className={classNames(\"pagination flex\", className)}>\n      <PaginationButton\n        disabled={loading || page === 1}\n        page={1}\n        onPaginate={handlePaginate}\n      >\n        <i className=\"fa fa-pipe mr-0.5\" />\n        <i className=\"fa fa-angle-left\" />\n      </PaginationButton>\n      <PaginationButton\n        disabled={loading || page === 1}\n        page={page - 1}\n        onPaginate={handlePaginate}\n      >\n        <i className=\"fa fa-angle-left\" />\n      </PaginationButton>\n\n      {pages({ page, totalPages, width }).map((n, index) => (\n        <PaginationButton\n          key={n || `null${index}`}\n          active={n === page}\n          page={n}\n          disabled={loading || n === null}\n          onPaginate={handlePaginate}\n        >\n          {loading && n === page ? (\n            <i className=\"fa fa-spinner fa-spin w-4\" />\n          ) : n === null ? (\n            <i className={\"fa fa-ellipsis w-4\"} />\n          ) : (\n            <span className={\"inline-block w-4\"}>{n}</span>\n          )}\n        </PaginationButton>\n      ))}\n\n      <PaginationButton\n        disabled={loading || page >= totalPages}\n        page={page + 1}\n        onPaginate={handlePaginate}\n      >\n        <i className=\"fa fa-angle-right\" />\n      </PaginationButton>\n      <PaginationButton\n        disabled={loading || page >= totalPages}\n        page={totalPages}\n        onPaginate={handlePaginate}\n      >\n        <i className=\"fa fa-angle-right\" />\n        <i className=\"fa fa-pipe ml-0.5\" />\n      </PaginationButton>\n    </ul>\n  );\n}\n\nexport default Pagination;\n","import React, { useRef, useEffect } from \"react\";\nimport \"../../../../vendor/assets/javascripts/spectrum/spectrum.css\";\n\ninterface SpectrumProps {\n  value: string;\n  showPalette?: boolean;\n  colorPalette?: any;\n  name?: string;\n  onChange: (props: { target: { value: string } }) => void;\n}\n\nfunction Spectrum(props: SpectrumProps) {\n  const ref = useRef(null);\n  let el;\n\n  useEffect(() => {\n    if (!el && ref.current) {\n      el = $(ref.current);\n      el.spectrum({\n        showInput: true,\n        preferredFormat: \"hex\",\n        showInitial: true,\n        showPalette: !!props.showPalette,\n        palette: props.colorPalette,\n        cancelText: I18n.t(\"plugins.spectrum.cancel\"),\n        chooseText: I18n.t(\"plugins.spectrum.choose\"),\n        change: (color) =>\n          props.onChange({\n            target: {\n              value: color.toHexString(),\n            },\n          }),\n\n        color: props.value,\n      });\n    } else {\n      el.spectrum(\"set\", props.value);\n    }\n    return () => el.spectrum(\"destroy\");\n  }, [ref.current, props.value]);\n\n  return (\n    <div>\n      <input\n        type=\"color\"\n        ref={ref}\n        name={props.name}\n        value={props.value}\n        onChange={props.onChange}\n      />\n    </div>\n  );\n}\n\nexport default Spectrum;\n","import React from \"react\";\nimport { map, get } from \"lodash\";\nimport classnames from \"classnames\";\n\ninterface TabBarProps {\n  tabs: Array<{\n    label: string;\n    required?: boolean;\n    error?: Error;\n  }>;\n  className?: string;\n  selectTabIndex: (val: number) => void;\n  selectedTabIndex: number;\n}\n\nfunction TabBar({\n  tabs,\n  selectTabIndex,\n  selectedTabIndex,\n  className,\n}: TabBarProps) {\n  return (\n    <nav className={className}>\n      <ul className=\"layout-tabs nav nav-tabs\">\n        {map(tabs, (tab, i) => (\n          <li\n            key={i}\n            className={classnames({ active: selectedTabIndex === i })}\n          >\n            <a\n              href=\"#\"\n              onClick={(e) => {\n                e.preventDefault();\n                selectTabIndex(i);\n              }}\n              className={classnames({ \"alert-error\": get(tab, \"error\") })}\n            >\n              {get(tab, \"label\")}{\" \"}\n              {get(tab, \"required\") ? (\n                <abbr title={I18n.t(\"js.required\")}>*</abbr>\n              ) : null}\n            </a>\n          </li>\n        ))}\n      </ul>\n    </nav>\n  );\n}\n\nexport default TabBar;\n","import React from \"react\";\nimport { Field } from \"redux-form\";\nimport ControlGroup from \"./ControlGroup\";\nimport Hint from \"./Hint\";\n\ninterface TextFieldProps {\n  name: string;\n  label?: string;\n  required?: boolean;\n  multiline?: boolean;\n  className?: string;\n  hint?: string;\n  disabled?: boolean;\n  placeholder?: string;\n\n  onChange?(...args: unknown[]): unknown;\n}\n\nfunction TextField({\n  name,\n  label,\n  required,\n  multiline,\n  className,\n  hint,\n  ...fieldProps\n}: TextFieldProps) {\n  return (\n    <ControlGroup\n      name={name}\n      label={label}\n      required={required}\n      className=\"text-property\"\n    >\n      <Field\n        name={name}\n        type={multiline ? undefined : \"text\"}\n        component={multiline ? \"textarea\" : \"input\"}\n        required={required}\n        className={className}\n        {...fieldProps}\n      />\n      <Hint hint={hint} />\n    </ControlGroup>\n  );\n}\n\nexport default TextField;\n","import React from \"react\";\nimport { Provider } from \"react-redux\";\n\nconst wrapProvider = (store) => (Component) => {\n  const wrapped = function (props) {\n    return (\n      <Provider store={store}>\n        <Component {...props} />\n      </Provider>\n    );\n  };\n\n  wrapped.displayName = `Provider(${Component.name})`;\n\n  return wrapped;\n};\n\nexport default wrapProvider;\n","import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport connectBackbone from \"./connectBackbone\";\nimport { Wrapper } from \"helpers/queryClient\";\n\nconst createHandleClose = (view, rawEl) => () => {\n  const el = rawEl || \"VIEW_ROOT\";\n  const root = view._reactRoots[el];\n\n  if (root) {\n    // debug(\"UNMOUNT component at\", el || \"view root\");\n    view._reactRoots[el] = null;\n    root.unmount();\n  }\n\n  return view;\n};\n\nconst createHandleRender = (view, rawEl, component) => () => {\n  const el = rawEl || \"VIEW_ROOT\";\n  const $container = rawEl ? view.$(rawEl) : view.$el;\n  let root;\n\n  if (rawEl) {\n    // root el is inside of rendered view and thus recreated on render\n    const oldRoot = view._reactRoots[el];\n    if (oldRoot) oldRoot.unmount();\n    view._reactRoots[el] = root = createRoot($container.get(0));\n  } else {\n    // root is equal to view.el which stays the same on renders so we can keep the root\n    root = view._reactRoots[el];\n    if (!root) root = view._reactRoots[el] = createRoot($container.get(0));\n  }\n\n  // debug(\"MOUNT\", getDisplayName(component), \"at\", el);\n  root.render(\n    React.createElement(Wrapper, null, React.createElement(component)),\n  );\n\n  return view;\n};\n\nconst createAdaptBackboneView = () => {\n  let componentsMap = {};\n\n  const adaptBackboneView = ({\n    view,\n    el,\n    component: componentName,\n    mapProps,\n    listenTo,\n    standalone = false,\n  }) => {\n    const component = componentsMap[componentName];\n    if (component === undefined) {\n      throw new Error(\n        `No component named \"${componentName}\" registered for adapter usage.`,\n      );\n    }\n\n    const connectedComponent = connectBackbone({ view, mapProps, listenTo })(\n      component,\n    );\n\n    // Store react roots\n    view._reactRoots = view._reactRoots || {};\n\n    const handleRender = createHandleRender(view, el, connectedComponent);\n    const handleClose = createHandleClose(view, el);\n\n    if (standalone) {\n      view.render = handleRender;\n      view.close = handleClose;\n    } else {\n      view.on(\"render\", handleRender);\n      view.once(\"close\", () => {\n        view.off(\"render\", handleRender);\n        handleClose();\n      });\n    }\n  };\n  componentsMap.componentsMap = componentsMap;\n\n  adaptBackboneView.addComponents = (extraComponentMap) => {\n    componentsMap.componentsMap = componentsMap = {\n      ...componentsMap,\n      ...extraComponentMap,\n    };\n  };\n\n  return adaptBackboneView;\n};\n\nexport default createAdaptBackboneView;\n","import React, { Component } from \"react\";\nimport { debounce, each } from \"lodash\";\n\nexport function getDisplayName(WrappedComponent) {\n  return WrappedComponent.displayName || WrappedComponent.name || \"Component\";\n}\n\nexport default function connectBackbone({\n  mapProps,\n  listenTo,\n  debounce: debounceTime = 10,\n}) {\n  return function wrapWithConnect(WrappedComponent) {\n    const MemoizedWrappedComponent = React.memo(WrappedComponent);\n\n    class Connect extends Component {\n      constructor(props, context) {\n        super(props, context);\n\n        this.state = Connect.getDerivedStateFromProps(this.props);\n      }\n\n      static getDerivedStateFromError() {\n        // Update state so the next render will show the fallback UI.\n        return { hasError: true };\n      }\n\n      componentDidCatch(error, errorInfo) {\n        // You can also log the error to an error reporting service\n        console.error(\"TixxtErrorBoundary to the rescue\", error, errorInfo);\n      }\n\n      componentDidMount() {\n        this.trySubscribe();\n      }\n\n      componentWillUnmount() {\n        this.tryUnsubscribe();\n      }\n\n      trySubscribe() {\n        if (!this.unsubscribe) {\n          // Bind change events for each tracked entity (i.e. model and/or collection)\n          const changeHandler = debounce(\n            this.handleChange.bind(this),\n            debounceTime,\n          );\n          each(listenTo, (entity) => {\n            if (!entity) {\n              throw new Error(`Undefined/null listenTo entity given`);\n            }\n            entity.on(\"change add remove reset sync sort\", changeHandler, this);\n          });\n\n          this.unsubscribe = () => {\n            each(listenTo, (entity) => entity.off(null, changeHandler, this));\n          };\n\n          this.handleChange();\n        }\n      }\n\n      tryUnsubscribe() {\n        if (this.unsubscribe) {\n          this.unsubscribe();\n          this.unsubscribe = null;\n        }\n      }\n\n      handleChange() {\n        if (!this.unsubscribe) {\n          return;\n        }\n        mapProps && this.setState({ entityState: mapProps(this.props) });\n      }\n\n      static getDerivedStateFromProps(props) {\n        return mapProps ? { entityState: mapProps(props) } : {};\n      }\n\n      render() {\n        /*if (this.state.hasError) {\n          return null; // Something went wrong\n        }*/\n\n        const propsToPass = { ...this.props, ...this.state.entityState };\n        return <MemoizedWrappedComponent {...propsToPass} />;\n      }\n    }\n\n    Connect.displayName = `ConnectBackbone(${getDisplayName(\n      MemoizedWrappedComponent,\n    )})`;\n    Connect.WrappedComponent = MemoizedWrappedComponent;\n\n    return Connect;\n  };\n}\n","import createAdaptBackboneView from \"./backbone/createAdaptBackboneView\";\n\nconst adaptBackboneView = createAdaptBackboneView();\n\nexport default adaptBackboneView;\n","import React from \"react\";\nimport { QueryClientProvider, QueryClient, QueryCache } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nconst queryCache = new QueryCache();\nconst queryClient = new QueryClient({\n  queryCache,\n  defaultOptions: {\n    queries: {\n      queryFn: async ({ queryKey }) => fetchApi(queryKey[0]),\n    },\n  },\n});\n\nfunction Wrapper({ children }: { children: React.ReactNode }) {\n  return (\n    <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n  );\n}\n\nwindow.queryClient = queryClient;\n\nexport default queryClient;\nexport { queryClient, queryCache, Wrapper };\n","import { match } from \"path-to-regexp\";\nimport { map, memoize } from \"lodash\";\nimport { CompiledRoute, RouteObject } from \"helpers/tixxt-router\";\n\nexport type Params = {\n  [key: string]: string | undefined;\n};\n\nconst WILDCARD_END = /\\/?\\*$/;\n\nfunction compileRoute(path: string) {\n  const endsWithWildcard = WILDCARD_END.exec(path);\n  let pathToCompile = path;\n  if (endsWithWildcard) pathToCompile = path.slice(0, endsWithWildcard.index);\n  const matchFn = match<Params>(pathToCompile, {\n    end: endsWithWildcard === null,\n  });\n  return { path, match: matchFn };\n}\n\nfunction compileRoutes(routes: RouteObject[]): CompiledRoute[] {\n  return map(routes, ({ path, element, forceTurbo }) => {\n    try {\n      return { ...compileRoute(path), element, forceTurbo };\n    } catch (e) {\n      console.error(\"while compiling path:\", path);\n      throw e;\n    }\n  });\n}\n\nexport const compileRouteMemoized = memoize(compileRoute);\nexport const compileRoutesMemoized = memoize(compileRoutes);\n","import React, { useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { MatchFunction, MatchResult } from \"path-to-regexp\";\nimport { isEqual, isNumber, isString, noop } from \"lodash\";\nimport {\n  compileRouteMemoized,\n  compileRoutesMemoized,\n  Params,\n} from \"helpers/tixxt-router/compilation\";\nimport \"helpers/tixxt-router/history-events\";\nimport invariant from \"invariant\";\nimport { Group } from \"../@types\";\n\nexport type NavigateFunction = (\n  to: URL | string | number,\n  options?: { replace?: boolean; state?: object },\n) => void;\n\nexport type RouteObject = {\n  path: string;\n  element: JSX.Element | null;\n  // Force navigation with turbo when this route is matched, useful if backend runs code on access\n  forceTurbo?: boolean;\n};\nexport type CompiledRoute = {\n  forceTurbo?: boolean;\n  path: string;\n  match: MatchFunction<Params>;\n  element: JSX.Element | null;\n};\n\nexport type MatchedRoute = MatchResult<Params> & {\n  element: JSX.Element | null;\n  forceTurbo?: boolean;\n};\n\n// Helper to build locationState from window.location\nfunction getLocationState() {\n  return {\n    pathname: location.pathname,\n    search: location.search,\n    hash: location.hash,\n    state: history.state,\n  };\n}\n\n// Returns the params in a (sub-)component that was determined with useRoutes\nexport function useParams(): Params {\n  return useContext(ParamsContext);\n}\n\n// Returns a tuple of URLSearchParams and a noop setSearchParams function, which is only returned for legacy reasons\n// Please use navigate to change the searchParams explicitly\nexport function useSearchParams(): [\n  URLSearchParams,\n  (URLSearchParams) => void,\n] {\n  const location = useLocation();\n\n  const result = useMemo<[URLSearchParams, (URLSearchParams) => void]>(\n    () => [new URLSearchParams(location.search), noop],\n    [location.search],\n  );\n\n  return result;\n}\n\n// The function to trigger a SPA navigation\n// Should only receive routes that are handled by TixxtContent\n// This should only be used for redirects, for user navigation use regular links (or GET-forms)\nexport const navigate: NavigateFunction = (to, options) => {\n  if (!window.Turbo?.session.drive) {\n    debug(\"⚛️ navigate LEGACY\", to.toString(), options);\n    invariant(\n      isString(to),\n      \"`to` param must be String when using navigate outside of SPA frontend\",\n    );\n    window.location.assign(to);\n    return;\n  }\n\n  if (navigateToUnjoinedGroup(to.toString())) {\n    window.location.assign(to.toString());\n    return;\n  }\n\n  debug(\"⚛️ navigate\", to.toString(), options);\n  if (isNumber(to)) {\n    history.go(to);\n  } else {\n    const fn = options?.replace ? history.replaceState : history.pushState;\n    fn(options?.state, \"\", to);\n  }\n};\n\nfunction navigateToUnjoinedGroup(to: string) {\n  let url;\n  try {\n    url = new URL(to.toString());\n  } catch (_) {\n    return false;\n  }\n\n  const pathnameParts = url.pathname.split(\"/\");\n  const groupSlugInPath =\n    pathnameParts[1] === \"groups\" ? pathnameParts[2] : null;\n\n  if (!groupSlugInPath) return false;\n\n  return !(\n    Preload.my_groups.find((group: Group) => group.slug === groupSlugInPath) !=\n    null\n  );\n}\n\n// Reimplementation of react-router useNavigate\n// You can import and use navigate directly if you fancy\nexport function useNavigate() {\n  return navigate;\n}\n\n// Can be used to find a matching route for a given path\n// Is used to determine if a path can be handled by TixxtContent or should go through turbo\nexport function matchRoutes(\n  routes: RouteObject[],\n  path: string,\n): MatchedRoute | null {\n  const compiledRoutes = compileRoutesMemoized(routes);\n\n  let matchResult: MatchedRoute | null = null;\n  for (const route of compiledRoutes) {\n    const result = route.match(path);\n    if (result) {\n      matchResult = {\n        ...result,\n        element: route.element,\n        forceTurbo: route.forceTurbo,\n      };\n      break;\n    }\n  }\n\n  return matchResult;\n}\n\nconst defaultParams = {};\nconst ParamsContext = React.createContext<Params>(defaultParams);\nconst LocationContext = React.createContext(getLocationState());\n\n// Main hook to use routes in components\n// Returns the element of the first matching route wrapped in params provider\nexport function useRoutes(routes: RouteObject[]): JSX.Element | null {\n  const { pathname } = useLocation();\n  const matchedRoute = matchRoutes(routes, pathname);\n\n  const lastParams = useRef<Params>(defaultParams);\n  if (!isEqual(lastParams, matchedRoute?.params)) {\n    lastParams.current = matchedRoute?.params || defaultParams;\n  }\n\n  if (!matchedRoute?.element) return null;\n\n  return (\n    <ParamsContext.Provider value={lastParams.current}>\n      {matchedRoute.element}\n    </ParamsContext.Provider>\n  );\n}\n\n// Returns true if the given path matches the given pattern, false otherwise\n// Good if you want to mark an element active depending on the current path\nexport function matchPath(pattern: string, path: string): boolean {\n  return !!compileRouteMemoized(pattern).match(path);\n}\n\ntype BrowserRouterProps = {\n  children?: React.ReactNode;\n};\n// Single source of location state\nexport const BrowserRouter: React.FC<BrowserRouterProps> = ({ children }) => {\n  const [locationState, setLocationState] = useState(getLocationState);\n\n  useEffect(() => {\n    function updateLocationState() {\n      const maybeNewLocationState = getLocationState();\n      if (!isEqual(maybeNewLocationState, locationState)) {\n        setLocationState(maybeNewLocationState);\n      }\n    }\n\n    const events = [\n      \"popstate\",\n      \"hashchange\",\n      \"tixxt:pushstate\",\n      \"tixxt:replacestate\",\n    ];\n    for (const event of events)\n      window.addEventListener(event, updateLocationState);\n\n    // RedirectToStartpage navigates before eventListener is bound but after default state is set\n    updateLocationState();\n\n    return () => {\n      for (const event of events)\n        window.removeEventListener(event, updateLocationState);\n    };\n  }, [locationState]);\n\n  return (\n    <LocationContext.Provider value={locationState}>\n      {children}\n    </LocationContext.Provider>\n  );\n};\n\n// Hook to get current location state and trigger rerender when it changes\nexport function useLocation() {\n  return useContext(LocationContext);\n}\n","// Add pushState and popState events to window so we can listen to them in useLocation\n// inspiration: https://stackoverflow.com/questions/5129386/how-to-detect-when-history-pushstate-and-history-replacestate-are-used\nfunction addEventDispatch(orig, type) {\n  return function (...args) {\n    const result = orig.apply(history, args);\n    const event = new Event(type);\n    event[\"arguments\"] = args;\n    window.dispatchEvent(event);\n    return result;\n  };\n}\nexport const originalPushState = history.pushState;\nexport const originalReplaceState = history.replaceState;\n\nhistory.pushState = addEventDispatch(history.pushState, \"tixxt:pushstate\");\nhistory.replaceState = addEventDispatch(\n  history.replaceState,\n  \"tixxt:replacestate\",\n);\n","import { useEffect, useState } from \"react\";\nimport { useLocation, useParams } from \"helpers/tixxt-router\";\n\nfunction useQueryParams(): Record<PropertyKey, unknown> {\n  console.warn(\n    \"useQueryParams can be replaced with useSearchParams from helpers/tixxt-router\",\n  );\n  const location = useLocation();\n  const params = useParams();\n  const [queryParam, setQueryParam] = useState(getQueryParams);\n\n  useEffect(() => setQueryParam(getQueryParams), [location]);\n\n  return queryParam;\n\n  function getQueryParams() {\n    if (\"URLSearchParams\" in window) {\n      return {\n        ...params,\n        ...Object.fromEntries(new URLSearchParams(location.search)),\n        ...(location.state ? { state: location.state } : {}),\n      };\n    } else {\n      return {\n        ...params,\n        ...getQueryObject(location.search),\n        ...(location.state ? { state: location.state } : {}),\n      };\n    }\n  }\n}\n\nfunction getQueryObject(search: string) {\n  return (search.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(function (\n    state: Record<PropertyKey, unknown>,\n    curr,\n  ) {\n    const [key, value] = curr.split(\"=\");\n    state[key] = value;\n    return state;\n  }, {});\n}\n\nexport { useQueryParams };\n","import { useEffect, useState } from \"react\";\n\nexport function useMaxHeight() {\n  const [style, setStyle] = useState({});\n\n  useEffect(() => {\n    function updateStyle() {\n      setStyle({ maxHeight: `${window.innerHeight}px` });\n    }\n\n    updateStyle();\n    window.addEventListener(\"resize\", updateStyle);\n    return () => {\n      window.removeEventListener(\"resize\", updateStyle);\n    };\n  }, []);\n\n  return style;\n}\n","import { isUndefined, memoize, some } from \"lodash\";\n\nconst CHAT_STATIC_BREAKPOINT = 1884;\n\ndocument.addEventListener(\n  \"click\",\n  function (e) {\n    if (!(e.target instanceof HTMLElement || e.target instanceof SVGElement))\n      return;\n\n    // togglebar element clicked directly\n    if (e.target?.dataset?.togglebar) {\n      toggle(e.target.dataset.togglebar);\n      return;\n    }\n\n    // togglebar child clicked check\n    for (\n      let target: Node | null = e.target;\n      target && target !== document;\n      target = target.parentNode\n    ) {\n      if (target instanceof HTMLButtonElement && target?.dataset?.togglebar) {\n        toggle(target.dataset.togglebar);\n        break;\n      }\n    }\n  },\n  false,\n);\n\nfunction coversWholeScreen(el: HTMLElement) {\n  return window.getComputedStyle(el).width === `${window.innerWidth}px`;\n}\n\nfunction shouldRestoreBodyScrolling() {\n  return !some(Array.from(openBarElements), coversWholeScreen);\n}\n\nconst openBarElements = new Set();\n\nfunction toggle(bar, show?: boolean) {\n  const el = document.querySelector(`.tixxt__${bar}`);\n  if (!(el instanceof HTMLElement)) return;\n\n  const persist = el.dataset?.persist !== undefined;\n\n  if (!el) {\n    console.warn(`no .tixxt__${bar} element found to toggle`);\n    return null;\n  }\n\n  if (isUndefined(show))\n    show =\n      !el.classList.contains(`${bar}--visible`) ||\n      el.classList.contains(\"hidden\");\n\n  if (show) {\n    if (el.classList.contains(\"hidden\")) el.classList.remove(\"hidden\");\n    if (persist) sessionStorage.setItem(`${bar}Visible`, \"true\");\n\n    el.classList.add(`${bar}--visible`);\n    openBarElements.add(el);\n\n    if (coversWholeScreen(el)) disableBodyScrolling(bar);\n  } else {\n    if (persist) sessionStorage.removeItem(`${bar}Visible`);\n\n    el.classList.add(`${bar}--hiding`);\n\n    openBarElements.delete(el);\n    restoreBodyScrolling(bar);\n\n    setTimeout(() => {\n      el.classList.remove(`${bar}--hiding`, `${bar}--visible`);\n    }, 500);\n  }\n}\n\nconst getResizeHandler = memoize((bar: string) => () => {\n  const el = document.querySelector(`.tixxt__${bar}`);\n  if (!(el instanceof HTMLElement)) return;\n\n  if (!coversWholeScreen(el)) toggle(bar, false);\n});\n\nexport function disableBodyScrolling(bar: string) {\n  document.body.style.top = `-${window.scrollY}px`;\n  document.body.style.overflow = \"hidden\";\n  document.body.style.position = \"fixed\";\n\n  window.addEventListener(\"resize\", getResizeHandler(bar));\n}\n\nexport function restoreBodyScrolling(bar: string) {\n  if (!shouldRestoreBodyScrolling()) return;\n\n  const scrollY = document.body.style.top;\n  document.body.style.removeProperty(\"overflow\");\n  document.body.style.removeProperty(\"position\");\n  document.body.style.removeProperty(\"top\");\n  window.scrollTo(0, parseInt(scrollY || \"0\") * -1);\n  window.removeEventListener(\"resize\", getResizeHandler(bar));\n}\n\nexport function closeUserbar() {\n  toggle(\"userbar\", false);\n}\n\n/* show bar immediately if it was visible before */\nexport function restoreVisibility(bar: string, el: HTMLElement) {\n  if (sessionStorage.getItem(`${bar}Visible`)) {\n    el.classList.add(`${bar}--visible`);\n  }\n}\n\nexport function toggleChatbar() {\n  if (window.innerWidth >= CHAT_STATIC_BREAKPOINT) {\n    toggleStaticChat();\n  } else {\n    toggle(\"chatbar\");\n  }\n}\n\nfunction toggleStaticChat() {\n  if (document.body.classList.contains(\"tixxt--with-chat\")) {\n    sessionStorage.setItem(\"chatbarStaticHidden\", \"true\");\n    hideStaticChat();\n  } else {\n    sessionStorage.removeItem(\"chatbarStaticHidden\");\n    document.body.classList.add(\"tixxt--with-chat\");\n    document.getElementById(\"chatbar-root\")?.classList.remove(\"hidden\");\n  }\n}\n\nfunction hideStaticChat() {\n  document.body.classList.remove(\"tixxt--with-chat\");\n  document.getElementById(\"chatbar-root\")?.classList.add(\"hidden\");\n}\n\n/* hide chat immediately if it was hidden before */\nexport function restoreStaticChat() {\n  if (sessionStorage.getItem(\"chatbarStaticHidden\")) {\n    hideStaticChat();\n  }\n}\n","import { Application } from \"@hotwired/stimulus\";\n\nconst application = Application.start();\n\n// Configure Stimulus development experience\napplication.debug = false;\nwindow.Stimulus = application;\n\nexport { application };\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"accordion-scroll\"\nexport default class extends Controller {\n  connect() {\n    this.scrollToOpenAccordion();\n    this.element.addEventListener(\"shown.bs.collapse\", () => {\n      this.scrollToOpenAccordion();\n    });\n  }\n\n  scrollToOpenAccordion() {\n    const openAccordionItem = this.element.querySelector(\".collapse.show\");\n\n    if (openAccordionItem) {\n      const button =\n        openAccordionItem.previousElementSibling.querySelector(\"button\");\n\n      button.scrollIntoView({\n        behavior: \"smooth\",\n        block: \"end\",\n        inline: \"nearest\",\n      });\n    }\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"administration--activitystream--close-activity-reply-month\"\nexport default class extends Controller {\n  onClickChangeValue(event) {\n    this.$CloseActivityReplyAutomaticSelect = this.element.querySelector(\n      \".close_activity_reply_automatic_select\",\n    );\n\n    this.$CloseActivityReplyAutomaticSelect.classList.toggle(\n      \"hidden\",\n      !(event.target.value === \"automatic\"),\n    );\n  }\n}\n","import React, { useEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./Flash.css\";\n\ntype Props = {\n  alert: string;\n  children: string;\n  rootId?: string;\n};\n\nexport default function Flash({\n  alert = \"success\",\n  children,\n  rootId = \"spa-root\",\n}: Props) {\n  const [close, closeNotification] = useState(false);\n\n  useEffect(() => {\n    setTimeout(() => closeNotification(true), 5000);\n  }, []);\n\n  return ReactDOM.createPortal(\n    <div className=\"flashes\">\n      <div className={`wrap ${close ? \"flash-dismiss\" : null}`}>\n        <div\n          className={`alert alert-${alert} flex justify-between items-center`}\n        >\n          <span>{children}</span>\n          <a className=\"close text-2xl font-bold\" data-dismiss=\"flash\" href=\"#\">\n            ×\n          </a>\n        </div>\n      </div>\n    </div>,\n    document.getElementById(rootId) as HTMLElement,\n  );\n}\n","import React, { useState } from \"react\";\nimport { Category } from \"../../../../@types/appointmentCategories\";\n\nfunction CategoryRow({\n  category,\n  changeCategory,\n  removeCategory,\n}: {\n  category: Category;\n  changeCategory: (id: string, label: string) => void;\n  removeCategory: (id: string) => void;\n}) {\n  const [text, setText] = useState(category.label);\n  const [edit, setEdit] = useState(false);\n\n  return (\n    <li className=\"flex justify-between items-center p-2\">\n      {edit ? (\n        <div className=\"input-group\">\n          <input\n            type=\"text\"\n            value={text}\n            onChange={(e) => setText(e.target.value)}\n          />\n          <button\n            className=\"btn btn-light\"\n            onClick={(e) => {\n              e.preventDefault();\n              changeCategory(category.id, text);\n              setEdit(false);\n            }}\n          >\n            <i className=\"fa-regular fa-check\" />\n          </button>\n        </div>\n      ) : (\n        category.label\n      )}\n      <div className=\"btn btn-group\">\n        <button\n          className=\"btn btn-sm btn-light\"\n          onClick={(e) => {\n            e.preventDefault();\n            setEdit(true);\n          }}\n        >\n          <i className=\"fa-regular fa-pencil\" />\n        </button>\n        <button\n          className=\"btn btn-sm btn-danger\"\n          onClick={(e) => {\n            e.preventDefault();\n            removeCategory(category.id);\n          }}\n        >\n          <i className=\"fa-regular fa-trash\" />\n        </button>\n      </div>\n    </li>\n  );\n}\n\nexport default CategoryRow;\n","import React from \"react\";\nimport MarkdownTranslation from \"components/shared/MarkdownTranslation\";\nimport classNames from \"classnames\";\n\nfunction InfoText({\n  translation,\n  showIcon = true,\n  small = false,\n}: {\n  translation: string;\n  showIcon?: boolean;\n  small?: boolean;\n}) {\n  return (\n    <div\n      className={classNames(\"flex align-baseline\", {\n        \"gap-2\": small,\n        \"mb-4\": small,\n        \"gap-4\": !small,\n        \"mb-6\": !small,\n      })}\n    >\n      {showIcon && (\n        <i\n          className={classNames(\"fa-regular fa-circle-info text-muted\", {\n            \"ml-0\": small,\n            \"ml-4\": !small,\n            \"text-2xl\": small,\n            \"text-4xl\": !small,\n          })}\n        />\n      )}\n      <MarkdownTranslation\n        translation={translation}\n        styles=\"markdown-content prose max-w-none text-muted text-sm\"\n      />\n    </div>\n  );\n}\n\nexport default InfoText;\n","import React, { useEffect, useState } from \"react\";\nimport { filter, map, some } from \"lodash\";\n\nimport Flash from \"components/shared/Flash\";\nimport { Category } from \"../../../../@types/appointmentCategories\";\nimport CategoryRow from \"components/administration/appointments/categories/CategoryRow\";\nimport InfoText from \"components/shared/InfoText\";\n\nfunction CategoriesEditor({ categories }: { categories: Category[] }) {\n  const [selectedCategories, setSelectedCategories] = useState(categories);\n  const [text, setText] = useState(\"\");\n  const [error, setError] = useState(\"\");\n\n  // set value to hidden input in administration appointment settings\n  useEffect(() => {\n    document.getElementsByName(\"custom_categories\")[0].setAttribute(\n      \"value\",\n      JSON.stringify(\n        map(selectedCategories, (cat) => {\n          // if category is new remove the id key\n          if (cat.id === cat.label) {\n            return { label: cat.label };\n          } else {\n            return cat;\n          }\n        }),\n      ),\n    );\n  }, [selectedCategories]);\n\n  function addCategory() {\n    if (some(selectedCategories, { label: text })) {\n      setError(\n        I18n.t(\n          \"js.administration.appointment_settings.edit.duplicated_category\",\n        ),\n      );\n    } else {\n      setSelectedCategories([...selectedCategories, { id: text, label: text }]);\n      setText(\"\");\n      setError(\"\");\n    }\n  }\n\n  function changeCategory(id: string, label: string) {\n    const changedCategories = map(selectedCategories, (cat) => {\n      if (cat.id === id) {\n        return { ...cat, id: cat.id === cat.label ? label : cat.id, label };\n      } else {\n        return cat;\n      }\n    });\n\n    setSelectedCategories(changedCategories);\n  }\n\n  function removeCategory(id: string) {\n    let changedCategories;\n\n    if (some(categories, { id })) {\n      changedCategories = map(selectedCategories, (cat) => {\n        if (cat.id === id) {\n          return { ...cat, _destroy: true };\n        } else {\n          return cat;\n        }\n      });\n    } else {\n      changedCategories = filter(selectedCategories, (cat) => cat.id !== id);\n    }\n\n    setSelectedCategories(changedCategories);\n  }\n\n  return (\n    <>\n      {error !== \"\" ? (\n        <Flash alert=\"error\" rootId=\"legacy-root\">\n          {error}\n        </Flash>\n      ) : null}\n      <div className=\"mt-4\">\n        <InfoText\n          translation={\n            \"js.networks.appointment_settings.custom_categories.help\"\n          }\n          small\n        />\n        <ul className=\"custom-categories divide-y divide-neutral mb-4\">\n          {map(\n            filter(selectedCategories, (cat) => !cat._destroy),\n            (category) => (\n              <CategoryRow\n                key={category.id}\n                category={category}\n                changeCategory={changeCategory}\n                removeCategory={removeCategory}\n              />\n            ),\n          )}\n        </ul>\n        <div className=\"input-group\">\n          <input\n            type=\"text\"\n            placeholder={I18n.t(\n              \"js.networks.appointment_settings.custom_categories.new_category\",\n            )}\n            value={text}\n            onChange={(e) => setText(e.target.value)}\n          />\n          <button\n            className=\"btn btn-light\"\n            onClick={(e) => {\n              e.preventDefault();\n              addCategory();\n            }}\n            disabled={text === \"\"}\n          >\n            {I18n.t(\n              \"js.networks.appointment_settings.custom_categories.add_category\",\n            )}\n          </button>\n        </div>\n      </div>\n    </>\n  );\n}\n\nexport default CategoriesEditor;\n","import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { Controller } from \"@hotwired/stimulus\";\nimport CategoriesEditor from \"../../components/administration/appointments/categories/CategoriesEditor\";\n\n// Connects to data-controller=\"administration--edit-categories\"\nexport default class extends Controller {\n  static values = { context: String, categories: Array };\n\n  connect() {\n    const root = createRoot(this.element);\n    root.render(\n      <CategoriesEditor\n        context={this.hasContextValue ? this.contextValue : undefined}\n        categories={this.categoriesValue}\n      />,\n    );\n  }\n\n  disconnect() {\n    createRoot(this.element).unmount();\n  }\n}\n","import React, { useRef } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { Controller } from \"@hotwired/stimulus\";\nimport Modal from \"../../../components/shared/Modal\";\nimport ControlGroup from \"../../../components/shared/fields/ControlGroup\";\nimport Textarea from \"react-textarea-autosize\";\n\nfunction JoinRequestModal({ onClose, groupSlug, joinRequestId }) {\n  const formRef = useRef();\n  const submitUrl = `/groups/${groupSlug}/administration/join_requests/${joinRequestId}/reject`;\n\n  return (\n    <Modal\n      static\n      title={I18n.t(\n        \"js.administration.join_requests.open.reject_with_message_title\",\n      )}\n      onClose={onClose}\n      useMinHeightMax={true}\n      modalActionProps={{\n        submitText: \"js.administration.join_requests.open.message.submit\",\n        modalSubmitActionClassName: \"btn-danger\",\n        submit: () => formRef.current?.submit(),\n      }}\n    >\n      <form className=\"form\" action={submitUrl} ref={formRef}>\n        <ControlGroup\n          label={I18n.t(\"js.administration.join_requests.open.message.label\")}\n          className=\"text-property\"\n        >\n          <Textarea minRows={10} name=\"rejection_message\" />\n        </ControlGroup>\n      </form>\n    </Modal>\n  );\n}\n\n// Connects to data-controller=\"administration--groups--join-request-message\"\nexport default class extends Controller {\n  static values = { groupSlug: String, joinRequestId: String };\n\n  connect() {\n    this.childElement = document.createElement(\"div\");\n    this.element.appendChild(this.childElement);\n    this.root = createRoot(this.childElement);\n  }\n\n  onCloseModal() {\n    this.root.render(React.createElement(React.Fragment, null));\n  }\n\n  showModal() {\n    this.root.render(\n      <JoinRequestModal\n        onClose={() => this.onCloseModal()}\n        groupSlug={this.groupSlugValue}\n        joinRequestId={this.joinRequestIdValue}\n      />,\n    );\n  }\n\n  disconnect() {\n    this.element.removeChild(this.childElement);\n    this.root.unmount();\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport * as Turbo from \"@hotwired/turbo\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\n// Connects to data-controller=\"administration--invites--send-batch-actions\"\nexport default class extends Controller {\n  connect() {}\n\n  refreshInvites() {\n    const invite_ids = this.#getSelectedInviteIds();\n\n    if (invite_ids.length > 1) {\n      this.renewInvites(invite_ids);\n    } else {\n      const model = this.#findInvite(invite_ids[0]);\n\n      Tixxt.Modal.instance().showBodied(\n        I18n.t(\"js.invites.index.details-modal.title\"),\n        new Tixxt.Invites.BatchRenewInviteView({ model, invite_ids }),\n      );\n    }\n  }\n\n  async renewInvites(invite_ids) {\n    const { externalInvitesCount, groupInvitesCount } =\n      this.countSelectedInviteTypes();\n\n    try {\n      window.bridge?.confirm(\n        I18n.t(\"js.invites.batch_renew.confirm\", {\n          group_invites_count: groupInvitesCount,\n          network_invites_count: externalInvitesCount,\n        }),\n        () => {\n          fetchApi(\"/batch_invites/renew\", {\n            method: \"POST\",\n            body: {\n              body: \"\",\n              invite_ids: invite_ids,\n            },\n          }).then(() => this.batchRenewSuccess());\n        },\n      );\n    } catch (e) {\n      this.batchRenewFailure();\n    }\n  }\n\n  revokeInvites() {\n    $.ajax({\n      url: \"/batch_invites/revoke\",\n      method: \"post\",\n      data: {\n        invite_ids: this.#getSelectedInviteIds(),\n      },\n    })\n      .done(() => this.#submitSuccess())\n      .fail(this.#submitFailure);\n  }\n\n  #getSelectedInviteIds() {\n    const selectedCheckboxes = this.element.querySelectorAll(\n      'input[name=\"invite_select\"]:checked',\n    );\n    return Array.from(selectedCheckboxes).map(\n      (checkbox) => checkbox.id.split(\"-\")[1],\n    );\n  }\n\n  #findInvite(id) {\n    const model = new Tixxt.Invites.Invite({ id: id });\n    model.fetch();\n    return model;\n  }\n\n  countSelectedInviteTypes() {\n    let externalInvitesCount = 0;\n    let groupInvitesCount = 0;\n\n    const selectedCheckboxes = this.element.querySelectorAll(\n      'input[name=\"invite_select\"]:checked',\n    );\n\n    Array.from(selectedCheckboxes).forEach((checkbox) => {\n      if (checkbox.dataset.type === \"ExternalInvite\") {\n        externalInvitesCount += 1;\n      } else {\n        groupInvitesCount += 1;\n      }\n    });\n\n    return { externalInvitesCount, groupInvitesCount };\n  }\n\n  #submitSuccess() {\n    toastr.success(I18n.t(\"js.invites.batch_revoke.success_flash\"));\n\n    const url = this.getUrlForPage();\n\n    Turbo.visit(url.toString(), {\n      frame: \"external-invites-view\",\n      action: \"replace\",\n    });\n  }\n\n  #submitFailure() {\n    toastr.error(I18n.t(\"js.invites.batch_revoke.not_revokable_flash\"));\n  }\n\n  batchRenewSuccess() {\n    toastr.success(I18n.t(\"js.invites.batch_renew.success_flash\"));\n\n    const url = this.getUrlForPage();\n\n    Turbo.visit(url.toString(), {\n      frame: \"external-invites-view\",\n      action: \"replace\",\n    });\n  }\n\n  batchRenewFailure() {\n    toastr.error(I18n.t(\"js.invites.batch_renew.not_renewable_flash\"));\n  }\n\n  getUrlForPage() {\n    const pageField = document.querySelector(\"input[name='page']\");\n    const page = pageField ? pageField.value : \"1\";\n\n    const url = new URL(location.pathname, window.location.origin);\n    url.searchParams.set(\"page\", page);\n\n    return url;\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"administration--invites--sent\"\nexport default class extends Controller {\n  // Click handler\n  showInviteDetails(event) {\n    const model = this.findInvite(event.params.inviteId);\n    Tixxt.Modal.instance().showBodied(\n      I18n.t(\"js.invites.index.details-modal.title\"),\n      new Tixxt.Invites.InviteDetailsView({ model }),\n    );\n  }\n\n  // Click handler\n  refreshInvite(event) {\n    const model = this.findInvite(event.params.inviteId);\n    Tixxt.Modal.instance().showBodied(\n      I18n.t(\"js.invites.actions.renew_invite\"),\n      new Tixxt.Invites.RenewInviteView({ model }),\n    );\n  }\n\n  // Helper\n  findInvite(id) {\n    const model = new Tixxt.Invites.Invite({ id: id });\n    model.fetch();\n    return model;\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"administration--invites--toggle-batch-actions\"\nexport default class extends Controller {\n  connect() {\n    this.toggleCheckboxListener = () => this.toggle();\n    this.checkboxes = this.element.querySelectorAll(\n      'input[name=\"invite_select\"]',\n    );\n    this.checkboxes.forEach((checkbox) =>\n      checkbox.addEventListener(\"change\", this.toggleCheckboxListener),\n    );\n    this.toggle();\n  }\n\n  disconnect() {\n    this.checkboxes.forEach((checkbox) =>\n      checkbox.removeEventListener(\"change\", this.toggleCheckboxListener),\n    );\n  }\n\n  toggle() {\n    const anyChecked =\n      this.element.querySelectorAll('input[name=\"invite_select\"]:checked')\n        .length > 0;\n\n    this.element\n      .querySelector(\".batch_processing-actions\")\n      .classList.toggle(\"hidden\", !anyChecked);\n\n    this.toggleDisableButtons();\n  }\n\n  toggleDisableButtons() {\n    const inviteStatus = this.getSelectedInviteStatus();\n\n    const revokeable = inviteStatus.every((status) => status === \"open\");\n    const renewable = inviteStatus.every(\n      (status) => ![\"accepted\", \"obsolete\", \"joined\"].includes(status),\n    );\n\n    const revokeButton = document.getElementById(\"revoke-invites\");\n    const renewButton = document.getElementById(\"renew-invites\");\n\n    if (revokeButton) {\n      revokeButton.disabled = !revokeable;\n    }\n\n    if (renewButton) {\n      renewButton.disabled = !renewable;\n    }\n  }\n\n  getSelectedInviteStatus() {\n    const selectedCheckboxes = this.element.querySelectorAll(\n      'input[name=\"invite_select\"]:checked',\n    );\n\n    return Array.from(selectedCheckboxes).map((checkbox) => checkbox.value);\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport { fetchApi } from \"../../../helpers/reactQueryApi\";\nimport { map } from \"lodash\";\n\n// Connects to data-controller=\"administration--newsletter--drag-and-drop\"\nexport default class extends Controller {\n  static targets = [\"entry\"];\n\n  connect() {\n    this.initializeDraggable();\n  }\n\n  disconnect() {\n    this.disconnectDraggable();\n  }\n\n  initializeDraggable() {\n    this.entryTargets.forEach((entry) => {\n      entry.setAttribute(\"draggable\", true);\n      entry.addEventListener(\"dragstart\", this.dragstart);\n      entry.addEventListener(\"dragover\", this.dragover);\n      entry.addEventListener(\"dragend\", this.dragend);\n      entry.addEventListener(\"drop\", this.drop);\n    });\n  }\n\n  disconnectDraggable() {\n    this.entryTargets.forEach((entry) => {\n      entry.setAttribute(\"draggable\", false);\n      entry.removeEventListener(\"dragstart\", this.dragstart);\n      entry.removeEventListener(\"dragover\", this.dragover);\n      entry.removeEventListener(\"dragend\", this.dragend);\n      entry.removeEventListener(\"drop\", this.drop);\n    });\n  }\n\n  dragstart = (event) => {\n    event.target.classList.add(\"alert-info\");\n    event.dataTransfer.setData(\"text/plain\", event.target.dataset.entryId);\n  };\n\n  dragover = (event) => {\n    event.preventDefault();\n\n    const targetElement = event.currentTarget;\n\n    this.removeHighlight(targetElement);\n    targetElement.classList.add(\"alert-info\");\n  };\n\n  dragend = (event) => {\n    event.target.classList.remove(\"alert-info\");\n  };\n\n  drop = (event) => {\n    event.preventDefault();\n\n    const entryId = event.dataTransfer.getData(\"text/plain\");\n    const targetEntryId = event.currentTarget.dataset.entryId;\n\n    if (entryId && targetEntryId) {\n      const entryElement = this.entryElementById(entryId);\n      const targetElement = this.entryElementById(targetEntryId);\n\n      this.moveEntryElement(entryElement, targetElement);\n      this.persistOrder();\n      this.removeHighlight(targetElement);\n    }\n  };\n\n  removeHighlight(targetElement) {\n    const parentElement = targetElement.parentNode;\n\n    Array.from(parentElement.children).forEach((child) => {\n      child.classList.remove(\"alert-info\");\n    });\n  }\n\n  moveEntryElement(sourceElement, targetElement) {\n    const targetParent = targetElement.parentNode;\n\n    if (sourceElement.compareDocumentPosition(targetElement) === 2) {\n      // Move up\n      targetParent.insertBefore(sourceElement, targetElement);\n    } else {\n      // Move down\n      if (targetElement.nextElementSibling) {\n        targetParent.insertBefore(\n          sourceElement,\n          targetElement.nextElementSibling,\n        );\n      } else {\n        targetParent.appendChild(sourceElement);\n      }\n    }\n  }\n\n  entryElementById(entryId) {\n    return this.element.querySelector(`[data-entry-id=\"${entryId}\"]`);\n  }\n\n  persistOrder() {\n    const order = map(\n      this.element.getElementsByClassName(\"activity\"),\n      (el) => el.dataset.entryId,\n    );\n\n    fetchApi(\"/administration/newsletter/settings/update_upcoming_activities\", {\n      method: \"POST\",\n      body: { order },\n    }).catch((error) => {\n      window.Turbo.visit(\n        \"/administration/newsletter/settings/upcoming_activities\",\n        {\n          frame: \"upcoming_activities\",\n          action: \"replace\",\n        },\n      );\n      console.error(error);\n    });\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport { range, toInteger } from \"lodash\";\n\n// Connects to data-controller=\"administration--newsletter--interval\"\nexport default class extends Controller {\n  static values = {\n    interval: String,\n    day: String,\n    secondDay: String,\n    time: String,\n    secondTime: String,\n  };\n\n  #SELECTOR_MAPPING = {\n    weekly: [\"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\", \"sun\"],\n    semimonthly: range(1, 32).map(String),\n    monthly: range(1, 32).map(String),\n  };\n\n  #DEFAULT_VALUE_MAPPING = {\n    weekly: \"mon\",\n    monthly: \"1\",\n    semimonthly: \"1\",\n    semimonthly_2: \"15\",\n    time: \"am\",\n  };\n\n  connect() {\n    this.$dayTimeContainer = this.element.querySelector(\".day_time_container\");\n    this.$daySelector = this.element.querySelector(\".day_selector\");\n    this.#intervalSelector(this.intervalValue);\n  }\n\n  onClickChangeInterval(event) {\n    this.#intervalSelector(event.target.value);\n  }\n\n  #intervalSelector(targetValue) {\n    targetValue = targetValue || \"weekly\";\n    const isSemiMonthly = targetValue === \"semimonthly\";\n    const isMonthly = targetValue === \"monthly\";\n\n    this.$daySelector.innerHTML = \"\";\n\n    if (isSemiMonthly) {\n      this.#createSecondDaySelector();\n    } else {\n      this.#removeSecondDaySelector();\n    }\n\n    this.#createDaySelectorOptions(\"$daySelector\", targetValue);\n\n    this.#setSelectorValue(\n      \"$daySelector\",\n      this.dayValue,\n      targetValue,\n      targetValue === this.intervalValue,\n    );\n\n    this.#setSelectorValue(\n      \"$secondDaySelector\",\n      this?.secondDayValue,\n      \"semimonthly_2\",\n      this?.secondDayValue,\n    );\n\n    this.#setSelectorValue(\n      \"$secondDaySelector\",\n      this?.secondDayValue,\n      \"semimonthly_2\",\n      targetValue,\n      this.intervalValue,\n    );\n\n    this.#setSelectorValue(\n      \"$secondDaySelector\",\n      this?.secondDayValue,\n      \"semimonthly_2\",\n      this?.secondDayValue,\n    );\n\n    this.#createAndAppendTimeSelector(\n      \"time\",\n      \"$daySelector\",\n      \"$timeSelector\",\n      this?.timeValue,\n    );\n\n    this.#createAndAppendTimeSelector(\n      \"second_time\",\n      \"$secondDaySelector\",\n      \"$secondTimeSelector\",\n      this?.secondTimeValue,\n    );\n\n    if (isSemiMonthly || isMonthly) {\n      this.#createMonthHelpBlock();\n    } else {\n      this.#removeMonthHelpBlock();\n    }\n  }\n\n  #setSelectorValue(selector, value, mapping, tern) {\n    if (this[selector]) {\n      this[selector].value = tern\n        ? value\n        : this.#DEFAULT_VALUE_MAPPING[mapping];\n    }\n  }\n\n  #createSecondDaySelector() {\n    if (!this.$secondDayTimeContainer) {\n      this.$secondDayTimeContainer = document.createElement(\"div\");\n      this.$secondDayTimeContainer.setAttribute(\n        \"class\",\n        \"day_time_container flex mt-2 gap-2\",\n      );\n      this.#createDaySelector(\n        \"$secondDaySelector\",\n        \"newsletter_sending_day[second_day]\",\n        \"secondDaySelector\",\n      );\n      this.$secondDayTimeContainer.appendChild(this.$secondDaySelector);\n      this.$dayTimeContainer.after(this.$secondDayTimeContainer);\n    } else {\n      this.$secondDaySelector.innerHTML = \"\";\n    }\n\n    this.#createDaySelectorOptions(\"$secondDaySelector\", \"semimonthly\");\n  }\n\n  #createDaySelector(selector, name, className) {\n    this[selector] = document.createElement(\"select\");\n    this[selector].name = name;\n    this[selector].classList.add(className, \"mt-2\");\n  }\n\n  #createAndAppendTimeSelector(name, parent, variable, value) {\n    if (!this[variable] && this[parent]) {\n      this[variable] = this.#createTimeSelector(name, value);\n      this[parent].after(this[variable]);\n    }\n  }\n\n  #createTimeSelector(name, selected) {\n    const select = document.createElement(\"select\");\n    select.setAttribute(\"class\", \"time_selector max-w-max\");\n    select.setAttribute(\"name\", `newsletter_sending_day[${name}]`);\n    select.setAttribute(\"type\", \"select\");\n\n    [\"am\", \"pm\"].forEach((value) => {\n      const option = this.#createTimeSelectorOption(value);\n      select.appendChild(option);\n    });\n\n    select.value = selected || this.#DEFAULT_VALUE_MAPPING[\"time\"];\n    return select;\n  }\n\n  #createTimeSelectorOption(value) {\n    const option = document.createElement(\"option\");\n    option.setAttribute(\"value\", value);\n    option.textContent = I18n.t(\n      `js.administration.newsletter.settings.newsletter_interval.${value}`,\n    );\n\n    return option;\n  }\n\n  #createDaySelectorOptions(selector, mapping) {\n    this.#SELECTOR_MAPPING[mapping].forEach((value) => {\n      const opt = this.#createDaySelectorOption(value);\n\n      this[selector].appendChild(opt);\n    });\n  }\n\n  #createDaySelectorOption(value) {\n    const opt = document.createElement(\"option\");\n\n    opt.value = value;\n    opt.textContent = I18n.t(\n      `administration.newsletter.settings.newsletter_interval.days.${\n        toInteger(value) === 0 ? value : \"day\"\n      }`,\n      {\n        day: value,\n      },\n    );\n\n    return opt;\n  }\n\n  #createMonthHelpBlock() {\n    if (!this.$monthHelpBlock) {\n      const parentContainer = this.$secondDayTimeContainer\n        ? this.$secondDayTimeContainer\n        : this.$dayTimeContainer;\n\n      this.$monthHelpBlock = document.createElement(\"div\");\n      this.$monthHelpBlock.classList.add(\"help-block\", \"mt-1\", \"mb-3\");\n      this.$monthHelpBlock.textContent = I18n.t(\n        \"administration.newsletter.settings.help_md\",\n      );\n\n      parentContainer.after(this.$monthHelpBlock);\n    }\n  }\n\n  #removeElement(element) {\n    if (this[element]) {\n      this[element].remove();\n      this[element] = null;\n    }\n  }\n\n  #removeSecondDaySelector() {\n    this.#removeElement(\"$secondDaySelector\");\n    this.#removeElement(\"$secondTimeSelector\");\n    this.#removeElement(\"$secondDayTimeContainer\");\n  }\n\n  #removeMonthHelpBlock() {\n    this.#removeElement(\"$monthHelpBlock\");\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"administration--newsletter--unlayer-proxy\"\nexport default class extends Controller {\n  connect() {\n    this.setupIframe();\n    window.addEventListener(\"message\", this.onMessage);\n    this.element.addEventListener(\"submit\", this.onSubmit);\n    this.allSubmitsDisabled = true;\n  }\n\n  disconnect() {\n    window.removeEventListener(\"message\", this.onMessage);\n    this.element.removeEventListener(\"submit\", this.onSubmit);\n  }\n\n  setupIframe() {\n    this.iframe = this.element.querySelector(\"iframe[data-target-origin]\");\n    this.targetOrigin = this.iframe.dataset.targetOrigin;\n    this.storageToken = this.iframe.dataset.storageToken;\n    this.projectId = this.iframe.dataset.projectId;\n    this.iframe.src =\n      this.targetOrigin + \"/unlayer_editor.html?_=\" + new Date().getTime();\n  }\n\n  onMessage = (event) => {\n    if (\n      event.source !== this.iframe.contentWindow ||\n      event.data.source !== \"unlayer_editor\"\n    )\n      return;\n\n    if (event.data.event === \"ready\") {\n      let design = this.element.querySelector(\n        'input[name=\"newsletter_unlayer_template[design]\"]',\n      ).value;\n      try {\n        if (design && design.length > 0) design = JSON.parse(design);\n      } catch (e) {\n        console.warn(\"Failed parsing design json:\", design);\n      }\n\n      const unlayerLocale = {\n        de: \"de-DE\",\n        en: \"en-US\",\n        es: \"es-ES\",\n        fr: \"fr-FR\",\n      };\n\n      this.postMessage({\n        method: \"init\",\n        design,\n        projectId: this.projectId,\n\n        translations: {\n          tixxt_content_placeholder: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.tixxt_content_placeholder\",\n          ),\n          salutation: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.salutation\",\n          ),\n          salutation_sample: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.salutation_sample\",\n          ),\n          disclaimer_and_settings: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.disclaimer_and_settings\",\n          ),\n          disclaimer_and_settings_sample: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.disclaimer_and_settings_sample\",\n          ),\n          published_in_preview_info: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.published_in_preview_info\",\n          ),\n          published_in_preview_date: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.published_in_preview_date\",\n          ),\n          published_in_preview_published_in: ` ${I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.published_in_preview_published_in\",\n          )} `,\n          published_in_preview_streams: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.published_in_preview_streams\",\n          ),\n          link_color_published_in_label: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.link_color_published_in_label\",\n          ),\n          text_color_published_in_label: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.text_color_published_in_label\",\n          ),\n          colors_group_title: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.colors_group_label\",\n          ),\n          tixxt_content_label: I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.tixxt_content_label\",\n          ),\n        },\n        network: {\n          host: location.host,\n          imprint: this.data.get(\"imprint\"),\n          // the split is needed because of custom locales i.e de_bitkom\n          locale: unlayerLocale[I18n.locale.split(\"_\")[0]],\n        },\n\n        storageToken: this.storageToken,\n      });\n      this.allSubmitsDisabled = false;\n    }\n    if (event.data.event === \"exportHtml:done\") {\n      if (this.resolveExportHtml) {\n        this.resolveExportHtml(event.data.payload);\n        this.resolveExportHtml = null;\n      }\n    }\n  };\n\n  postMessage = (payload) => {\n    this.iframe.contentWindow.postMessage(\n      { ...payload, source: \"tixxt\" },\n      this.targetOrigin,\n    );\n  };\n\n  onSubmit = async (event) => {\n    if (this.submitting) return;\n\n    this.submitting = true;\n    event.stopPropagation();\n    event.preventDefault();\n    this.allSubmitsDisabled = true;\n    try {\n      const { design, chunks } = await new Promise((resolve) => {\n        this.resolveExportHtml = resolve;\n        this.postMessage({ method: \"exportHtml\" });\n      });\n\n      const values = {\n        ...chunks,\n        design: JSON.stringify(design),\n        fonts: JSON.stringify(chunks.fonts),\n      };\n      [\"design\", \"body\", \"css\", \"js\", \"fonts\"].forEach((field) => {\n        const name = `newsletter_unlayer_template[${field}]`;\n        this.element.querySelector(`input[name=\"${name}\"]`).value =\n          values[field];\n      });\n\n      const errors = [];\n      if (countOccurrences(values.body, \"{TIXXT_CONTENT}\") !== 1) {\n        errors.push(\n          I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.tixxt_content_missing_error\",\n          ),\n        );\n      }\n      if (countOccurrences(values.body, \"{{disclaimer_and_settings}}\") < 1) {\n        errors.push(\n          I18n.t(\n            \"js.administration.newsletter.unlayer_embed.editor.disclaimer_and_settings_missing_error\",\n          ),\n        );\n      }\n      if (errors.length > 0) {\n        toastr.error(errors.join(\"<br/><br/>\"));\n        this.allSubmitsDisabled = false;\n        return;\n      }\n\n      this.allSubmitsDisabled = false;\n      event.submitter.click();\n      this.allSubmitsDisabled = true;\n    } catch (e) {\n      console.error(e);\n      this.submitting = false;\n      this.allSubmitsDisabled = false;\n    }\n  };\n\n  set allSubmitsDisabled(value) {\n    this.element.querySelectorAll(\"[type=submit]\").forEach(function (button) {\n      button.disabled = value;\n    });\n  }\n}\n\nfunction countOccurrences(content, search) {\n  const matches = content.match(new RegExp(search, \"g\"));\n  return matches ? matches.length : 0;\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"administration--role-assignments\"\nexport default class extends Controller {\n  connect() {\n    new window.Phoenix.Views.Inputs.MemberSelect({ el: this.element });\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"administration--teams--fallback-upn-assignments\"\nexport default class extends Controller {\n  connect() {\n    new window.Phoenix.Views.Inputs.MemberSelect({\n      el: this.element,\n      multiple: false,\n    });\n  }\n\n  disconnect() {\n    super.disconnect();\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport ClipboardJS from \"clipboard/src/clipboard\";\n\n// Connects to data-controller=\"clipboard\"\nexport default class extends Controller {\n  connect() {\n    this.clipboard = new ClipboardJS(this.element);\n  }\n\n  disconnect() {\n    this.clipboard.destroy();\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"external-activitystreams\"\nexport default class extends Controller {\n  connect() {\n    const popups = [];\n    $(\".images-view\").each(function () {\n      popups.push($(this).magnificPopup(window.Lightbox.defaultOptions));\n    });\n    this.popups = popups;\n  }\n\n  disconnect() {\n    this.popups.forEach((el) => {\n      $(el).magnificPopup(\"close\");\n    });\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"invites--handle-external-invite\"\nexport default class extends Controller {\n  handleExternalInvite() {\n    document.getElementById(\"handle-external-invite\").click();\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"ministry\"\nexport default class extends Controller {\n  openEditExternalIds(event) {\n    event.preventDefault();\n    document.querySelector(\"#show_external_ids\").style.display = \"none\";\n    document.querySelector(\"#edit_external_ids\").style.display = \"\";\n    document.querySelector(\"#edit_external_ids input[type=text]\").focus();\n  }\n\n  closeEditExternalIds(event) {\n    event.preventDefault();\n    document.querySelector(\"#edit_external_ids form\").reset();\n    document.querySelector(\"#edit_external_ids\").style.display = \"none\";\n    document.querySelector(\"#show_external_ids\").style.display = \"\";\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"shared--go-back-button\"\nexport default class extends Controller {\n  onClickGoBack() {\n    history.back();\n  }\n}\n","import { filter, isEmpty, map, kebabCase, now } from \"lodash\";\n\n// Removes options with empty label\n// Adds unique value derived from label if none is present\nexport default function finalizeSelectionOptions(options) {\n  const mil = now();\n  let seq = 0;\n  // Is required for https://gitlab.sys.mixxt.net/tixxt/foundation/-/issues/689 so that values the cannot be assigned twice\n  function uniqueValue(label) {\n    return `${kebabCase(label)}-${mil}-${seq++}`;\n  }\n  return map(\n    filter(options, ({ label }) => !isEmpty(label)),\n    ({ label, value }) => ({\n      label,\n      value: isEmpty(value) ? uniqueValue(label) : value,\n    }),\n  );\n}\n","import React, { useState } from \"react\";\nimport { findIndex } from \"lodash\";\n\nexport interface TabbableFieldsTypes {\n  fields: Array<{ type: string; label?: string; name?: string }> & {\n    get(i: number): TabbableFieldsTypes[\"fields\"][number];\n    name: string;\n  };\n  children(...args: unknown[]): React.ReactNode;\n}\n\n// Render a tab for each field and content with the selected properties form\nexport default function TabbableFields({\n  fields,\n  children,\n}: TabbableFieldsTypes) {\n  const [selectedIndex, selectIndex] = useState(\n    // Preselect selection field tab\n    Math.max(\n      findIndex(\n        fields,\n        (name, index) => fields.get(index).type === \"selection\",\n      ),\n      0,\n    ),\n  );\n\n  return (\n    <div className=\"tabbable tabs-left mt-10 mb-4\">\n      <ul className=\"nav nav-tabs mb-4\">\n        {fields.map((fieldName, index) => {\n          const property = fields.get(index);\n          return (\n            <li\n              key={index}\n              className={selectedIndex === index ? \"active\" : undefined}\n            >\n              <a\n                href=\"#\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  selectIndex(index);\n                }}\n              >\n                {property.label || property.name}\n              </a>\n            </li>\n          );\n        })}\n      </ul>\n      <div className=\"tab-content\">\n        {children({\n          name: `${fields.name}[${selectedIndex}]`,\n          property: fields.get(selectedIndex),\n        })}\n      </div>\n    </div>\n  );\n}\n","import React, { useRef } from \"react\";\nimport { Field } from \"redux-form\";\nimport { defer } from \"lodash\";\n\ninterface AddOptionsFieldsTypes {\n  fields: Array<unknown> & { remove(i: number): void };\n  start?: number;\n  label?: string;\n}\n\n// Renders editable list of selection options\n// Component to be used in FieldArray\nexport default function AddOptionsFields({\n  fields,\n  start,\n  label,\n}: AddOptionsFieldsTypes) {\n  const lastInput = useRef(null);\n  const focusLast = () => {\n    lastInput.current && (lastInput.current as HTMLElement).focus();\n  };\n\n  return (\n    <div className=\"control-group\">\n      {label ? <label className=\"control-label\">{label}</label> : null}\n      <ol className=\"controls flex flex-col gap-2\" start={start}>\n        {fields.map((fieldName, index) => (\n          <li key={index}>\n            <div className=\"input-group\">\n              <Field\n                name={`${fieldName}.label`}\n                component=\"input\"\n                type=\"text\"\n                props={fields.length === index + 1 ? { ref: lastInput } : null}\n              />\n              <button\n                className=\"btn btn-danger\"\n                type=\"button\"\n                onClick={() => {\n                  fields.remove(index);\n                  defer(focusLast);\n                }}\n              >\n                <i className=\"fa-regular fa-trash\" />\n              </button>\n            </div>\n          </li>\n        ))}\n        <li className={\"flex justify-end\"}>\n          <button\n            className=\"btn btn-success\"\n            type=\"button\"\n            onClick={() => {\n              fields.push({ label: \"\" });\n              defer(focusLast);\n            }}\n          >\n            <i className=\"fa fa-plus\" /> Auswahloption hinzufügen\n          </button>\n        </li>\n      </ol>\n    </div>\n  );\n}\n","import React from \"react\";\nimport { FieldArray } from \"redux-form\";\nimport { isEmpty } from \"lodash\";\nimport SelectionOptionsFields from \"./selection/SelectionOptionsFields\";\n\ninterface PropertyFormTypes {\n  name: string;\n  property: { type: string; label?: string; name: string };\n}\n\n// Renders form for all available property settings depending on\n// property type, i.e. options for selections\nexport default function PropertyForm({ name, property }: PropertyFormTypes) {\n  const availableModifications: Array<React.ReactElement> = [];\n  if (property.type === \"selection\")\n    availableModifications.push(\n      <FieldArray\n        key=\"options\"\n        name={`${name}.options` as string}\n        component={SelectionOptionsFields as never}\n        label=\"Auswahloptionen bearbeiten\"\n      />,\n    );\n\n  return (\n    <>\n      <h4 className=\"mt-4 mb-6 font-semibold\">\n        {property.label || property.name}\n      </h4>\n      {isEmpty(availableModifications) ? (\n        <span className=\"text-muted\">\n          Dieses Feld kann nicht bearbeitet werden.\n        </span>\n      ) : (\n        availableModifications\n      )}\n    </>\n  );\n}\n","import type { TabbableFieldsTypes } from \"./TabbableFields\";\nimport type { FormTypes } from \"components/shared/reduxForm\";\nimport React from \"react\";\nimport { FieldArray } from \"redux-form\";\nimport { map } from \"lodash\";\nimport ReduxForm from \"../../shared/reduxForm\";\nimport finalizeSelectionOptions from \"./properties/selection/finalizeSelectionOptions\";\nimport TabbableFields from \"./TabbableFields\";\nimport PropertyForm from \"./properties/PropertyForm\";\n\ninterface PropertiesFieldsTypes {\n  fields: TabbableFieldsTypes[\"fields\"];\n}\n\nfunction PropertiesFields({ fields }: PropertiesFieldsTypes) {\n  return (\n    <TabbableFields fields={fields}>\n      {({ name, property }) => <PropertyForm name={name} property={property} />}\n    </TabbableFields>\n  );\n}\n\nconst addDefaultValuesToSelectionOptions = ({ properties, ...other }) => {\n  const modifiedProperties = map(properties, (p) => {\n    if (p.type !== \"selection\") return p;\n\n    return { ...p, options: finalizeSelectionOptions(p.options) };\n  });\n  return { properties: modifiedProperties, ...other };\n};\n\nexport default function BasicPropertySetForm({\n  onSubmit,\n  ...formProps\n}: FormTypes) {\n  return (\n    <ReduxForm\n      className=\"form-horizontal\"\n      {...formProps}\n      onSubmit={(values, ...args) =>\n        onSubmit(\n          addDefaultValuesToSelectionOptions(values as { properties: unknown }),\n          ...args,\n        )\n      }\n      renderChildren={() => (\n        <FieldArray name=\"properties\" component={PropertiesFields as never} />\n      )}\n    />\n  );\n}\n","import React from \"react\";\nimport { FieldArray } from \"redux-form\";\nimport { map } from \"lodash\";\nimport SelectionOptionsFields from \"../properties/selection/SelectionOptionsFields\";\n\ninterface AddOptionsTypes {\n  name: string;\n  existingOptions: Array<{ label: string }>;\n}\n\n// Allows editing of addOptions modifications\n// Shows existing options above fields for new options\nexport default function AddOptions({ name, existingOptions }: AddOptionsTypes) {\n  return (\n    <>\n      <label>Existierende Auswahloptionen</label>\n      <ol>\n        {map(existingOptions, ({ label }, index) => (\n          <li key={index}>\n            <input type=\"text\" value={label} disabled />\n          </li>\n        ))}\n      </ol>\n      <FieldArray\n        name={`${name}.modifications.addOptions` as string}\n        component={SelectionOptionsFields as never}\n        start={existingOptions.length + 1}\n        label=\"Neue Auswahloptionen ab dieser Ebene\"\n      />\n    </>\n  );\n}\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\nimport AddOptions from \"./AddOptions\";\n\n// Renders form for all available modifications depending on\n// property type, i.e. add_options for selections\n\ninterface ModificationFormTypes {\n  name: string;\n  property: {\n    type: string;\n    label?: string;\n    name: string;\n    options: Array<{ label: string }>;\n  };\n}\n\nexport default function ModificationForm({\n  name,\n  property,\n}: ModificationFormTypes) {\n  const availableModifications: Array<React.ReactNode> = [];\n  if (property.type === \"selection\")\n    availableModifications.push(\n      <AddOptions\n        key=\"add_options\"\n        existingOptions={property.options}\n        name={name}\n      />,\n    );\n\n  return (\n    <>\n      <h4>{property.label || property.name}</h4>\n      {isEmpty(availableModifications) ? (\n        <span className=\"muted\">Dieses Feld kann nicht bearbeitet werden.</span>\n      ) : (\n        availableModifications\n      )}\n    </>\n  );\n}\n","import type { TabbableFieldsTypes } from \"./TabbableFields\";\nimport type { FormTypes } from \"components/shared/reduxForm\";\nimport React, { useMemo } from \"react\";\nimport { FieldArray } from \"redux-form\";\nimport { get, reduce, map, isEmpty, forEach } from \"lodash\";\nimport ReduxForm from \"../../shared/reduxForm\";\nimport ModificationForm from \"./modifications/ModificationForm\";\nimport finalizeSelectionOptions from \"./properties/selection/finalizeSelectionOptions\";\nimport TabbableFields from \"./TabbableFields\";\n\n// Turn ModifiedPropertySet payload into something we can easily build a form for\n//\n// Convert { modifications: [], parent_property_set: { properties: [] } }\n// to { properties: [{ ..., modifications: { addOptions: [] }}] }\nconst addModificationsToProperties = ({\n  modifications,\n  parent_property_set: parentPropertySet,\n}) => {\n  const properties = get(parentPropertySet, \"properties\", []);\n  const addedOptionsByName = reduce(\n    modifications,\n    (result, { add_options }) => {\n      if (isEmpty(add_options)) return result;\n\n      result[add_options.name] = add_options.options;\n      return result;\n    },\n    {},\n  );\n\n  const propertiesWithModifications = map(properties, (property) => ({\n    ...property,\n    modifications: { addOptions: addedOptionsByName[property.name] || [] },\n  }));\n\n  return { properties: propertiesWithModifications };\n};\n\n// Turn ModifiedPropertySetForm data into something we can save\n//\n// Convert { properties: [{ name: 'foo', modifications: { addOptions: [{ label: 'Bar' }] }}] }\n// to { modifications: [{ add_options: { name: 'foo', options: [{ label: 'Bar', value: 'bar' }] }}]}\nconst pullModificationsFromProperties = ({ properties }) => {\n  const finalModifications: Array<{\n    add_options: { name: string; options: unknown };\n  }> = [];\n\n  forEach(properties, ({ name, modifications }) => {\n    if (!isEmpty(modifications.addOptions)) {\n      finalModifications.push({\n        add_options: {\n          name,\n          options: finalizeSelectionOptions(modifications.addOptions),\n        },\n      });\n    }\n  });\n\n  return { modifications: finalModifications };\n};\n\ninterface PropertiesFieldsTypes {\n  fields: TabbableFieldsTypes[\"fields\"];\n}\n\nfunction PropertiesFields({ fields }: PropertiesFieldsTypes) {\n  return (\n    <TabbableFields fields={fields}>\n      {({ name, property }) => (\n        <ModificationForm name={name} property={property} />\n      )}\n    </TabbableFields>\n  );\n}\n\nexport default function ModifiedPropertySetForm({\n  initialValues,\n  onSubmit,\n  ...formProps\n}: FormTypes) {\n  const transformedInitialValues = useMemo(\n    () =>\n      addModificationsToProperties(\n        initialValues as {\n          modifications: unknown;\n          parent_property_set: unknown;\n        },\n      ),\n    [initialValues],\n  );\n\n  return (\n    <ReduxForm\n      {...formProps}\n      initialValues={transformedInitialValues}\n      onSubmit={(values, ...args) =>\n        onSubmit(\n          pullModificationsFromProperties(values as { properties: unknown }),\n          ...args,\n        )\n      }\n      renderChildren={() => (\n        <FieldArray name=\"properties\" component={PropertiesFields as never} />\n      )}\n    />\n  );\n}\n","import React from \"react\";\nimport invariant from \"invariant\";\nimport BasicPropertySetForm from \"./BasicPropertySetForm\";\nimport ModifiedPropertySetForm from \"./ModifiedPropertySetForm\";\nimport InfoText from \"components/shared/InfoText\";\nimport {\n  usePersistPropertySet,\n  usePropertySet,\n} from \"components/shared/propertySets/api\";\n\nconst EDITOR_MAPPING = {\n  basic: BasicPropertySetForm,\n  modified: ModifiedPropertySetForm,\n};\n\ninterface EditorTypes {\n  name: string;\n  contextType: string;\n  contextId?: string;\n}\n\nexport default function Editor({ name, contextType, contextId }: EditorTypes) {\n  const { isLoading: loading, data: propertySet } = usePropertySet({\n    name,\n    contextId,\n    contextType,\n    inherit: false,\n  });\n\n  const { mutate: submitPropertySet } = usePersistPropertySet();\n\n  if (loading) return <div>{I18n.t(\"js.loading\")}</div>;\n  if (!propertySet?.type)\n    return <div>{I18n.t(\"js.errors.not_found.title\")}</div>;\n\n  const SpecializedForm = EDITOR_MAPPING[propertySet.type];\n\n  invariant(\n    SpecializedForm,\n    \"No form component for\",\n    propertySet.type,\n    \"defined in components/administration/propertySets/Editor.js\",\n  );\n\n  return (\n    <>\n      {contextType === \"network\" ? (\n        <InfoText translation=\"js.administration.property_sets.edit.hint_network\" />\n      ) : (\n        <InfoText translation=\"js.administration.property_sets.edit.hint_group\" />\n      )}\n      <SpecializedForm\n        form={name}\n        initialValues={propertySet}\n        onSubmit={(body) =>\n          submitPropertySet({\n            name,\n            contextId,\n            contextType,\n            body,\n          })\n        }\n        onSubmitSuccess={() => {\n          toastr.success(I18n.t(\"js.saving_successful\"));\n        }}\n        onSubmitFail={(error: Error) =>\n          toastr.error(\n            \"_error\" in error\n              ? (error[\"_error\"] as string)\n              : I18n.t(\"js.saving_failure\"),\n          )\n        }\n      />\n    </>\n  );\n}\n","import React from \"react\";\nimport PageTitle from \"../layout/PageTitle\";\nimport Editor from \"./propertySets/Editor\";\nimport GroupNavigation from \"components/layout/GroupNavigation\";\n\nexport default function PropertySetEdit({\n  groupSlug,\n  propertySetName,\n}: {\n  groupSlug?: string;\n  propertySetName: string;\n}) {\n  return (\n    <>\n      <PageTitle\n        title={I18n.t(\n          `js.groups.navigation.edit_${propertySetName}_property_set`,\n        )}\n      />\n      {groupSlug && <GroupNavigation groupSlug={groupSlug} />}\n      <Editor\n        name={propertySetName}\n        contextType={groupSlug ? \"group\" : \"network\"}\n        contextId={groupSlug}\n        key={propertySetName}\n      />\n    </>\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { QueryClientProvider } from \"react-query\";\nimport { Provider } from \"react-redux\";\nimport PropertySetEdit from \"./PropertySetEdit\";\nimport store from \"../../store\";\nimport queryClient from \"../../helpers/queryClient\";\n\nexport default function PropertySetEditWrapper({ propertySetName, groupSlug }) {\n  return (\n    <Provider store={store}>\n      <QueryClientProvider client={queryClient}>\n        <PropertySetEdit\n          propertySetName={propertySetName}\n          groupSlug={groupSlug}\n        />\n      </QueryClientProvider>\n    </Provider>\n  );\n}\n\nPropertySetEditWrapper.propTypes = {\n  propertySetName: PropTypes.string,\n};\n","import React from \"react\";\n\nimport { createRoot } from \"react-dom/client\";\nimport { Controller } from \"@hotwired/stimulus\";\nimport { isEmpty } from \"lodash\";\nimport PropertySetEditWrapper from \"../../components/administration/PropertySetEditWrapper\";\n\n// Connects to data-controller=\"shared--property-set-edit\"\nexport default class extends Controller {\n  static values = { name: String, groupSlug: String };\n  connect() {\n    const root = createRoot(this.element);\n    root.render(\n      <PropertySetEditWrapper\n        propertySetName={this.nameValue}\n        groupSlug={isEmpty(this.groupSlugValue) ? null : this.groupSlugValue}\n      />,\n    );\n  }\n\n  disconnect() {\n    createRoot(this.element).unmount();\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"shared--select-all\"\nexport default class extends Controller {\n  selectAllSelector = \"[type=checkbox][data-shared--select-all-targets-param]\";\n\n  connect() {\n    this.element.addEventListener(\"input\", this.#onInput);\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"input\", this.#onInput);\n  }\n\n  // Main action for select-all checkbox which specifies targets as param\n  // Toggles all targets\n  toggle(event) {\n    this.element.querySelectorAll(event.params.targets).forEach((input) => {\n      if (!this.#valid(input)) return;\n      input.checked = event.target.checked;\n    });\n  }\n\n  get #selectAllCheckboxes() {\n    return this.element.querySelectorAll(this.selectAllSelector);\n  }\n\n  #onInput = (event) => {\n    if (!this.#valid(event.target)) return;\n\n    // select all checkbox clicked, do nothing\n    if (event.target.matches(this.selectAllSelector)) return;\n\n    // iterate over all select all checkboxes and update their state if event was triggered by a target\n    this.#selectAllCheckboxes.forEach((selectAll) => {\n      if (\n        event.target.matches(selectAll.dataset[\"shared-SelectAllTargetsParam\"])\n      ) {\n        this.#determineAllChecked(selectAll);\n      }\n    });\n  };\n\n  #valid = (input) => input.type === \"checkbox\" && !input.disabled;\n\n  #determineAllChecked = (selectAll) => {\n    const checkboxes = Array.from(\n      this.element.querySelectorAll(\n        selectAll.dataset[\"shared-SelectAllTargetsParam\"],\n      ),\n    ).filter(this.#valid);\n    selectAll.checked = checkboxes.every((input) => input.checked);\n    selectAll.indeterminate =\n      !selectAll.checked && checkboxes.some((input) => input.checked);\n  };\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"shared--tabbar\"\nexport default class extends Controller {\n  onClickChangeTab(event) {\n    event.preventDefault();\n    const activeTabs = document.querySelectorAll(\".active\");\n\n    activeTabs.forEach(\n      (tab) => (tab.className = tab.className.replace(\"active\", \"\")),\n    );\n\n    event.target.parentElement.className += \" active\";\n    document.getElementById(event.target.href.split(\"#\")[1]).className +=\n      \" active\";\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n// Connects to data-controller=\"shared--toggle\"\n// Can be set on an element containing radio buttons with value 0 and 1 (target will be shown when 1 is checked)\n//   @see app/views/administration/appointment_settings/_form.html.haml\n// or on a single checkbox (target will be shown when checkbox is checked)\n//   @see app/views/administration/newsletter_settings/_form.html.haml\nexport default class extends Controller {\n  connect() {\n    this.target = this.element.dataset.toggleTarget;\n    this.toggle();\n  }\n\n  toggle() {\n    let show;\n    if (this.element.nodeName === \"INPUT\") {\n      show = this.element.checked;\n    } else {\n      show =\n        this.element.querySelector(\n          '[data-action=\"shared--toggle#toggle\"]:checked',\n        )?.value === \"1\";\n    }\n\n    document\n      .querySelectorAll(this.target)\n      .forEach((elem) => elem.classList.toggle(\"hidden\", !show));\n  }\n}\n","import { csrfTokenHeader } from \"../../helpers/api\";\n\nexport const allFactors = async () => {\n  const response = await fetch(\"/api/v1/authentication/factors\", {\n    credentials: \"include\",\n  });\n  return await response.json();\n};\n\nexport const getNewTotp = async () => {\n  const response = await fetch(\"/api/v1/authentication/factors/new?type=totp\", {\n    credentials: \"include\",\n  });\n  return response.json();\n};\n\nconst okJson = async (response) => {\n  if (response.status === 204) return null;\n\n  if (response.ok) {\n    return await response.json();\n  } else {\n    throw new Error(\n      response.status === 400\n        ? I18n.t(\"js.authentication.2fa.invalid_code\")\n        : I18n.t(\"js.generic_error\"),\n    );\n  }\n};\n\nexport const createNewTotp = async ({ data, validationCode }) => {\n  const response = await fetch(\"/api/v1/authentication/factors\", {\n    method: \"post\",\n    headers: { \"Content-Type\": \"application/json\" },\n    credentials: \"include\",\n    body: JSON.stringify({\n      type: data.type,\n      code: validationCode,\n      provisioning_uri: data.provisioning_uri,\n    }),\n  });\n\n  return await okJson(response);\n};\n\nexport const resetBackupCodes = async ({ id, validationCode }) => {\n  const response = await fetch(\n    `/api/v1/authentication/factors/${id}/reset-backup-codes`,\n    {\n      method: \"post\",\n      headers: { \"Content-Type\": \"application/json\" },\n      credentials: \"include\",\n      body: JSON.stringify({\n        code: validationCode,\n      }),\n    },\n  );\n\n  return await okJson(response);\n};\n\nexport const deleteFactor = async ({ id, validationCode }) => {\n  const response = await fetch(`/api/v1/authentication/factors/${id}`, {\n    method: \"delete\",\n    headers: { \"Content-Type\": \"application/json\" },\n    credentials: \"include\",\n    body: JSON.stringify({\n      code: validationCode || \"\",\n    }),\n  });\n\n  return await okJson(response);\n};\n\n// Reuses verification code to perform the 2fa step\n// Is used in sign_in context in enforced 2fa networks\n// after successfully adding a factor\nexport async function perform2fa(code) {\n  const result = await fetch(`/users/two_factor_authentication.json`, {\n    method: \"PUT\",\n    credentials: \"include\",\n    headers: {\n      ...csrfTokenHeader(),\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify({\n      code,\n    }),\n  });\n  return await result.json();\n}\n\n// E-Mail Two-Factor\nexport const getNewEmail = async () => {\n  const response = await fetch(\"/api/v1/authentication/factors/new?type=email\");\n  return response.json();\n};\n\nexport const createNewEmail = async ({ data, validationCode }) => {\n  const response = await fetch(\"/api/v1/authentication/factors\", {\n    method: \"post\",\n    headers: { \"Content-Type\": \"application/json\" },\n    credentials: \"include\",\n    body: JSON.stringify({\n      type: data.type,\n      code: validationCode,\n      secret_key: data.secret_key,\n    }),\n  });\n\n  return await okJson(response);\n};\n","import React from \"react\";\n\nconst RouteContext = React.createContext({\n  name: \"index\",\n});\n\nexport default RouteContext;\n","import React, { useContext } from \"react\";\nimport RouteContext from \"./RouteContext\";\nimport PropTypes from \"prop-types\";\nimport { reject } from \"lodash\";\nimport { useMutation } from \"react-query\";\nimport { queryClient } from \"helpers/queryClient\";\nimport { deleteFactor } from \"./api\";\n\nfunction TotpActions({ id, type }) {\n  return (\n    <>\n      {id ? (\n        <div className=\"flex flex-col gap-2\">\n          <ResetBackupCodesButton id={id} />\n          <DeleteFactorButton\n            id={id}\n            directDelete={false}\n            routeName=\"delete_totp\"\n            type={type}\n          />\n        </div>\n      ) : (\n        <AddFactorButton\n          route=\"add_totp\"\n          translation=\"js.authentication.2fa.add_authenticator_app\"\n        />\n      )}\n    </>\n  );\n}\n\nTotpActions.propTypes = {\n  id: PropTypes.string,\n  type: PropTypes.string,\n};\n\nfunction EmailActions({ id, type }) {\n  return (\n    <>\n      {id ? (\n        <DeleteFactorButton id={id} directDelete={true} type={type} />\n      ) : (\n        <AddFactorButton\n          route=\"add_email\"\n          translation=\"js.authentication.2fa.add_email\"\n        />\n      )}\n    </>\n  );\n}\n\nEmailActions.propTypes = {\n  id: PropTypes.string,\n  type: PropTypes.string,\n};\n\nconst LOOKUP = {\n  totp: TotpActions,\n  email: EmailActions,\n};\n\nfunction FactorActions({ id, type }) {\n  const Component = LOOKUP[type];\n\n  if (!Component)\n    return <div>{I18n.t(\"js.authentication.2fa.unkown_type\")}</div>;\n\n  return <Component id={id} type={type} />;\n}\n\nFactorActions.propTypes = {\n  id: PropTypes.string,\n  type: PropTypes.string,\n};\n\nfunction DeleteFactorButton({ id, directDelete, routeName, type }) {\n  const routeContext = useContext(RouteContext);\n  const { mutate: submitDeleteFactor } = useMutation(deleteFactor, {\n    onSuccess: () => {\n      let updatedFactors = reject(queryClient.getQueryData(\"factors\"), {\n        type: type,\n      });\n      updatedFactors.push({\n        id: null,\n        type: type,\n        last_used_at: null,\n      });\n\n      queryClient.setQueryData(\"factors\", updatedFactors);\n\n      window.toastr &&\n        window.toastr.success(\n          I18n.t(\"js.authentication.2fa.second_factor_deleted\"),\n        );\n    },\n  });\n\n  return (\n    <button\n      className=\"btn btn-sm btn-danger\"\n      onClick={(e) => {\n        e.preventDefault();\n\n        if (directDelete) {\n          submitDeleteFactor({\n            id,\n          });\n        } else {\n          routeContext.setRoute({ name: routeName, id });\n        }\n      }}\n    >\n      <i className=\"fa-regular fa-trash mr-2\" aria-hidden=\"true\" />\n      {I18n.t(\"js.authentication.2fa.delete_factor_title\")}\n    </button>\n  );\n}\n\nDeleteFactorButton.propTypes = {\n  id: PropTypes.string,\n  directDelete: PropTypes.bool,\n  routeName: PropTypes.string,\n  type: PropTypes.string,\n};\n\nexport function AbortButton() {\n  const routeContext = useContext(RouteContext);\n  return (\n    <button\n      className=\"btn btn-light\"\n      onClick={(event) => {\n        event.preventDefault();\n        routeContext.setRoute({ name: \"index\" });\n      }}\n    >\n      {I18n.t(\"js.cancel\")}\n    </button>\n  );\n}\n\nexport function BackButton() {\n  const routeContext = useContext(RouteContext);\n  return (\n    <button\n      className=\"btn btn-light\"\n      onClick={(event) => {\n        event.preventDefault();\n        routeContext.setRoute({ name: \"index\" });\n      }}\n    >\n      {I18n.t(\"js.authentication.2fa.continue\")}\n    </button>\n  );\n}\n\nexport function AddFactorButton({ route, translation }) {\n  const routeContext = useContext(RouteContext);\n  return (\n    <button\n      className=\"btn btn-sm btn-light\"\n      onClick={(event) => {\n        event.preventDefault();\n        routeContext.setRoute({ name: route });\n      }}\n    >\n      <i className=\"fa-regular fa-plus\" /> {I18n.t(translation)}\n    </button>\n  );\n}\n\nfunction ResetBackupCodesButton({ id }) {\n  const routeContext = useContext(RouteContext);\n  return (\n    <button\n      className=\"btn btn-light btn-sm\"\n      onClick={(e) => {\n        e.preventDefault();\n        routeContext.setRoute({ name: \"resetBackupCodes\", id });\n      }}\n    >\n      <i className=\"fa-regular fa-terminal mr-2\" aria-hidden=\"true\" />\n      {I18n.t(\"js.authentication.2fa.reset_backup_codes\")}\n    </button>\n  );\n}\n\nResetBackupCodesButton.propTypes = {\n  id: PropTypes.string,\n};\n\nexport default FactorActions;\n","import React from \"react\";\nimport { useQuery } from \"react-query\";\nimport { map } from \"lodash\";\nimport PropTypes from \"prop-types\";\nimport classNames from \"classnames\";\n\nimport { allFactors } from \"./api\";\nimport FactorActions from \"./FactorActions\";\n\nexport default function FactorsPage() {\n  const { data, isLoading, isError, error } = useQuery(\"factors\", allFactors);\n\n  if (isError) {\n    return <span>Error: {error.message}</span>;\n  }\n\n  return (\n    <>\n      <p className=\"mb-4\">{I18n.t(\"js.authentication.2fa.info_text\")}</p>\n      {isLoading ? (\n        <span className=\"loadingMessage\">\n          <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n        </span>\n      ) : (\n        <>\n          <ListFactors factors={data} />\n        </>\n      )}\n    </>\n  );\n}\n\nfunction ListFactors({ factors }) {\n  const factorDisplayName = {\n    totp: {\n      name: I18n.t(\"js.authentication.2fa.authenticator_app\"),\n      icon: \"fa-regular fa-mobile\",\n    },\n    email: {\n      name: I18n.t(\"js.authentication.2fa.email\"),\n      icon: \"fa-regular fa-envelope\",\n    },\n  };\n\n  return (\n    <div className=\"flex gap-4 flex-wrap\">\n      {map(factors, (factor) => (\n        <div key={factor.type} className=\"border-box p-3\">\n          <div className=\"media-body flex flex-col gap-2\">\n            <div className=\"flex gap-2 items-center\">\n              <i\n                className={classNames(\n                  factorDisplayName[factor.type].icon,\n                  \"text-2xl\",\n                )}\n              />\n              <div className=\"flex grow justify-between gap-2 items-center\">\n                <span className=\"font-semibold\">\n                  {factorDisplayName[factor.type].name}\n                </span>\n                {factor.id ? (\n                  <span className=\"badge bg-primary\">\n                    {\" \"}\n                    {I18n.t(\"js.authentication.2fa.activated\")}\n                  </span>\n                ) : (\n                  <span className=\"badge bg-neutral\">\n                    {I18n.t(\"js.authentication.2fa.deactivated\")}\n                  </span>\n                )}\n              </div>\n            </div>\n            <div>\n              <FactorActions {...factor} />\n            </div>\n          </div>\n        </div>\n      ))}\n    </div>\n  );\n}\n\nListFactors.propTypes = {\n  factors: PropTypes.array,\n};\n","import React, { useState, useEffect } from \"react\";\nimport { useQuery, useMutation } from \"react-query\";\nimport QRCode from \"qrcode.react\";\nimport { map, get, isEmpty } from \"lodash\";\nimport PropTypes from \"prop-types\";\n\nimport { AbortButton, BackButton } from \"./FactorActions\";\nimport { getNewTotp, createNewTotp, perform2fa } from \"./api\";\n\nfunction AddTotpPage({ context }) {\n  const [validationCode, setValidationCode] = useState(null);\n  const [redirectTo, setRedirectTo] = useState(null);\n  const { data, isLoading, isError } = useQuery(\"newTotpFactor\", getNewTotp, {\n    retry: false,\n  });\n  const {\n    mutate: submitCreateNewTotp,\n    data: createResult,\n    error: createError,\n    isLoading: isCreating,\n  } = useMutation(createNewTotp);\n\n  const backupCodes = get(createResult, \"backup_codes\");\n\n  useEffect(() => {\n    if (validationCode && backupCodes && context === \"sign_in\") {\n      perform2fa(validationCode).then((data) =>\n        setRedirectTo(data.redirect_to),\n      );\n    }\n  }, [validationCode, backupCodes]);\n\n  return isError ? (\n    <div className=\"alert alert-error\">{I18n.t(\"js.generic_error\")}</div>\n  ) : isLoading || isCreating ? (\n    <span className=\"loadingMessage\">\n      <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n    </span>\n  ) : backupCodes ? (\n    <BackupCodes\n      backupCodes={backupCodes}\n      context={context}\n      redirectTo={redirectTo}\n    />\n  ) : (\n    <>\n      <div className=\"alert alert-info\">\n        {I18n.t(\"js.authentication.2fa.add_totp_description\")}\n      </div>\n      <div className=\"mt-6\">\n        <h4> {I18n.t(\"js.authentication.2fa.add_totp_step1\")}</h4>\n        <div className=\"form-horizontal\">\n          <div className=\"control-group\">\n            <label className=\"control-label\">QR Code</label>\n            <div className=\"controls\">\n              <div className=\"border-box flex justify-center p-3\">\n                <QRCode\n                  renderAs=\"svg\"\n                  value={data.provisioning_uri}\n                  aria-label=\"QR-Code\"\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div className=\"mt-6\">\n        <h4>{I18n.t(\"js.authentication.2fa.add_totp_step2\")}</h4>\n        <form\n          className=\"form-horizontal\"\n          onSubmit={(e) => {\n            e.preventDefault();\n\n            const { verificationCodeInput } = e.target.elements;\n            if (isEmpty(verificationCodeInput.value)) return;\n\n            submitCreateNewTotp({\n              data,\n              validationCode: verificationCodeInput.value,\n            });\n            setValidationCode(verificationCodeInput.value);\n          }}\n        >\n          <div className=\"control-group\">\n            <label className=\"control-label\" htmlFor=\"verificationCodeInput\">\n              {I18n.t(\"js.authentication.2fa.valid_code\")}\n            </label>\n            <div className=\"controls\">\n              <input\n                id=\"verificationCodeInput\"\n                type=\"text\"\n                inputMode=\"numeric\"\n                name=\"code\"\n                autoComplete=\"off\"\n                placeholder={I18n.t(\"js.authentication.2fa.input_placeholder\")}\n                required\n                autoFocus\n              />\n              {createError ? (\n                <div className=\"alert alert-danger\">{createError.message}</div>\n              ) : null}\n            </div>\n          </div>\n\n          <div className=\"flex gap-2 justify-end mt-4\">\n            <AbortButton />\n            <button className=\"btn btn-primary\" type=\"submit\">\n              {I18n.t(\"js.authentication.2fa.add_2fa\")}\n            </button>\n          </div>\n        </form>\n      </div>\n    </>\n  );\n}\n\nAddTotpPage.propTypes = {\n  context: PropTypes.oneOf([undefined, \"sign_in\"]),\n};\n\nexport function BackupCodes({ backupCodes, context, redirectTo }) {\n  const downloadCodesAsTxtFile = () => {\n    const element = document.createElement(\"a\");\n    const file = new Blob([map(backupCodes, (code) => `${code}\\n`).join(\"\")], {\n      type: \"text/plain\",\n    });\n    element.href = URL.createObjectURL(file);\n    element.download = \"backup_codes.txt\";\n    document.body.appendChild(element); // Required for this to work in FireFox\n    element.click();\n  };\n\n  return (\n    <>\n      <div className=\"btn-toolbar justify-end\">\n        <button\n          className=\"btn btn-primary\"\n          onClick={() => downloadCodesAsTxtFile()}\n        >\n          {I18n.t(\"js.authentication.2fa.save_backup_codes_as_txt\")}\n        </button>\n      </div>\n      <h4>{I18n.t(\"js.authentication.2fa.backup_codes_title\")}</h4>\n      {/*TODO change to markdown and extract <Markdown> component*/}\n      <div className=\"alert alert-info\">\n        <p\n          dangerouslySetInnerHTML={{\n            __html: I18n.t(\n              \"js.authentication.2fa.backup_codes_description_html\",\n            ),\n          }}\n        />\n      </div>\n      <div className=\"form-horizontal\">\n        <div className=\"control-group\">\n          <label className=\"control-label\">Backup Codes</label>\n          <div className=\"controls\">\n            <div className=\"border-box p-3\">\n              <pre>\n                {map(backupCodes, (code) => (\n                  <div key={code}>\n                    {code}\n                    <br />\n                  </div>\n                ))}\n              </pre>\n            </div>\n          </div>\n        </div>\n        <div className=\"flex gap-2 justify-end\">\n          {context === \"sign_in\" ? (\n            <a className=\"btn btn-light\" href={redirectTo || \"/\"}>\n              {I18n.t(\"js.authentication.2fa.continue\")}\n            </a>\n          ) : (\n            <BackButton />\n          )}\n        </div>\n      </div>\n    </>\n  );\n}\n\nBackupCodes.propTypes = {\n  context: PropTypes.oneOf([undefined, \"sign_in\"]),\n  backupCodes: PropTypes.array,\n  redirectTo: PropTypes.string,\n};\n\nexport default AddTotpPage;\n","import React, { useContext } from \"react\";\nimport { useMutation } from \"react-query\";\nimport PropTypes from \"prop-types\";\n\nimport { deleteFactor } from \"./api\";\nimport RouteContext from \"./RouteContext\";\nimport { AbortButton } from \"./FactorActions\";\n\nfunction DeleteFactorPage({ id }) {\n  const routeContext = useContext(RouteContext);\n  const { mutate: submitDeleteFactor, error: deleteError } = useMutation(\n    deleteFactor,\n    {\n      onSuccess: () => {\n        routeContext.setRoute({ name: \"index\" });\n        window.toastr &&\n          window.toastr.success(\n            I18n.t(\"js.authentication.2fa.second_factor_deleted\"),\n          );\n      },\n    },\n  );\n\n  return (\n    <>\n      <p>{I18n.t(\"js.authentication.2fa.delete_factor_description\")}</p>\n      <form\n        className=\"form-horizontal\"\n        onSubmit={(e) => {\n          e.preventDefault();\n\n          submitDeleteFactor({\n            id,\n            validationCode: e.target.code.value,\n          });\n        }}\n      >\n        <div className=\"control-group\">\n          <label className=\"control-label\">\n            {I18n.t(\"js.authentication.2fa.valid_code\")}\n          </label>\n          <div className=\"controls\">\n            <input\n              type=\"text\"\n              name=\"code\"\n              inputMode=\"numeric\"\n              autoComplete=\"off\"\n              placeholder={I18n.t(\"js.authentication.2fa.input_placeholder\")}\n              required\n              autoFocus\n            />\n          </div>\n        </div>\n\n        <div className=\"flex gap-2 justify-end\">\n          <AbortButton />\n          <button className=\"btn btn-primary\" type=\"submit\">\n            {I18n.t(\"js.authentication.2fa.delete_factor\")}\n          </button>\n        </div>\n      </form>\n      {deleteError ? (\n        <div className=\"alert alert-danger\">{deleteError.message}</div>\n      ) : null}\n    </>\n  );\n}\n\nDeleteFactorPage.propTypes = {\n  id: PropTypes.string,\n};\n\nexport default DeleteFactorPage;\n","import React from \"react\";\nimport { useMutation } from \"react-query\";\nimport { get } from \"lodash\";\nimport PropTypes from \"prop-types\";\n\nimport { resetBackupCodes } from \"./api\";\nimport { BackupCodes } from \"./AddTotpPage\";\nimport { AbortButton } from \"./FactorActions\";\n\nfunction ResetBackupCodes({ id }) {\n  const {\n    mutate: submitResetBackupCodes,\n    data: resetBackupCodesResult,\n    error: resetError,\n    isLoading,\n  } = useMutation(resetBackupCodes);\n\n  const backupCodes = get(resetBackupCodesResult, \"backup_codes\");\n\n  return (\n    <div className=\"span10\">\n      {isLoading ? (\n        <span className=\"loadingMessage\">\n          <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n        </span>\n      ) : backupCodes ? (\n        <BackupCodes backupCodes={backupCodes} />\n      ) : (\n        <>\n          <p\n            dangerouslySetInnerHTML={{\n              __html: I18n.t(\n                \"js.authentication.2fa.reset_backup_codes_description_html\",\n              ),\n            }}\n          />\n\n          <form\n            onSubmit={(e) => {\n              e.preventDefault();\n\n              submitResetBackupCodes({\n                id,\n                validationCode: e.target.code.value,\n              });\n            }}\n          >\n            <div className=\"control-group\">\n              <label className=\"control-label\"></label>\n              <div className=\"controls\">\n                <input\n                  type=\"text\"\n                  name=\"code\"\n                  autoComplete=\"off\"\n                  placeholder={I18n.t(\n                    \"js.authentication.2fa.input_placeholder\",\n                  )}\n                  required\n                  autoFocus\n                />\n              </div>\n            </div>\n\n            <div className=\"btn-toolbar\">\n              <div className=\"btn-group\">\n                <button className=\"btn btn-primary\" type=\"submit\">\n                  {I18n.t(\"js.authentication.2fa.reset_backup_codes\")}\n                </button>\n              </div>\n              <div className=\"btn-group\">\n                <AbortButton />\n              </div>\n            </div>\n          </form>\n          {resetError ? (\n            <div className=\"alert alert-danger\">{resetError.message}</div>\n          ) : null}\n        </>\n      )}\n    </div>\n  );\n}\n\nResetBackupCodes.propTypes = {\n  id: PropTypes.string,\n};\n\nexport default ResetBackupCodes;\n","import React, { useContext, useEffect, useState } from \"react\";\nimport { useQuery, useMutation } from \"react-query\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\n\nimport { AbortButton } from \"./FactorActions\";\nimport { getNewEmail, createNewEmail, perform2fa } from \"./api\";\nimport RouteContext from \"./RouteContext\";\n\nfunction AddEmailPage({ context }) {\n  const routeContext = useContext(RouteContext);\n  const [validationCode, setValidationCode] = useState(null);\n\n  const { data, isLoading, isError } = useQuery(\"newEmailFactor\", getNewEmail, {\n    retry: false,\n  });\n  const {\n    mutate: submitCreateNewEmail,\n    data: createResult,\n    error: createError,\n    isLoading: isCreating,\n  } = useMutation(createNewEmail);\n\n  useEffect(() => {\n    if (validationCode && createResult) {\n      if (context === \"sign_in\") {\n        perform2fa(validationCode).then((data) => {\n          window.location.href = data.redirect_to;\n        });\n      } else {\n        routeContext.setRoute({ name: \"index\" });\n      }\n    }\n  }, [validationCode, createResult]);\n  return isError ? (\n    <div className=\"alert alert-error max-w-prose\">\n      {I18n.t(\"js.generic_error\")}\n    </div>\n  ) : isLoading || isCreating ? (\n    <span className=\"loadingMessage\">\n      <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n    </span>\n  ) : createResult ? null : (\n    <>\n      <div className=\"max-w-prose alert alert-info text-sm\">\n        {I18n.t(\"js.authentication.2fa.add_email_description\")}\n      </div>\n      <form\n        className=\"form-horizontal\"\n        onSubmit={(e) => {\n          e.preventDefault();\n          const { verificationCodeInput } = e.target.elements;\n          if (isEmpty(verificationCodeInput.value)) return;\n          submitCreateNewEmail({\n            data,\n            validationCode: verificationCodeInput.value,\n          });\n          setValidationCode(verificationCodeInput.value);\n        }}\n      >\n        <div className=\"control-group\">\n          <label className=\"control-label\" htmlFor=\"verificationCodeInput\">\n            {I18n.t(\"js.authentication.2fa.valid_code\")}\n          </label>\n          <div className=\"controls\">\n            <input\n              id=\"verificationCodeInput\"\n              type=\"text\"\n              name=\"code\"\n              inputMode=\"numeric\"\n              autoComplete=\"off\"\n              placeholder={I18n.t(\"js.authentication.2fa.input_placeholder\")}\n              required\n            />\n            {createError ? (\n              <div className=\"alert alert-danger mt-2 max-w-prose\">\n                {createError.message}\n              </div>\n            ) : null}\n          </div>\n        </div>\n\n        <div className=\"flex gap-2 justify-end\">\n          <AbortButton />\n          <button className=\"btn btn-primary\" type=\"submit\">\n            {I18n.t(\"js.authentication.2fa.add_2fa\")}\n          </button>\n        </div>\n      </form>\n    </>\n  );\n}\n\nAddEmailPage.propTypes = {\n  context: PropTypes.oneOf([undefined, \"sign_in\"]),\n};\n\nexport default AddEmailPage;\n","import React, { useState, useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { QueryClientProvider, QueryClient } from \"react-query\";\n\nimport FactorsPage from \"./FactorsPage\";\nimport AddTotpPage from \"./AddTotpPage\";\nimport DeleteFactorPage from \"./DeleteFactorPage\";\nimport ResetBackupCodes from \"./ResetBackupCodesPage\";\nimport RouteContext from \"./RouteContext\";\nimport AddEmailPage from \"./AddEmailPage\";\n\nfunction FactorsWrapper({ context }) {\n  const [route, setRoute] = useState({ name: \"index\" });\n\n  const value = { ...route, setRoute };\n  const queryClient = new QueryClient({\n    defaultOptions: {\n      queries: {\n        refetchOnWindowFocus: false,\n      },\n    },\n  });\n\n  return (\n    <RouteContext.Provider value={value}>\n      <QueryClientProvider client={queryClient}>\n        <FactorsContainer context={context} />\n      </QueryClientProvider>\n    </RouteContext.Provider>\n  );\n}\n\nFactorsWrapper.propTypes = {\n  context: PropTypes.oneOf([undefined, \"sign_in\", \"\"]),\n};\n\nfunction FactorsContainer({ context }) {\n  const routeContext = useContext(RouteContext);\n\n  if (routeContext.name === \"index\") return <FactorsPage />;\n  if (routeContext.name === \"add_totp\")\n    return <AddTotpPage context={context} />;\n  if (routeContext.name === \"add_email\")\n    return <AddEmailPage context={context} />;\n\n  if (routeContext.name === \"delete_totp\")\n    return <DeleteFactorPage id={routeContext.id} />;\n\n  if (routeContext.name === \"resetBackupCodes\")\n    return <ResetBackupCodes id={routeContext.id} />;\n\n  return null;\n}\n\nFactorsContainer.propTypes = {\n  context: PropTypes.oneOf([undefined, \"sign_in\", \"\"]),\n};\n\nexport default FactorsWrapper;\n","import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { Controller } from \"@hotwired/stimulus\";\nimport FactorsWrapper from \"../components/authentication/FactorsWrapper\";\n\n// Connects to data-controller=\"two-factor-authentications\"\nexport default class extends Controller {\n  static values = { context: String };\n\n  connect() {\n    const root = createRoot(this.element);\n    root.render(<FactorsWrapper context={this.contextValue} />);\n  }\n\n  disconnect() {\n    createRoot(this.element).unmount();\n  }\n}\n","// This file is auto-generated by ./bin/rails stimulus:manifest:update\n// Run that command whenever you add a new controller or create them with\n// ./bin/rails generate stimulus controllerName\n\nimport { application } from \"./application\";\n\nimport AccordionScrollController from \"./accordion_scroll_controller\";\napplication.register(\"accordion-scroll\", AccordionScrollController);\n\nimport Administration__Activitystream__CloseActivityReplyMonthController from \"./administration/activitystream/close_activity_reply_month_controller\";\napplication.register(\n  \"administration--activitystream--close-activity-reply-month\",\n  Administration__Activitystream__CloseActivityReplyMonthController,\n);\n\nimport Administration__EditCategoriesController from \"./administration/edit_categories_controller\";\napplication.register(\n  \"administration--edit-categories\",\n  Administration__EditCategoriesController,\n);\n\nimport Administration__Groups__JoinRequestMessageController from \"./administration/groups/join_request_message_controller\";\napplication.register(\n  \"administration--groups--join-request-message\",\n  Administration__Groups__JoinRequestMessageController,\n);\n\nimport Administration__Invites__SendBatchActionsController from \"./administration/invites/send_batch_actions_controller\";\napplication.register(\n  \"administration--invites--send-batch-actions\",\n  Administration__Invites__SendBatchActionsController,\n);\n\nimport Administration__Invites__SentController from \"./administration/invites/sent_controller\";\napplication.register(\n  \"administration--invites--sent\",\n  Administration__Invites__SentController,\n);\n\nimport Administration__Invites__ToggleBatchActionsController from \"./administration/invites/toggle_batch_actions_controller\";\napplication.register(\n  \"administration--invites--toggle-batch-actions\",\n  Administration__Invites__ToggleBatchActionsController,\n);\n\nimport Administration__Newsletter__DragAndDropController from \"./administration/newsletter/drag_and_drop_controller\";\napplication.register(\n  \"administration--newsletter--drag-and-drop\",\n  Administration__Newsletter__DragAndDropController,\n);\n\nimport Administration__Newsletter__IntervalController from \"./administration/newsletter/interval_controller\";\napplication.register(\n  \"administration--newsletter--interval\",\n  Administration__Newsletter__IntervalController,\n);\n\nimport Administration__Newsletter__UnlayerFormController from \"./administration/newsletter/unlayer_form_controller\";\napplication.register(\n  \"administration--newsletter--unlayer-form\",\n  Administration__Newsletter__UnlayerFormController,\n);\n\nimport Administration__RoleAssignmentsController from \"./administration/role_assignments_controller\";\napplication.register(\n  \"administration--role-assignments\",\n  Administration__RoleAssignmentsController,\n);\n\nimport Administration__Teams__FallbackUpnAssignmentsController from \"./administration/teams/fallback_upn_assignments_controller\";\napplication.register(\n  \"administration--teams--fallback-upn-assignments\",\n  Administration__Teams__FallbackUpnAssignmentsController,\n);\n\nimport ClipboardController from \"./clipboard_controller\";\napplication.register(\"clipboard\", ClipboardController);\n\nimport ExternalActivitystreamsController from \"./external_activitystreams_controller\";\napplication.register(\n  \"external-activitystreams\",\n  ExternalActivitystreamsController,\n);\n\nimport Invites__HandleExternalInviteController from \"./invites/handle_external_invite_controller\";\napplication.register(\n  \"invites--handle-external-invite\",\n  Invites__HandleExternalInviteController,\n);\n\nimport MinistryController from \"./ministry_controller\";\napplication.register(\"ministry\", MinistryController);\n\nimport Shared__GoBackButtonController from \"./shared/go_back_button_controller\";\napplication.register(\"shared--go-back-button\", Shared__GoBackButtonController);\n\nimport Shared__PropertySetEditController from \"./shared/property_set_edit_controller\";\napplication.register(\n  \"shared--property-set-edit\",\n  Shared__PropertySetEditController,\n);\n\nimport Shared__SelectAllController from \"./shared/select_all_controller\";\napplication.register(\"shared--select-all\", Shared__SelectAllController);\n\nimport Shared__TabbarController from \"./shared/tabbar_controller\";\napplication.register(\"shared--tabbar\", Shared__TabbarController);\n\nimport Shared__ToggleController from \"./shared/toggle_controller\";\napplication.register(\"shared--toggle\", Shared__ToggleController);\n\nimport TwoFactorAuthenticationsController from \"./two_factor_authentications_controller\";\napplication.register(\n  \"two-factor-authentications\",\n  TwoFactorAuthenticationsController,\n);\n","import \"./bootstrap.scss\";\n\nimport \"bootstrap/js/dist/dropdown\";\nimport Modal from \"bootstrap/js/dist/modal\";\nimport \"bootstrap/js/dist/alert\";\nimport \"bootstrap/js/dist/collapse\";\nimport \"bootstrap/js/dist/tab\";\nimport Tooltip from \"bootstrap/js/dist/tooltip\";\nimport Popover from \"bootstrap/js/dist/popover\";\n\nwindow.bootstrap = { Modal, Tooltip, Popover };\n","/**\n * Do not edit this file manually!\n *\n * It is generated by scripts/dev/generate_fontawesome_manifest.rb\n * User your \"fa-sold fa-star\" in a view/template/component and rerun the script\n */\n\nimport { library, dom, config } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n  solid,\n  brands,\n  regular,\n  light,\n} from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nconfig.autoReplaceSvg = \"nest\";\n\nlibrary.add(\n  brands(\"dailymotion\"),\n  brands(\"deviantart\"),\n  brands(\"facebook\"),\n  brands(\"flickr\"),\n  brands(\"instagram\"),\n  brands(\"kickstarter\"),\n  brands(\"microsoft\"),\n  brands(\"slideshare\"),\n  brands(\"soundcloud\"),\n  brands(\"spotify\"),\n  brands(\"twitter\"),\n  brands(\"vimeo\"),\n  brands(\"youtube\"),\n  light(\"cloud-arrow-down\"),\n  light(\"envelope\"),\n  light(\"file\"),\n  light(\"file-audio\"),\n  light(\"file-code\"),\n  light(\"file-csv\"),\n  light(\"file-excel\"),\n  light(\"file-image\"),\n  light(\"file-lines\"),\n  light(\"file-pdf\"),\n  light(\"file-powerpoint\"),\n  light(\"file-video\"),\n  light(\"file-word\"),\n  light(\"file-zipper\"),\n  light(\"image\"),\n  light(\"mobile-screen-button\"),\n  light(\"paperclip-vertical\"),\n  regular(\"align-center\"),\n  regular(\"align-left\"),\n  regular(\"align-right\"),\n  regular(\"angle-left\"),\n  regular(\"angle-right\"),\n  regular(\"arrow-down-to-bracket\"),\n  regular(\"arrow-left\"),\n  regular(\"arrows\"),\n  regular(\"arrows-repeat\"),\n  regular(\"arrows-up-down-left-right\"),\n  regular(\"bars\"),\n  regular(\"bold\"),\n  regular(\"bolt\"),\n  regular(\"bookmark\"),\n  regular(\"box-archive\"),\n  regular(\"bullhorn\"),\n  regular(\"calendar\"),\n  regular(\"calendar-day\"),\n  regular(\"calendar-plus\"),\n  regular(\"calendar-range\"),\n  regular(\"chart-column\"),\n  regular(\"check\"),\n  regular(\"check-circle\"),\n  regular(\"check-square\"),\n  regular(\"chevron-down\"),\n  regular(\"chevron-up\"),\n  regular(\"circle\"),\n  regular(\"circle-check\"),\n  regular(\"circle-info\"),\n  regular(\"circle-notch\"),\n  regular(\"circle-play\"),\n  regular(\"circle-plus\"),\n  regular(\"clipboard\"),\n  regular(\"clock\"),\n  regular(\"clone\"),\n  regular(\"cloud-download\"),\n  regular(\"cloud-upload\"),\n  regular(\"comment\"),\n  regular(\"comment-dots\"),\n  regular(\"comment-slash\"),\n  regular(\"comments\"),\n  regular(\"desktop\"),\n  regular(\"earth-europe\"),\n  regular(\"edit\"),\n  regular(\"ellipsis\"),\n  regular(\"ellipsis-h\"),\n  regular(\"ellipsis-vertical\"),\n  regular(\"envelope\"),\n  regular(\"exchange\"),\n  regular(\"eye\"),\n  regular(\"file\"),\n  regular(\"file-code\"),\n  regular(\"file-excel\"),\n  regular(\"file-powerpoint\"),\n  regular(\"file-text\"),\n  regular(\"file-word\"),\n  regular(\"files\"),\n  regular(\"filter\"),\n  regular(\"floppy-disk\"),\n  regular(\"folder\"),\n  regular(\"folder-open\"),\n  regular(\"handshake\"),\n  regular(\"id-card\"),\n  regular(\"image\"),\n  regular(\"image\"),\n  regular(\"inbox\"),\n  regular(\"italic\"),\n  regular(\"keyboard\"),\n  regular(\"link\"),\n  regular(\"list\"),\n  regular(\"list-ol\"),\n  regular(\"list-ul\"),\n  regular(\"location-dot\"),\n  regular(\"lock\"),\n  regular(\"mailbox\"),\n  regular(\"map-location\"),\n  regular(\"map-location-dot\"),\n  regular(\"messages\"),\n  regular(\"minus-circle\"),\n  regular(\"mobile\"),\n  regular(\"paperclip-vertical\"),\n  regular(\"pen-to-square\"),\n  regular(\"pencil\"),\n  regular(\"pencil-square\"),\n  regular(\"pipe\"),\n  regular(\"plus\"),\n  regular(\"plus-circle\"),\n  regular(\"plus-square\"),\n  regular(\"power-off\"),\n  regular(\"scissors\"),\n  regular(\"search\"),\n  regular(\"share-square\"),\n  regular(\"sidebar\"),\n  regular(\"spinner\"),\n  regular(\"square\"),\n  regular(\"star\"),\n  regular(\"suitcase-rolling\"),\n  regular(\"table\"),\n  regular(\"tags\"),\n  regular(\"terminal\"),\n  regular(\"thumbs-up\"),\n  regular(\"times\"),\n  regular(\"times-circle\"),\n  regular(\"trash\"),\n  regular(\"trash-can\"),\n  regular(\"triangle-exclamation\"),\n  regular(\"underline\"),\n  regular(\"unlock\"),\n  regular(\"upload\"),\n  regular(\"user\"),\n  regular(\"user-circle\"),\n  regular(\"user-plus\"),\n  regular(\"user-xmark\"),\n  regular(\"users\"),\n  regular(\"virus\"),\n  regular(\"volume-xmark\"),\n  regular(\"xmark\"),\n  solid(\"adjust\"),\n  solid(\"align-justify\"),\n  solid(\"angle-double-down\"),\n  solid(\"angle-double-left\"),\n  solid(\"angle-double-right\"),\n  solid(\"angle-double-up\"),\n  solid(\"angle-left\"),\n  solid(\"angle-right\"),\n  solid(\"archive\"),\n  solid(\"arrow-circle-up\"),\n  solid(\"arrow-down\"),\n  solid(\"arrow-left\"),\n  solid(\"arrow-right\"),\n  solid(\"arrows\"),\n  solid(\"arrows-alt\"),\n  solid(\"arrows-repeat\"),\n  solid(\"at\"),\n  solid(\"ban\"),\n  solid(\"bar-chart\"),\n  solid(\"bars\"),\n  solid(\"bold\"),\n  solid(\"bold\"),\n  solid(\"book\"),\n  solid(\"bug\"),\n  solid(\"bullhorn\"),\n  solid(\"calendar\"),\n  solid(\"caret-down\"),\n  solid(\"caret-left\"),\n  solid(\"caret-right\"),\n  solid(\"certificate\"),\n  solid(\"check\"),\n  solid(\"check-square\"),\n  solid(\"chevron-circle-down\"),\n  solid(\"chevron-down\"),\n  solid(\"chevron-left\"),\n  solid(\"chevron-right\"),\n  solid(\"chevron-up\"),\n  solid(\"circle\"),\n  solid(\"circle-info\"),\n  solid(\"circle-question\"),\n  solid(\"clone\"),\n  solid(\"cloud-download\"),\n  solid(\"code\"),\n  solid(\"code\"),\n  solid(\"code-fork\"),\n  solid(\"coffee\"),\n  solid(\"cog\"),\n  solid(\"cogs\"),\n  solid(\"columns\"),\n  solid(\"comment\"),\n  solid(\"compress\"),\n  solid(\"desktop\"),\n  solid(\"ellipsis\"),\n  solid(\"ellipsis-h\"),\n  solid(\"envelope\"),\n  solid(\"exclamation\"),\n  solid(\"expand\"),\n  solid(\"external-link\"),\n  solid(\"eye\"),\n  solid(\"eye-slash\"),\n  solid(\"file\"),\n  solid(\"file-csv\"),\n  solid(\"file-excel\"),\n  solid(\"filter\"),\n  solid(\"flag\"),\n  solid(\"flag-checkered\"),\n  solid(\"folder\"),\n  solid(\"folder-open\"),\n  solid(\"font\"),\n  solid(\"globe\"),\n  solid(\"grip-dots\"),\n  solid(\"hashtag\"),\n  solid(\"header\"),\n  solid(\"header\"),\n  solid(\"home\"),\n  solid(\"image\"),\n  solid(\"info-circle\"),\n  solid(\"italic\"),\n  solid(\"italic\"),\n  solid(\"key\"),\n  solid(\"link\"),\n  solid(\"link\"),\n  solid(\"list\"),\n  solid(\"list\"),\n  solid(\"list-alt\"),\n  solid(\"list-ol\"),\n  solid(\"list-ul\"),\n  solid(\"lock\"),\n  solid(\"mailbox\"),\n  solid(\"map-marker\"),\n  solid(\"message-xmark\"),\n  solid(\"money-bill\"),\n  solid(\"paper-plane\"),\n  solid(\"paperclip\"),\n  solid(\"pencil\"),\n  solid(\"pencil-square\"),\n  solid(\"phone\"),\n  solid(\"pipe\"),\n  solid(\"play\"),\n  solid(\"play-circle\"),\n  solid(\"plus\"),\n  solid(\"plus-circle\"),\n  solid(\"print\"),\n  solid(\"question\"),\n  solid(\"question-circle\"),\n  solid(\"quote-left\"),\n  solid(\"quote-right\"),\n  solid(\"refresh\"),\n  solid(\"reply\"),\n  solid(\"reply-all\"),\n  solid(\"save\"),\n  solid(\"search\"),\n  solid(\"search\"),\n  solid(\"share\"),\n  solid(\"shield\"),\n  solid(\"sort\"),\n  solid(\"sort-asc\"),\n  solid(\"sort-desc\"),\n  solid(\"sort-down\"),\n  solid(\"sort-numeric-asc\"),\n  solid(\"sort-up\"),\n  solid(\"space-shuttle\"),\n  solid(\"spinner\"),\n  solid(\"square\"),\n  solid(\"square-o\"),\n  solid(\"star\"),\n  solid(\"step-backward\"),\n  solid(\"step-forward\"),\n  solid(\"strikethrough\"),\n  solid(\"tag\"),\n  solid(\"tags\"),\n  solid(\"thumbs-up\"),\n  solid(\"thumbtack\"),\n  solid(\"timer\"),\n  solid(\"times\"),\n  solid(\"times-circle\"),\n  solid(\"toggle-off\"),\n  solid(\"toggle-on\"),\n  solid(\"trash\"),\n  solid(\"underline\"),\n  solid(\"unlock\"),\n  solid(\"unlock-alt\"),\n  solid(\"user\"),\n  solid(\"user-circle\"),\n  solid(\"user-minus\"),\n  solid(\"user-plus\"),\n  solid(\"user-secret\"),\n  solid(\"user-times\"),\n  solid(\"users\"),\n  solid(\"volume-xmark\"),\n  solid(\"xmark\"),\n);\n\ndom.watch();\n","import React, { useState } from \"react\";\nimport {\n  get,\n  reduce,\n  isEmpty,\n  values,\n  countBy,\n  sortedIndexBy,\n  lowerCase,\n} from \"lodash\";\nimport { NameWithProfileField } from \"components/memberships/MemberNameWithAdditions\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid, regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport classNames from \"classnames\";\n\nconst SMALL_BREAKPOINT = 640;\n\nfunction StatusIcon({ status, className }) {\n  switch (status) {\n    case \"open\":\n    case \"invited\":\n      return (\n        <span className={`fa-layers ${className}`}>\n          <FontAwesomeIcon\n            className={\"text-white w-3\"}\n            icon={solid(\"circle\")}\n          />\n          <FontAwesomeIcon\n            className={\"text-muted w-3\"}\n            icon={solid(\"adjust\")}\n          />\n        </span>\n      );\n    case \"accepted\":\n      return (\n        <FontAwesomeIcon\n          className={`accept-invite-text w-3 ${className}`}\n          icon={solid(\"circle\")}\n        />\n      );\n    default:\n      return (\n        <span className={`fa-layers ${className}`}>\n          <FontAwesomeIcon\n            className={\"text-white w-3\"}\n            icon={solid(\"circle\")}\n          />\n          <FontAwesomeIcon\n            className={\"text-danger w-3\"}\n            icon={regular(\"circle\")}\n          />\n        </span>\n      );\n  }\n}\n\nfunction Role({ name, plural_name, participants, display_type }) {\n  const [collapsed, setCollapsed] = useState(\n    display_type === \"grouped\" || window.innerWidth < SMALL_BREAKPOINT,\n  );\n\n  return (\n    <div style={isEmpty(participants) ? { display: \"none\" } : null}>\n      <h3\n        onClick={() => setCollapsed(!collapsed)}\n        style={{ cursor: \"pointer\" }}\n        className={\"font-bold mb-4\"}\n      >\n        {name || plural_name} ({countBy(participants, \"status\").accepted || 0}){\" \"}\n        <FontAwesomeIcon\n          className={classNames(\"text-muted transition-transform fa-xs ml-1\", {\n            \"rotate-90\": !collapsed,\n          })}\n          icon={regular(\"chevron-right\")}\n        />\n      </h3>\n      <ul\n        className=\"membership-list participant-list\"\n        style={collapsed ? { display: \"none\" } : null}\n      >\n        {participants.map((p) => (\n          <li\n            key={p.id || \"me\"}\n            className={\"flex gap-2 items-center relative py-2\"}\n          >\n            <img\n              className={\"member-image w-7 h-7\"}\n              src={get(p, \"membership.images.40x40@2\")}\n              alt={\"\"}\n              aria-hidden\n            />\n            <StatusIcon status={p.status} className={\"absolute top-5 left-5\"} />\n            {get(p, \"membership.path\") ? (\n              <a\n                href={get(p, \"membership.path\")}\n                className=\"truncate\"\n                title={get(p, \"membership.name\")}\n              >\n                <NameWithProfileField\n                  name={get(p, \"membership.name\")}\n                  detectionProfileField={get(\n                    p,\n                    \"membership.detection_profile_field\",\n                  )}\n                  isExternal={get(p, \"membership.is_external\")}\n                />\n              </a>\n            ) : (\n              <NameWithProfileField\n                name={get(p, \"membership.name\")}\n                detectionProfileField={get(\n                  p,\n                  \"membership.detection_profile_field\",\n                )}\n                isExternal={get(p, \"membership.is_external\")}\n              />\n            )}\n          </li>\n        ))}\n      </ul>\n    </div>\n  );\n}\n\n// Inserts given participant into list maintaining sort by name and status\nconst statusToSort = { accepted: 0, rejected: 1, declined: 1, invited: 2 };\nconst pushParticipant = (list, participant) => {\n  list.splice(\n    sortedIndexBy(list, participant, (p) =>\n      lowerCase(\n        `${statusToSort[p.status]}${get(p, \"membership.last_name\")}${get(\n          p,\n          \"membership.first_name\",\n        )}`,\n      ),\n    ),\n    0,\n    participant,\n  );\n};\n\nexport default function ParticipantsList({\n  participants,\n  showParticipants,\n  consumersCount,\n  teamsOnlyParticipantsCount,\n}) {\n  let roles = [];\n  if (showParticipants) {\n    const defaultRole = {\n      id: \"default\",\n      plural_name: I18n.t(\"js.calendars.appointment.rsvp.guests\"),\n      participants: [],\n    };\n    const participantsByRole = reduce(\n      participants,\n      (obj, participant) => {\n        if (isEmpty(participant.roles)) {\n          pushParticipant(defaultRole.participants, participant);\n        } else {\n          participant.roles.forEach((role) => {\n            obj[role.id] || (obj[role.id] = { ...role, participants: [] });\n            pushParticipant(obj[role.id].participants, participant);\n          });\n        }\n        return obj;\n      },\n      {},\n    );\n\n    roles = [defaultRole].concat(\n      values(participantsByRole).sort(\n        Helpers.naturalSortByObjectKey(\"plural_name\"),\n      ),\n    );\n  }\n\n  return (\n    <div className={\"space-y-6\"}>\n      {roles.map((role) => (\n        <Role {...role} key={role.id} />\n      ))}\n      {consumersCount > 0 ? (\n        <p>\n          {I18n.t(\"administration.consumer_manager.consumer_list_title\", {\n            count: consumersCount,\n          })}\n        </p>\n      ) : null}\n      {teamsOnlyParticipantsCount > 0 ? (\n        <p>\n          {I18n.t(\n            \"administration.consumer_manager.teams_participants_list_title\",\n            { count: teamsOnlyParticipantsCount },\n          )}\n        </p>\n      ) : null}\n    </div>\n  );\n}\n","import { get } from \"lodash\";\n\nexport const invitesSelector = (state) => get(state, [\"invites\", \"data\"]);\n\nexport const loadMoreUrlInvitesSelector = (state) =>\n  get(state, [\"invites\", \"loadMoreUrl\", \"next\"]);\n\nexport const invitesLoadingSelector = (state) =>\n  get(state, [\"invites\", \"loading\"]);\n\nexport const participationsSelector = (state) =>\n  get(state, [\"participations\", \"data\"]);\n\nexport const loadMoreUrlParticipationsSelector = (state) =>\n  get(state, [\"participations\", \"loadMoreUrl\"]);\n\nexport const participantsLoadingSelector = (state) =>\n  get(state, [\"participations\", \"loading\"]);\n","import React from \"react\";\nimport classNames from \"classnames\";\n\ntype Props = {\n  count?: number;\n  className?: string;\n  unstyled?: boolean;\n};\n\nexport default function UnreadBadge({ count, className }: Props) {\n  if (!count || count === 0) return null;\n\n  return (\n    <span\n      className={classNames(\n        \"badge rounded-xl bg-unread text-[10px] ml-1\", // ml-1 (margin-left) to have a margin to an potenrial favorite star icon as well as the name of a userbar menu item\n        {\n          \"px-1\": count >= 10,\n        },\n        className,\n      )}\n    >\n      {count > 99 ? \"99+\" : count}\n    </span>\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport moment from \"moment\";\nimport { isEmpty, get } from \"lodash\";\n\nimport { networkSelector } from \"../../selectors/environment\";\n\nimport { declineInvite, acceptInvite } from \"../../actions/invites\";\nimport classnames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\n// Reused in bitkom custom\nexport function AppointmentInviteMeta({\n  status,\n  accept,\n  decline,\n  canOptRetroactively,\n  inviteStatus,\n  totalAttendeesEnforcedAndExceeded,\n  participation_locked,\n}) {\n  const buttons = totalAttendeesEnforcedAndExceeded ? (\n    <div className=\"muted max-w-xs\">\n      {I18n.t(`js.calendars.appointment.total_attendees_exceeded`)}\n    </div>\n  ) : participation_locked ? (\n    <div className=\"muted max-w-xs\">\n      {I18n.t(`js.calendars.appointment.participation_locked`)}\n    </div>\n  ) : (\n    <div className=\"btn-group w-full align-left\">\n      <button\n        onClick={accept}\n        className=\"btn btn-success\"\n        disabled={!!totalAttendeesEnforcedAndExceeded}\n      >\n        <i className=\"fa fa-plus mr-1\" />\n        {I18n.t(\"js.invites.actions.accept\")}\n      </button>\n      <button onClick={decline} className=\"btn btn-danger\">\n        <i className=\"fa fa-xmark mr-1\" />\n        {I18n.t(\"js.invites.actions.reject\")}\n      </button>\n    </div>\n  );\n\n  const hint = (\n    <div className=\"appointment-invite-reaction\">\n      {status !== \"open\"\n        ? I18n.t(`js.calendars.appointments.invite.${status}`)\n        : null}\n    </div>\n  );\n\n  switch (inviteStatus) {\n    case \"open\":\n      return status === inviteStatus ? buttons : hint;\n    case \"accepted\":\n    case \"declined\":\n      return status === inviteStatus ? hint : null;\n    case \"expired\":\n      return status === \"open\" ? (canOptRetroactively ? buttons : null) : hint;\n    case \"obsolete\":\n      return status === inviteStatus ? hint : null;\n    default:\n      return null;\n  }\n}\nAppointmentInviteMeta.propTypes = {\n  status: PropTypes.string,\n  accept: PropTypes.func,\n  decline: PropTypes.func,\n  canOptRetroactively: PropTypes.bool,\n  totalAttendeesEnforcedAndExceeded: PropTypes.bool,\n  participation_locked: PropTypes.bool,\n};\n\n// Reused in bitkom custom\nexport function AppointmentInviteDate({ date, frequency }) {\n  return (\n    <div className=\"appointment-date\">\n      {frequency\n        ? I18n.t(`js.time.formats.frequencies.${frequency}`) + \" \"\n        : null}\n      <time>\n        {moment(date.start).format(\n          I18n.t(\n            date.all_day\n              ? \"js.time.formats.medium_date\"\n              : \"js.time.formats.medium_date_and_time\",\n          ),\n        )}\n      </time>\n      {date.end ? (\n        <time>\n          {\" - \" +\n            moment(date.end).format(\n              I18n.t(\n                date.all_day\n                  ? \"js.time.formats.medium_date\"\n                  : date.same_day\n                    ? \"js.time.formats.medium_time\"\n                    : \"js.time.formats.medium_date_and_time\",\n              ),\n            )}\n        </time>\n      ) : null}\n    </div>\n  );\n}\nAppointmentInviteDate.propTypes = {\n  all_day: PropTypes.bool,\n  end: PropTypes.string,\n  id: PropTypes.string,\n  same_day: PropTypes.bool,\n  start: PropTypes.string,\n  frequency: PropTypes.string,\n};\n\nexport default function AppointmentInvite({\n  invitable,\n  invitable_type,\n  author,\n  status,\n  inviteStatus,\n  id,\n  renderDate,\n  renderMeta,\n}) {\n  const network = useSelector(networkSelector);\n  const dispatch = useDispatch();\n\n  const canOptRetroactively = get(network, [\n    \"config\",\n    \"appointments\",\n    \"opt_retroactively\",\n  ]);\n\n  return (\n    <div className=\"invite-container grid grid-cols-[1fr] sm:grid-cols-[30px_1fr_1fr] md:grid-cols-[30px_1.5fr_1fr] py-6 px-1.5 gap-2 sm:gap-3 md:gap-5\">\n      {invitable_type === \"RecurringAppointment\" ? (\n        <span className={\"fa-stack hidden sm:block -ml-1.5\"}>\n          <FontAwesomeIcon\n            icon={regular(\"calendar\")}\n            className={\"fa-stack-2x\"}\n          />\n          <FontAwesomeIcon\n            icon={regular(\"rotate\")}\n            className={\"fa-stack-1x top-2 !h-[0.75em]\"}\n          />\n        </span>\n      ) : (\n        <FontAwesomeIcon\n          icon={regular(\"calendar\")}\n          size={\"2xl\"}\n          className={\"hidden sm:block\"}\n        />\n      )}\n\n      <div className=\"invite-info grow\">\n        {!isEmpty(invitable) ? (\n          <div>\n            <div\n              className={`appointment-name text-lg -mt-1 ${invitable.status}`}\n            >\n              <a href={`/appointments/${invitable.id}`}>{invitable.name}</a>\n            </div>\n            {renderDate(invitable)}\n          </div>\n        ) : null}\n        {!isEmpty(author) ? (\n          <div className=\"invite-author\">\n            {I18n.t(\"js.invites.invited_by\") + \" \"}\n            <a href={`/members/${author.id}`}>{author.name}</a>\n          </div>\n        ) : null}\n      </div>\n      <div\n        // When total_attendees_enforced_and_exceeded is true, text is displayed instead of buttons.\n        // This should be able to shrink, but the buttons not.\n        className={classnames(\n          \"appointment-invite-interactions col-span-2 sm:col-span-1\",\n          {\n            \"shrink-0\": !invitable.total_attendees_enforced_and_exceeded,\n          },\n        )}\n      >\n        {renderMeta({\n          inviteStatus: inviteStatus,\n          status: status,\n          decline: () => dispatch(declineInvite({ inviteId: id })),\n          accept: () => dispatch(acceptInvite({ inviteId: id })),\n          canOptRetroactively: canOptRetroactively,\n          totalAttendeesEnforcedAndExceeded:\n            invitable.total_attendees_enforced_and_exceeded,\n          participation_locked: invitable.participation_locked,\n        })}\n      </div>\n    </div>\n  );\n}\nAppointmentInvite.propTypes = {\n  id: PropTypes.string,\n  status: PropTypes.string,\n  inviteStatus: PropTypes.string,\n  author: PropTypes.shape({\n    id: PropTypes.string,\n    name: PropTypes.string,\n  }),\n  decline: PropTypes.func,\n  accept: PropTypes.func,\n  invitable: PropTypes.shape({\n    calendar_ids: PropTypes.arrayOf(PropTypes.string),\n    date: PropTypes.shape(AppointmentInviteDate.propTypes),\n    id: PropTypes.string,\n    name: PropTypes.string,\n    status: PropTypes.string,\n    frequency: PropTypes.string,\n    total_attendees_enforced_and_exceeded: PropTypes.bool,\n    participation_locked: PropTypes.bool,\n  }),\n  canOptRetroactively: PropTypes.bool,\n  hideMeta: PropTypes.bool,\n};\n","import React from \"react\";\nimport AppointmentInvite, { AppointmentInviteDate } from \"./AppointmentInvite\";\n\nexport default function RecurringAppointmentInvite(props) {\n  return (\n    <AppointmentInvite\n      renderDate={({ date, frequency }) => (\n        <AppointmentInviteDate date={date} frequency={frequency} />\n      )}\n      {...props}\n    />\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\nimport AppointmentInvite, { AppointmentInviteDate } from \"./AppointmentInvite\";\n\nfunction AppointmentParticipation({\n  appointment,\n  invited_by,\n  status,\n  inviteStatus,\n}) {\n  return !isEmpty(appointment) ? (\n    <AppointmentInvite\n      status={status}\n      author={\n        !isEmpty(invited_by)\n          ? { id: invited_by.id, name: invited_by.name }\n          : null\n      }\n      inviteStatus={inviteStatus}\n      invitable={{\n        date: appointment.date,\n        id: appointment.id,\n        name: appointment.name,\n        status: appointment.status,\n      }}\n      renderDate={(props) => <AppointmentInviteDate {...props} />}\n      renderMeta={() => null}\n    />\n  ) : null;\n}\nAppointmentParticipation.propTypes = {\n  appointment: PropTypes.shape({\n    id: PropTypes.string,\n    name: PropTypes.string,\n    date: PropTypes.shape({\n      start: PropTypes.string,\n      all_day: PropTypes.bool,\n      same_day: PropTypes.bool,\n      end: PropTypes.string,\n    }),\n  }),\n  invited_by: PropTypes.shape({\n    id: PropTypes.string,\n    name: PropTypes.string,\n  }),\n  status: PropTypes.string,\n  inviteStatus: PropTypes.string,\n};\n\nexport default AppointmentParticipation;\n","import React, { useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, isEmpty } from \"lodash\";\nimport AppointmentInvite, {\n  AppointmentInviteDate,\n  AppointmentInviteMeta,\n} from \"../appointments/AppointmentInvite\";\nimport RecurringAppointmentInvite from \"../appointments/RecurringAppointmentInvite\";\nimport AppointmentParticipation from \"../appointments/AppointmentParticipation\";\nimport CustomConfigurator from \"../../CustomConfigurator\";\n\nif (!CustomConfigurator.existsDefault(\"invites.types\")) {\n  CustomConfigurator.setDefault(\"invites.types\", {\n    appointments: {\n      invites: {\n        Appointment: AppointmentInvite,\n        ModifiedRecurringAppointment: RecurringAppointmentInvite,\n        RecurringAppointment: RecurringAppointmentInvite,\n      },\n      participations: {\n        default: AppointmentParticipation,\n      },\n    },\n  });\n}\n\nexport default function InvitesList({\n  invites,\n  inviteType,\n  inviteStatus,\n  isLoading,\n  loadMore,\n  loadMoreUrl,\n  loadInvites,\n}) {\n  useEffect(() => {\n    loadInvites();\n  }, [inviteStatus]);\n\n  return (\n    <div>\n      {isLoading ? (\n        <div className=\"mt-2\">\n          {I18n.t(\"js.calendars.appointments.invites.loading\")}\n        </div>\n      ) : !isEmpty(invites.data) && !isLoading ? (\n        <div className=\"media-list\">\n          {map(invites.data, (invite, index) => {\n            const path = [\n              \"invites\",\n              \"types\",\n              inviteType,\n              invites.type,\n              (invites.type === \"invites\"\n                ? invite.invitable_type\n                : invite._type) || \"default\",\n            ];\n            const Component =\n              CustomConfigurator.get(path) ||\n              (() => `Missing component for ${path.join(\".\")}`);\n\n            return (\n              <Component\n                inviteStatus={inviteStatus}\n                key={index}\n                renderDate={(props) => <AppointmentInviteDate {...props} />}\n                renderMeta={(props) => <AppointmentInviteMeta {...props} />}\n                {...invite}\n              />\n            );\n          })}\n        </div>\n      ) : (\n        <div className=\"alert alert-info mt-4\">\n          {I18n.t(`js.calendars.appointments.invites.no_${inviteStatus}`)}\n        </div>\n      )}\n      {!isEmpty(loadMoreUrl) && !isLoading ? (\n        <div className=\"appointment-invites-show-more-container\">\n          <a className=\"btn\" onClick={loadMore} href=\"#\">\n            <i className=\"fa fa-arrow-down\" />{\" \"}\n            {I18n.t(\"js.calendars.appointments.invites.show_more\")}\n          </a>\n        </div>\n      ) : null}\n    </div>\n  );\n}\n\nInvitesList.propTypes = {\n  invitableType: PropTypes.string,\n  inviteType: PropTypes.string,\n  invites: PropTypes.shape({\n    type: PropTypes.string,\n    data: PropTypes.arrayOf(PropTypes.shape({})),\n  }),\n  inviteStatus: PropTypes.string,\n  loadMore: PropTypes.func,\n  loadMoreUrl: PropTypes.string,\n  isLoading: PropTypes.bool,\n};\n","import { useQuery } from \"react-query\";\nimport { fetchApi } from \"../helpers/reactQueryApi.js\";\nimport { useEffect, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { currentMemberSelector } from \"selectors/environment\";\nimport { sum, values } from \"lodash\";\n\n/**\n * Features\n */\nconst unreadsQueryOptions = {\n  refetchInterval: 60000,\n};\n\ntype FeaturesUnreadsPayload = {\n  Activitystreams: number;\n  Messages: number;\n  Tasks: number;\n  Files: number;\n  Calendars: number;\n  GroupInvites: number;\n  Invites: number;\n  Notifications: number;\n  GroupJoinRequests: { group_slug: string; open_join_requests: number }[];\n};\n\nexport type AppUnreadsPayload = {\n  total: number;\n  activitystreams: number;\n  appointments: number;\n  messages: number;\n};\n\nconst convertPayload = (payload: FeaturesUnreadsPayload): AppUnreadsPayload => {\n  const features = {\n    activitystreams: payload.Activitystreams || 0,\n    appointments: payload.Calendars || 0,\n    messages: payload.Messages || 0,\n  };\n\n  return {\n    total: sum(values(features)),\n    ...features,\n  };\n};\n\n/*\n * Unread counts by features\n *\n * Delayed by 250ms to prioritize other requests\n * Skipped if no member is signed in\n */\nexport function useFeaturesUnreads() {\n  const currentMember = useSelector(currentMemberSelector);\n  const [delayedEnabled, setDelayedEnabled] = useState(false);\n\n  useEffect(() => {\n    const timeout = setTimeout(() => setDelayedEnabled(true), 250);\n    return () => clearTimeout(timeout);\n  }, []);\n\n  return useQuery<FeaturesUnreadsPayload>(\n    [\"unreads\", \"features\"],\n    () => fetchApi(\"/unreads/features\"),\n    {\n      ...unreadsQueryOptions,\n      enabled: currentMember !== null && delayedEnabled,\n      onSuccess: (data) => {\n        if (window.isApp) {\n          const unreads: AppUnreadsPayload = convertPayload(data);\n          window.bridge?.postMessage({ unreads });\n        }\n      },\n    },\n  );\n}\n\n/**\n * Unread counts by activitystreams\n *\n * Delayed by 500ms to prioritize other requests\n * Skipped if no member is signed in\n */\ntype ActivitiesUnreadsPayload = {\n  activitystream_slug: string;\n  unreads: number;\n  sum: number;\n  notifications: number;\n  invites: number;\n  group_slug: string | null;\n}[];\n\nexport function useActivitiesUnreads() {\n  const currentMember = useSelector(currentMemberSelector);\n  const [delayedEnabled, setDelayedEnabled] = useState(false);\n\n  useEffect(() => {\n    setTimeout(() => setDelayedEnabled(true), 500);\n  }, []);\n\n  return useQuery<ActivitiesUnreadsPayload, Error>(\n    [\"unreads\", \"activities\"],\n    () => fetchApi(\"/unreads/activities\"),\n    {\n      ...unreadsQueryOptions,\n      enabled: currentMember !== null && delayedEnabled,\n      onSuccess: (data) => {\n        Tixxt.Activitystreams.Activitystream.all().processUnreadCounts(data);\n      },\n    },\n  );\n}\n\n/**\n * Folders\n */\ntype FoldersUnreadsPayload = {\n  group_slug: string | null;\n  pending_versions: number;\n  reviewed_files: number;\n  sum: number;\n}[];\n\nexport function useFoldersUnreads(options = {}) {\n  return useQuery<FoldersUnreadsPayload>(\n    [\"unreads\", \"folders\"],\n    () => fetchApi(`/unreads/folders`),\n    { ...unreadsQueryOptions, ...options },\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { compose, withState, withProps, withHandlers } from \"recompose\";\nimport store from \"../../store\";\nimport wrapProvider from \"../../helpers/components/wrapProvider\";\nimport preventDefault from \"../../helpers/components/preventDefault\";\nimport { fetchInvites, loadMoreInvites } from \"../../actions/invites\";\nimport {\n  fetchParticipations,\n  loadMoreParticipations,\n} from \"../../actions/participations\";\nimport {\n  invitesSelector,\n  invitesLoadingSelector,\n  participantsLoadingSelector,\n  participationsSelector,\n  loadMoreUrlParticipationsSelector,\n  loadMoreUrlInvitesSelector,\n} from \"../../selectors/invites\";\n\nimport UnreadBadge from \"components/shared/UnreadBadge\";\nimport InvitesList from \"components/invites/InvitesList\";\nimport { useFeaturesUnreads } from \"../../api/unreads\";\n\nfunction Invites({\n  setActiveTab,\n  activeTab,\n  load,\n  items,\n  loadMore,\n  loadMoreUrl,\n  isLoading,\n}) {\n  const { data: unreads } = useFeaturesUnreads();\n\n  return (\n    <div className=\"tixxt-tabs-layout\">\n      <div className=\"tabs-region\">\n        <ul className=\"nav nav-tabs\">\n          <li className={activeTab === \"open\" ? \"active\" : \"\"}>\n            <a onClick={preventDefault(() => setActiveTab(\"open\"))} href=\"#\">\n              <div className=\"flex items-center\">\n                {I18n.t(\"js.calendars.appointments.invites.tabs.open\")}\n                {<UnreadBadge count={unreads?.Calendars} className=\"ml-1\" />}\n              </div>\n            </a>\n          </li>\n          <li className={activeTab === \"upcoming\" ? \"active\" : \"\"}>\n            <a\n              onClick={preventDefault(() => setActiveTab(\"upcoming\"))}\n              href=\"#\"\n            >\n              {I18n.t(\"js.calendars.appointments.invites.tabs.upcoming\")}\n            </a>\n          </li>\n          <li className={activeTab === \"accepted\" ? \"active\" : \"\"}>\n            <a\n              onClick={preventDefault(() => setActiveTab(\"accepted\"))}\n              href=\"#\"\n            >\n              {I18n.t(\"js.calendars.appointments.invites.tabs.accepted\")}\n            </a>\n          </li>\n          <li className={activeTab === \"declined\" ? \"active\" : \"\"}>\n            <a\n              onClick={preventDefault(() => setActiveTab(\"declined\"))}\n              href=\"#\"\n            >\n              {I18n.t(\"js.calendars.appointments.invites.tabs.declined\")}\n            </a>\n          </li>\n          <li className={activeTab === \"expired\" ? \"active\" : \"\"}>\n            <a onClick={preventDefault(() => setActiveTab(\"expired\"))} href=\"#\">\n              {I18n.t(\"js.calendars.appointments.invites.tabs.expired\")}\n            </a>\n          </li>\n          <li className={activeTab === \"obsolete\" ? \"active\" : \"\"}>\n            <a\n              onClick={preventDefault(() => setActiveTab(\"obsolete\"))}\n              href=\"#\"\n            >\n              {I18n.t(\"js.calendars.appointments.invites.tabs.obsolete\")}\n            </a>\n          </li>\n        </ul>\n      </div>\n      <div className=\"tab-content-region\">\n        <InvitesList\n          isLoading={isLoading}\n          inviteType=\"appointments\"\n          loadInvites={load}\n          inviteStatus={activeTab}\n          invites={items}\n          loadMore={loadMore}\n          loadMoreUrl={loadMoreUrl}\n        />\n      </div>\n    </div>\n  );\n}\nInvites.propTypes = {\n  setActiveTab: PropTypes.func,\n  load: PropTypes.func,\n  activeTab: PropTypes.string,\n  loadMore: PropTypes.func,\n  loadMoreUrl: PropTypes.string,\n  isLoading: PropTypes.bool,\n  items: PropTypes.shape({\n    type: PropTypes.string,\n    data: PropTypes.arrayOf(PropTypes.shape({})),\n  }),\n};\n\nexport default compose(\n  wrapProvider(store),\n  withState(\"activeTab\", \"setActiveTab\", \"open\"),\n  connect(\n    (state) => ({\n      invites: invitesSelector(state),\n      participations: participationsSelector(state),\n      isLoadingInvites: invitesLoadingSelector(state),\n      isLoadingParticipants: participantsLoadingSelector(state),\n      loadMoreParticipationsUrl: loadMoreUrlParticipationsSelector(state),\n      loadMoreInvitesUrl: loadMoreUrlInvitesSelector(state),\n    }),\n    (dispatch, { activeTab }) => {\n      return {\n        loadInvites: () =>\n          dispatch(\n            fetchInvites({\n              filter: \"appointments\",\n              status: activeTab,\n            }),\n          ),\n        loadParticipations: () =>\n          dispatch(\n            fetchParticipations({\n              status: activeTab,\n            }),\n          ),\n        onLoadMoreInvites: ({ url }) => dispatch(loadMoreInvites({ url })),\n        onLoadMoreParticipations: ({ url }) => {\n          dispatch(loadMoreParticipations({ url }));\n        },\n      };\n    },\n  ),\n  withHandlers({\n    loadMore:\n      ({\n        onLoadMoreInvites,\n        onLoadMoreParticipations,\n        loadMoreInvitesUrl,\n        loadMoreParticipationsUrl,\n        activeTab,\n      }) =>\n      (e) => {\n        e.preventDefault();\n\n        return activeTab === \"open\" ||\n          activeTab === \"expired\" ||\n          activeTab === \"obsolete\"\n          ? onLoadMoreInvites({ url: loadMoreInvitesUrl })\n          : onLoadMoreParticipations({ url: loadMoreParticipationsUrl });\n      },\n    load:\n      ({ activeTab, loadParticipations, loadInvites }) =>\n      () =>\n        activeTab === \"open\" ||\n        activeTab === \"expired\" ||\n        activeTab === \"obsolete\"\n          ? loadInvites()\n          : loadParticipations(),\n  }),\n  withProps(\n    ({\n      activeTab,\n      invites,\n      participations,\n      loadMoreInvitesUrl,\n      loadMoreParticipationsUrl,\n      isLoadingInvites,\n      isLoadingParticipants,\n    }) => ({\n      loadMoreUrl:\n        activeTab === \"open\" ||\n        activeTab === \"expired\" ||\n        activeTab === \"obsolete\"\n          ? loadMoreInvitesUrl\n          : loadMoreParticipationsUrl,\n      items:\n        activeTab === \"open\" ||\n        activeTab === \"expired\" ||\n        activeTab === \"obsolete\"\n          ? { type: \"invites\", data: invites }\n          : { type: \"participations\", data: participations },\n      isLoading:\n        activeTab === \"open\" ||\n        activeTab === \"expired\" ||\n        activeTab === \"obsolete\"\n          ? isLoadingInvites\n          : isLoadingParticipants,\n    }),\n  ),\n)(Invites);\n","import { useMutation, useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { Appointment, Calendar } from \"../../@types/appointments\";\nimport { stringify } from \"query-string\";\n\nexport async function createAppointmentContact({ appointmentId, ...body }) {\n  return fetchApi(`/appointments/${appointmentId}/contact`, {\n    method: \"POST\",\n    body,\n  });\n}\n\nexport function useCreateAppointmentContact(options) {\n  return useMutation(createAppointmentContact, options);\n}\n\ntype UseAppointmentArgs = {\n  date: string;\n  view: \"sheet\" | \"list\" | string;\n  participating: boolean;\n  options?: object;\n};\nexport function useAppointments({\n  date,\n  view,\n  participating,\n  options = { keepPreviousData: true },\n}: UseAppointmentArgs) {\n  const isoDate = date.split(\"T\")[0];\n  const params = {\n    date: isoDate,\n    view,\n    type: \"month\",\n  };\n\n  return useQuery<Appointment[]>(\n    `/appointments${participating ? \"/participating\" : \"\"}?${stringify(\n      params,\n    )}`,\n    options,\n  );\n}\n\nexport function useAppointment(id?: string) {\n  return useQuery<Appointment>(`/appointments/${id}`, { enabled: !!id });\n}\n\nexport function useCalendars(groupSlug: string = \"\") {\n  return useQuery<Calendar[]>(\n    `${groupSlug ? `/groups/${groupSlug}` : \"\"}/calendars`,\n    {},\n  );\n}\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { compose } from \"recompose\";\n\nimport { useCreateAppointmentContact } from \"./api\";\nimport ReduxForm from \"components/shared/reduxForm\";\nimport wrapProvider from \"../../helpers/components/wrapProvider\";\nimport store from \"../../store\";\n\nimport ControlGroup from \"../shared/fields/ControlGroup\";\nimport TextField from \"../appCreator/properties/edit/TextField\";\nimport { Field } from \"redux-form\";\n\nfunction Contact({\n  hasAttachments,\n  areAttachmentsInLimit,\n  isLoading,\n  appointment,\n}) {\n  const { mutateAsync: createAppointmentContact } = useCreateAppointmentContact(\n    {\n      onSuccess: () => {\n        toastr.success(I18n.t(\"js.saving_successful\"));\n        Backbone.history.navigate(`/appointments/${appointment.id}`, {\n          trigger: true,\n        });\n      },\n    },\n  );\n\n  const onSubmit = async (values) => {\n    return createAppointmentContact({\n      appointmentId: appointment.id,\n      ...values,\n    });\n  };\n\n  return isLoading ? (\n    <p>\n      <i className=\"fa fa-spin fa-spinner\"></i>{\" \"}\n      {I18n.t(\"js.calendars.appointment.loading\")}\n    </p>\n  ) : (\n    <div className=\"AppointmentContact\">\n      <ReduxForm\n        form=\"networkSettingsForm\"\n        className=\"form-horizontal boxed-form-fields\"\n        onSubmit={onSubmit}\n        submitText={I18n.t(\"js.calendars.appointment.attendees.contact.send\")}\n        onSubmitFail={() => toastr.error(I18n.t(\"js.saving_failure\"))}\n        onCancel={(reset) => {\n          reset();\n          Backbone.history.navigate(`/appointments/${appointment.id}`, {\n            trigger: true,\n          });\n        }}\n        allowSaveWithoutChange={false}\n      >\n        <ControlGroup>\n          <div className=\"help-block mt-4\">\n            {I18n.t(\"js.calendars.appointment.attendees.contact.general_help\")}\n          </div>\n        </ControlGroup>\n\n        <ControlGroup\n          label={I18n.t(\n            \"js.calendars.appointment.attendees.contact.audience.label\",\n          )}\n          className=\"white-box checkboxes\"\n        >\n          <label className=\"choice radio mt-1.5\">\n            <Field\n              component=\"input\"\n              type=\"radio\"\n              name=\"contact.audience\"\n              value=\"all\"\n            />{\" \"}\n            {I18n.t(\"js.calendars.appointment.attendees.contact.audience.all\")}\n          </label>\n          <label className=\"choice radio\">\n            <Field\n              component=\"input\"\n              type=\"radio\"\n              name=\"contact.audience\"\n              value=\"accepted\"\n            />{\" \"}\n            {I18n.t(\n              \"js.calendars.appointment.attendees.contact.audience.accepted\",\n            )}\n          </label>\n          <label className=\"choice radio\">\n            <Field\n              component=\"input\"\n              type=\"radio\"\n              name=\"contact.audience\"\n              value=\"declined\"\n            />{\" \"}\n            {I18n.t(\n              \"js.calendars.appointment.attendees.contact.audience.declined\",\n            )}\n          </label>\n          <label className=\"choice radio\">\n            <Field\n              component=\"input\"\n              type=\"radio\"\n              name=\"contact.audience\"\n              value=\"no_reaction\"\n            />{\" \"}\n            {I18n.t(\n              \"js.calendars.appointment.attendees.contact.audience.no_reaction\",\n            )}\n          </label>\n        </ControlGroup>\n\n        <ControlGroup\n          name=\"contact.subject\"\n          label={I18n.t(\"js.calendars.appointment.attendees.contact.subject\")}\n          required\n        >\n          <TextField name=\"contact.subject\" required />\n        </ControlGroup>\n\n        <ControlGroup\n          name=\"contact.text\"\n          label={I18n.t(\"js.calendars.appointment.attendees.contact.text\")}\n          required\n        >\n          <TextField name=\"contact.text\" multiline required />\n        </ControlGroup>\n\n        {hasAttachments ? (\n          <ControlGroup\n            className=\"white-box checkboxes\"\n            label={I18n.t(\n              \"js.calendars.appointment.attendees.contact.attachments\",\n            )}\n          >\n            <label className=\"choice checkbox\">\n              <Field\n                component=\"input\"\n                type=\"checkbox\"\n                name=\"contact.include_attachments\"\n                disabled={!areAttachmentsInLimit}\n              />{\" \"}\n              {I18n.t(\n                \"js.calendars.appointment.attendees.contact.include_attachments\",\n              )}\n            </label>\n            {areAttachmentsInLimit ? null : (\n              <div className=\"help-block\">\n                {I18n.t(\n                  \"js.activitystreams.email_recommendations.attachments_too_large\",\n                  {\n                    limit: `${\n                      Tixxt.currentNetwork.getConfig(\n                        \"email_recommendations.attachment_size_limit\",\n                      ) /\n                      1024 /\n                      1024\n                    }MB`,\n                  },\n                )}\n              </div>\n            )}\n          </ControlGroup>\n        ) : null}\n      </ReduxForm>\n    </div>\n  );\n}\n\nContact.propTypes = {\n  hasAttachments: PropTypes.bool,\n  areAttachmentsInLimit: PropTypes.bool,\n  isLoading: PropTypes.bool,\n  appointment: PropTypes.shape({\n    id: PropTypes.string,\n    name: PropTypes.string,\n  }),\n};\n\nexport default compose(wrapProvider(store))(Contact);\n","// extracted by mini-css-extract-plugin\nexport default {\"closed\":\"fx9MWnXO2DmyFde33lew\"};","import React, { useState, useCallback } from \"react\";\nimport createMentionPlugin from \"@draft-js-plugins/mention\";\nimport { omit } from \"lodash\";\n\ninterface TagTypes {\n  className: string;\n  children: React.ReactNode;\n}\n\nfunction Tag({ className, children }: TagTypes) {\n  return (\n    <div className={className + \" inline-mention-container\"}>#{children}</div>\n  );\n}\n\ninterface TagEntryTypes {\n  className?: string;\n  theme?: {\n    mentionSuggestionsEntryText?: string;\n  };\n  mention: {\n    name: string;\n    id?: string | number | null | undefined;\n    new?: boolean;\n  };\n}\n\nfunction TagEntry({ mention, className, theme, ...rest }: TagEntryTypes) {\n  const parentProps = omit(rest, [\"isFocused\", \"searchValue\"]);\n  return (\n    <div\n      {...parentProps}\n      className={`${className} suggestion`}\n      key={mention.id}\n    >\n      <i\n        className={`icon ${mention.new ? \"fa fa-plus\" : \"fa fa-tag\"}`}\n        aria-hidden={true}\n      />{\" \"}\n      <span className={theme?.mentionSuggestionsEntryText}>{mention.name}</span>\n    </div>\n  );\n}\n\nconst inlineTagPlugin = createMentionPlugin({\n  mentionTrigger: \"#\",\n  entityMutability: \"IMMUTABLE\",\n  mentionComponent: Tag,\n});\n\nfunction InlineTagSuggestions() {\n  const [open, setOpen] = useState(false);\n  const [suggestions, setSuggestions] = useState([]);\n\n  const onOpenChange = useCallback((_open) => {\n    setOpen(_open);\n  }, []);\n\n  return (\n    <inlineTagPlugin.MentionSuggestions\n      onSearchChange={search}\n      open={open}\n      onOpenChange={onOpenChange}\n      suggestions={suggestions}\n      entryComponent={TagEntry}\n    />\n  );\n\n  async function search({ value }) {\n    const response = await $.ajax({\n      url: \"/tags/find\",\n      type: \"get\",\n      dataType: \"json\",\n      data: {\n        q: value,\n      },\n      contentType: \"application/json; charset=utf-8\",\n    });\n\n    setSuggestions(response);\n  }\n}\n\nexport default function createInlineTagPlugin() {\n  return { inlineTagPlugin, InlineTagSuggestions };\n}\n","import React from \"react\";\nimport createInlineMentionPlugin from \"components/activitystreams/composer/inlineMentionPlugin\";\nimport createInlineTagPlugin from \"components/activitystreams/composer/inlineTagPlugin\";\nimport createToolbarPlugin from \"components/shared/markdownEditor/editorPlugins/toolbarPlugin\";\nimport createMarkdownPlugin from \"components/shared/markdownEditor/editorPlugins/markdownPlugin\";\nimport createUndoPlugin from \"components/shared/markdownEditor/editorPlugins/undoPlugin\";\nimport createShortcutsPlugin from \"components/shared/markdownEditor/editorPlugins/shortcutsPlugin\";\nimport createCounterPlugin from \"@draft-js-plugins/counter\";\nimport createLinkifyPlugin from \"@draft-js-plugins/linkify\";\nimport createBlockBreakoutPlugin from \"draft-js-block-breakout-plugin\";\nimport createEmojiPlugin, { defaultTheme } from \"@draft-js-plugins/emoji\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ninterface withPluginsTypes {\n  [key: PropertyKey]: unknown;\n}\n\nfunction withPlugins(BaseComponent) {\n  return class HOC extends React.Component<withPluginsTypes> {\n    plugins: Array<unknown>;\n    pluginComponents: Record<PropertyKey, unknown>;\n\n    constructor(props: withPluginsTypes) {\n      super(props);\n\n      const mentionPlugin = createInlineMentionPlugin();\n      const tagPlugin = createInlineTagPlugin();\n      const [toolbarPlugin, Toolbar] = createToolbarPlugin();\n      const markdownPlugin = createMarkdownPlugin();\n      const undoPlugin = createUndoPlugin();\n      const counterPlugin = createCounterPlugin();\n      const linkifyPlugin = createLinkifyPlugin();\n      const blockBreakoutPlugin = createBlockBreakoutPlugin();\n      const shortcutsPlugin = createShortcutsPlugin();\n      const emojiPlugin = createEmojiPlugin({\n        useNativeArt: true,\n        selectButtonContent: <FontAwesomeIcon icon={regular(\"face-smile\")} />,\n        theme: {\n          ...defaultTheme,\n          emojiSelectButton: \"btn btn-sm btn-light\",\n          emojiSelectButtonPressed: \"btn btn-sm btn-light active\",\n        },\n      });\n\n      this.plugins = [\n        mentionPlugin.inlineMentionPlugin,\n        tagPlugin.inlineTagPlugin,\n        toolbarPlugin,\n        markdownPlugin,\n        undoPlugin,\n        counterPlugin,\n        linkifyPlugin,\n        blockBreakoutPlugin,\n        shortcutsPlugin,\n        emojiPlugin,\n      ];\n\n      this.pluginComponents = {\n        InlineMentionSuggestions: mentionPlugin.InlineMentionSuggestions,\n        InlineTagSuggestions: tagPlugin.InlineTagSuggestions,\n        Toolbar,\n        CharCounter: counterPlugin.CharCounter,\n        WordCounter: counterPlugin.WordCounter,\n        LineCounter: counterPlugin.LineCounter,\n        UndoButton: undoPlugin.UndoButton,\n        RedoButton: undoPlugin.RedoButton,\n        EmojiSuggestions: emojiPlugin.EmojiSuggestions,\n        EmojiSelect: emojiPlugin.EmojiSelect,\n      };\n    }\n\n    render() {\n      return (\n        <BaseComponent\n          plugins={this.plugins}\n          pluginComponents={this.pluginComponents}\n          {...this.props}\n        />\n      );\n    }\n  };\n}\n\nexport default withPlugins;\n","import { useEffect } from \"react\";\n\nlet confirmationMessage: string | null = null;\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event#examples\nconst beforeUnloadListener = (event) => {\n  event.preventDefault();\n  return (event.returnValue = \"\");\n};\n\nexport function getConfirmationMessage() {\n  return confirmationMessage;\n}\n\nfunction enableInterceptor(message) {\n  confirmationMessage = message;\n  window.addEventListener(\"beforeunload\", beforeUnloadListener, {\n    capture: true,\n  });\n}\n\nfunction disableInterceptor() {\n  confirmationMessage = null;\n  removeEventListener(\"beforeunload\", beforeUnloadListener, { capture: true });\n}\n\nexport default function useInterceptorPrompt(message: string, when = true) {\n  useEffect(() => {\n    if (when && !window.isApp) {\n      enableInterceptor(message);\n    } else {\n      disableInterceptor();\n    }\n\n    return disableInterceptor;\n  }, [message, when]);\n}\n","import PropTypes from \"prop-types\";\nimport React, { useState } from \"react\";\nimport { compose, withState, withHandlers } from \"recompose\";\nimport Editor from \"@draft-js-plugins/editor\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport \"@draft-js-plugins/mention/lib/plugin.css\";\nimport \"@draft-js-plugins/emoji/lib/plugin.css\";\nimport \"draft-js/dist/Draft.css\";\nimport styles from \"./index.module.css\";\nimport markdownByEditorState from \"components/shared/markdownEditor/utils/markdownByEditorState\";\nimport editorStateByMarkdown from \"components/shared/markdownEditor/utils/editorStateByMarkdown\";\nimport createStyleMap from \"components/shared/markdownEditor/styleMap\";\nimport withPlugins from \"components/activitystreams/composer/withPlugins\";\nimport useInterceptorPrompt from \"../../../hooks/useInterceptorPrompt\";\n\nconst isIE = () => /MSIE|Trident/.test(window.navigator.userAgent);\nconst isIOS = () => /iPhone|iPad|iOS/.test(window.navigator.userAgent);\n\nfunction Composer({\n  key,\n  onEditorStateChange,\n  containerClasses,\n  editorState,\n  onSetEditorRef,\n  plugins,\n  pluginComponents,\n  onClickFullscreen,\n  handleFullscreen,\n  placeholder,\n  focusEditor,\n}) {\n  const customStyleMap = createStyleMap();\n\n  useInterceptorPrompt(\n    I18n.t(\"js.composer.interceptor_prompt\"),\n    editorState.getCurrentContent().hasText(),\n  );\n\n  return (\n    <div\n      className={`Composer object-content-input form-control ${containerClasses} px-2 py-1`}\n    >\n      <div className={\"flex flex-col-reverse\"}>\n        <div onClick={focusEditor}>\n          <Editor\n            key={`editor-${key}`}\n            ref={onSetEditorRef}\n            name=\"content\"\n            placeholder={placeholder}\n            editorState={editorState}\n            onChange={onEditorStateChange}\n            plugins={plugins}\n            customStyleMap={customStyleMap}\n            spellCheck\n            stripPastedStyles\n          />\n        </div>\n        <div className={\"-mx-2 -mt-1 mb-2\"}>\n          <pluginComponents.Toolbar className={\"-px-2\"} />\n        </div>\n      </div>\n      <div className=\"composer-statistics hidden sm:block\">\n        <ul className=\"unstyled inline flex justify-between gap-2\">\n          <div className=\"flex items-center gap-2\">\n            <li>\n              {I18n.t(\"js.composer.editor.statistics.lines\")}:{\" \"}\n              <pluginComponents.LineCounter />\n            </li>\n            <li>\n              {I18n.t(\"js.composer.editor.statistics.words\")}:{\" \"}\n              <pluginComponents.WordCounter />\n            </li>\n            <li>\n              {I18n.t(\"js.composer.editor.statistics.chars\")}:{\" \"}\n              <pluginComponents.CharCounter />\n            </li>\n          </div>\n          <div className=\"flex items-center items-stretch gap-2\">\n            <li className=\"flex items-center justify-center\">\n              <pluginComponents.EmojiSelect />\n            </li>\n            <li\n              className=\"flex items-center justify-center\"\n              title={I18n.t(\"js.composer.editor.undo.hint\")}\n            >\n              <pluginComponents.UndoButton />\n            </li>\n            <li\n              className=\"flex items-center justify-center\"\n              title={I18n.t(\"js.composer.editor.redo.hint\")}\n            >\n              <pluginComponents.RedoButton />\n            </li>\n            {handleFullscreen ? (\n              <li title={I18n.t(\"js.composer.editor.fullscreen.hint\")}>\n                <button\n                  type=\"button\"\n                  className=\"btn btn-sm btn-light\"\n                  onClick={onClickFullscreen}\n                >\n                  <i className=\"fa fa-arrows-alt text-primary\" />\n                </button>\n              </li>\n            ) : null}\n          </div>\n        </ul>\n      </div>\n      <div style={{ textAlign: \"center\" }}>\n        <pluginComponents.InlineMentionSuggestions key=\"mentionSuggestions\" />\n        <pluginComponents.InlineTagSuggestions key=\"tagSuggestions\" />\n        <pluginComponents.EmojiSuggestions key=\"emojiSuggestions\" />\n      </div>\n    </div>\n  );\n}\n\nComposer.propTypes = {\n  key: PropTypes.string,\n  content: PropTypes.string,\n  onEditorStateChange: PropTypes.func,\n  placeholder: PropTypes.string,\n  containerClasses: PropTypes.string,\n  editorState: PropTypes.object,\n  onSetEditorRef: PropTypes.func,\n  plugins: PropTypes.array,\n  pluginComponents: PropTypes.object,\n  onClickFullscreen: PropTypes.func,\n  handleFullscreen: PropTypes.func,\n  focusEditor: PropTypes.func,\n};\n\nexport const TixxtComposer = compose(\n  withPlugins,\n  withState(\"key\", \"setKey\", () => uuidv4()),\n  withState(\"editorState\", \"setEditorState\", ({ content }) =>\n    editorStateByMarkdown(content),\n  ),\n  withState(\"editorRef\", \"setEditorRef\", null),\n  withHandlers({\n    onEditorStateChange:\n      ({ onChange, setEditorState }) =>\n      (newEditorState) => {\n        setTimeout(() => onChange(markdownByEditorState(newEditorState)), 1);\n        setEditorState(newEditorState);\n      },\n    onClickFullscreen:\n      ({ handleFullscreen }) =>\n      (e) => {\n        e.preventDefault();\n        handleFullscreen();\n      },\n    onSetEditorRef:\n      ({ setEditorRef, setComposerRefCallback }) =>\n      (ref) => {\n        if (ref && !isIE() && !isIOS()) {\n          setTimeout(() => ref.focus(), 1);\n        }\n        if (setComposerRefCallback) {\n          setComposerRefCallback(ref);\n        }\n        setEditorRef(ref);\n      },\n    focusEditor:\n      ({ editorRef }) =>\n      (e) => {\n        e.preventDefault();\n        if (editorRef) {\n          if (isIOS()) {\n            editorRef.focus();\n          } else {\n            setTimeout(() => editorRef.focus(), 1);\n          }\n        }\n      },\n  }),\n)(Composer);\n\nexport function ClosableTixxtComposer({ onOpen, open, ...props }) {\n  const [key] = useState(uuidv4);\n  const [closed, setClosed] = useState(!open);\n\n  return closed ? (\n    <button\n      key=\"dummy\"\n      className={`Composer object-content-input form-control closed ${props.containerClasses} ${styles.closed}`}\n      onClick={onOpenHandler}\n    >\n      <span className=\"placeholder\">{props.placeholder}</span>\n    </button>\n  ) : (\n    <TixxtComposer key={key} {...props} />\n  );\n\n  function onOpenHandler(e) {\n    e.preventDefault();\n    setClosed(false);\n    onOpen();\n  }\n}\n\nexport default ClosableTixxtComposer;\n","import React from \"react\";\n\nimport { TixxtComposer } from \"./index\";\nimport styles from \"../../appCreator/properties/edit/editFields.module.css\";\nimport FieldError from \"../../appCreator/items/form/FieldError\";\n\ninterface TixxtComposerAdapterTypes {\n  input: {\n    name: string;\n    value: string;\n    onChange(...args: unknown[]): unknown;\n    onFocus(...args: unknown[]): unknown;\n    onBlur(...args: unknown[]): unknown;\n  };\n  meta: { error: string; initial: string };\n  disabled: boolean;\n  id: string;\n}\n\nfunction TixxtComposerAdapter({\n  input,\n  meta,\n  ...props\n}: TixxtComposerAdapterTypes) {\n  return (\n    <div className={`${styles.Text} property-${input.name}`}>\n      <TixxtComposer\n        {...props}\n        {...input}\n        key={meta.initial} // Recreate TixxtComposer component if the initialValue has changed\n        content={input.value}\n        onChange={input.onChange}\n        onFocus={input.onFocus}\n        onBlur={input.onBlur}\n      />\n      {meta.error && <FieldError error={meta.error} />}\n    </div>\n  );\n}\n\nexport default TixxtComposerAdapter;\n","// extracted by mini-css-extract-plugin\nexport default {\"ReplyComposer\":\"OuoRXtzHlHU6PyKh5ZwN\",\"ReplyComposerFormActions\":\"tygQqYAhR6inkD2R96gw\",\"Attachments\":\"VwP9iSI69AeDK23kZgaV\",\"AttachmentsSelector\":\"q7nYRB_yFW8ixnMHdCaw\",\"AttachmentsSelectorItem\":\"APupfJef6498jpgkzfDv\",\"FileUpload\":\"T0G4E4XfknBJAi9eItlD vF45nkt0KGJ2Ckq1ntH0\",\"closed\":\"vnkRSF5lwOsOm8Js391X\"};","import React, { useEffect, useState } from \"react\";\nimport { connect } from \"react-redux\";\nimport { Field, formValueSelector } from \"redux-form\";\nimport { size, filter } from \"lodash\";\nimport { State } from \"@types\";\nimport FileUploadField from \"../../shared/fields/FileUploadField\";\n\nimport styles from \"./ReplyComposer.module.css\";\n\ninterface AttachmentsTypes {\n  composerName: string;\n  selectedTab?: string;\n  filesCount?: number;\n  imagesCount?: number;\n}\n\nfunction Attachments({\n  filesCount,\n  imagesCount,\n  selectedTab = \"\",\n}: AttachmentsTypes) {\n  const [openTab, setOpenTab] = useState(selectedTab);\n\n  // To react to external isOpen prop changes\n  useEffect(() => setOpenTab(selectedTab), [selectedTab]);\n\n  return (\n    <div className=\"mt-2\">\n      <div className=\"flex space-x-2\">\n        <a\n          href=\"#\"\n          className=\"relative btn btn-sm btn-light\"\n          onClick={(e) => {\n            e.preventDefault();\n            setOpenTab(\"files\");\n          }}\n        >\n          <i className=\"fa-regular fa-files\" />{\" \"}\n          {(filesCount as number) > 0 ? (\n            <span className=\"!absolute badge rounded-xl bg-unread -right-1.5 !-top-1.5\">\n              {filesCount}\n            </span>\n          ) : null}\n        </a>\n\n        <a\n          className=\"relative btn btn-sm btn-light\"\n          href=\"#\"\n          onClick={(e) => {\n            e.preventDefault();\n            setOpenTab(\"images\");\n          }}\n        >\n          <i className=\"fa fa-image\" />\n          {(imagesCount as number) > 0 ? (\n            <span className=\"!absolute badge rounded-xl bg-unread -right-1.5 !-top-1.5\">\n              {imagesCount}\n            </span>\n          ) : null}\n        </a>\n      </div>\n      {openTab == \"files\" ? (\n        <Field\n          name=\"files\"\n          component={FileUploadField}\n          props={{\n            className: styles.FileUpload,\n            multiple: true,\n            selectExisting: true,\n          }}\n        />\n      ) : null}\n      {openTab == \"images\" ? (\n        <Field\n          name=\"images\"\n          component={FileUploadField}\n          props={{\n            className: styles.FileUpload,\n            multiple: true,\n            isImage: true,\n            storageDirectory: \"images\",\n          }}\n        />\n      ) : null}\n    </div>\n  );\n}\n\nconst filterRemoved = (items) =>\n  filter(items, (item) => item.state != \"removed\");\n\nexport default connect((state, { composerName }: AttachmentsTypes) => {\n  const selector = formValueSelector(composerName);\n\n  return {\n    filesCount: size(filterRemoved(selector(state as State, \"files\"))),\n    imagesCount: size(filterRemoved(selector(state as State, \"images\"))),\n  };\n})(Attachments);\n","import { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\n/* Replies */\nexport function createComment({ activityId, type = \"replies\", ...body }) {\n  return fetchApi(`/api/v1/activities/${activityId}/${type}`, {\n    method: \"POST\",\n    body,\n  });\n}\nexport function useCreateComment(options) {\n  return useMutation(createComment, options);\n}\n\nexport function updateComment({\n  activityId,\n  replyId,\n  type = \"replies\",\n  ...body\n}) {\n  return fetchApi(`/api/v1/activities/${activityId}/${type}/${replyId}`, {\n    method: \"PUT\",\n    body,\n  });\n}\nexport function useUpdateComment(options) {\n  return useMutation(updateComment, options);\n}\n","import { useSelector } from \"react-redux\";\nimport { formValueSelector } from \"redux-form\";\nimport { some, isEmpty } from \"lodash\";\n\nconst useFileProcessing = (formName: string, fieldName: string) => {\n  const selector = formValueSelector(formName);\n  const fieldAttachments = useSelector((state: any) =>\n    selector(state, fieldName),\n  );\n\n  const isProcessing = !isEmpty(fieldAttachments)\n    ? some(fieldAttachments, { state: \"uploading\" })\n    : false;\n\n  return isProcessing;\n};\n\nexport default useFileProcessing;\n","import React, { useState, useEffect } from \"react\";\nimport { Field } from \"redux-form\";\nimport { map, filter } from \"lodash\";\n\nimport ReduxForm from \"../../shared/reduxForm\";\nimport TixxtComposerAdapter from \"../composer/TixxtComposerAdapter\";\nimport Attachments from \"./Attachments\";\nimport Modal from \"components/shared/Modal\";\nimport { useCreateComment, useUpdateComment } from \"./api\";\n\nimport styles from \"./ReplyComposer.module.css\";\nimport useFileProcessing from \"components/shared/hooks/useFileProcessing\";\n\nconst resizeCallback = ($modalEl, modalBodyHeight) => {\n  let composerCss;\n  let editorRootCss;\n\n  if (modalBodyHeight == null) {\n    composerCss = {\n      maxHeight: \"none\",\n      minHeight: \"0\",\n    };\n\n    editorRootCss = {\n      maxHeight: \"none\",\n      minHeight: \"0\",\n    };\n  } else {\n    const composerHeight = modalBodyHeight - 32;\n    const editorHeight = composerHeight - 34 - 50;\n\n    composerCss = {\n      maxHeight: `${composerHeight}px`,\n      minHeight: `${composerHeight}px`,\n    };\n\n    editorRootCss = {\n      maxHeight: `${editorHeight}px`,\n      minHeight: `${editorHeight}px`,\n    };\n  }\n\n  $modalEl.find(\".Composer\").css(composerCss);\n  $modalEl.find(\".DraftEditor-root\").css(editorRootCss);\n};\n\nconst filterRemoved = (items) =>\n  filter(items, (item) => item.state != \"removed\");\n\ninterface ReplyComposerTypes {\n  type?: \"replies\" | \"answers\";\n  activityId: string;\n  reply: {\n    id: string;\n    content: string;\n    files: Array<unknown>;\n    images: Array<unknown>;\n  };\n  isOpen?: boolean;\n  selectedTab: string;\n\n  saveCallback(...args: unknown[]): unknown;\n\n  cancelCallback(...args: unknown[]): unknown;\n}\n\nfunction ReplyComposer({\n  type = \"replies\",\n  activityId,\n  reply,\n  isOpen = false,\n  selectedTab,\n  saveCallback,\n  cancelCallback,\n}: ReplyComposerTypes) {\n  const [open, setOpen] = useState(isOpen);\n  const [fullscreen, setFullscreen] = useState(false);\n  const [isProcessing, setIsProcessing] = useState(false);\n  const composerName = `replyComposer-${activityId}-${reply.id || type}`;\n\n  const openComposer = () => {\n    setOpen(true);\n  };\n  const closeComposer = (reset?) => {\n    if (reset) {\n      reset();\n    }\n    setOpen(false);\n  };\n  const openFullscreen = () => {\n    setFullscreen(true);\n  };\n  const closeFullscreen = () => {\n    setFullscreen(false);\n  };\n\n  const onSuccess = (result) => {\n    if (saveCallback) {\n      saveCallback(result);\n    }\n\n    setIsProcessing(false);\n    closeComposer();\n  };\n\n  const onCancel = () => {\n    if (cancelCallback) {\n      cancelCallback();\n    }\n\n    closeComposer();\n  };\n\n  const onError = () => {\n    setIsProcessing(false);\n  };\n\n  const { mutate: createComment } = useCreateComment({\n    onSuccess,\n    onError,\n  });\n  const { mutate: updateComment } = useUpdateComment({ onSuccess, onError });\n\n  function handleSubmit(values) {\n    setIsProcessing(true);\n    const body = {\n      ...values,\n      files: map(filterRemoved(values.files), (file) => file.id),\n      images: map(filterRemoved(values.images), (image) => image.id),\n    };\n\n    if (reply.id) {\n      return updateComment({\n        activityId: activityId,\n        replyId: reply.id,\n        type,\n        ...body,\n      });\n    } else {\n      return createComment({ activityId: activityId, type, ...body });\n    }\n  }\n\n  // To react to external isOpen prop changes\n  useEffect(() => {\n    isOpen ? openComposer() : closeComposer();\n  }, [isOpen]);\n\n  const fileProcessing = useFileProcessing(composerName, \"files\");\n  const imageProcessing = useFileProcessing(composerName, \"images\");\n\n  return open ? (\n    <ReduxForm\n      form={composerName}\n      submitText={I18n.t(`js.activitystreams.${type}.submit`)}\n      initialValues={reply}\n      processing={isProcessing || fileProcessing || imageProcessing}\n      onSubmit={handleSubmit}\n      onCancel={onCancel}\n      className={styles.ReplyComposer}\n      classNameFormActions={styles.ReplyComposerFormActions}\n    >\n      {fullscreen ? (\n        <Modal\n          static\n          fullscreen\n          resizeCallback={resizeCallback}\n          onClose={closeFullscreen}\n          title={I18n.t(`js.activitystreams.${type}.author_hint`)}\n        >\n          <Field\n            name=\"content\"\n            component={TixxtComposerAdapter}\n            props={{ handleFullscreen: closeFullscreen }}\n          />\n        </Modal>\n      ) : (\n        <Field\n          name=\"content\"\n          component={TixxtComposerAdapter}\n          props={{ handleFullscreen: openFullscreen }}\n        />\n      )}\n      <Attachments composerName={composerName} selectedTab={selectedTab} />\n    </ReduxForm>\n  ) : (\n    <button\n      key=\"dummy\"\n      className={`Composer object-content-input form-control ${styles.closed}`}\n      onClick={openComposer}\n    >\n      <span className=\"placeholder\">\n        {I18n.t(`js.activitystreams.${type}.author_hint`)}\n      </span>\n    </button>\n  );\n}\n\nexport default ReplyComposer;\n","import React from \"react\";\nimport { FormSection } from \"redux-form\";\nimport { get, uniq } from \"lodash\";\nimport ControlGroup from \"../fields/ControlGroup\";\nimport Fields from \"../../appCreator/items/form/Fields\";\nimport { TagParentsContext } from \"../../appCreator/properties/edit/TagField\";\nimport { usePropertySet } from \"components/shared/propertySets/api\";\n\ninterface EmbeddedValueSetFormProps {\n  name: string;\n  contextId: string;\n  contextType: string;\n}\n\nfunction EmbeddedValueSetForm({\n  name,\n  contextId,\n  contextType,\n}: EmbeddedValueSetFormProps) {\n  const { isLoading: loading, data: propertySet } = usePropertySet({\n    name,\n    contextId,\n    contextType,\n  });\n\n  if (loading) {\n    return (\n      <ControlGroup name={name} label=\"Wird geladen...\">\n        <i className=\"fa fa-spinner fa-spin\" />\n      </ControlGroup>\n    );\n  }\n\n  // Always include network scope when looking up tags for file_- and folder_profile\n  const tagParents = get(propertySet, [\"tag_parents\"], []);\n  if (name === \"file_profile\" || name === \"folder_profile\")\n    tagParents.unshift(\"network\");\n\n  return (\n    <TagParentsContext.Provider value={uniq(tagParents)}>\n      <FormSection name={name}>\n        <Fields\n          name={name}\n          properties={propertySet ? propertySet.properties : null}\n          itemId={name}\n        />\n      </FormSection>\n    </TagParentsContext.Provider>\n  );\n}\n\nexport default EmbeddedValueSetForm;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Field, reduxForm } from \"redux-form\";\nimport { compose, mapProps } from \"recompose\";\nimport { omit } from \"lodash\";\nimport PropTypes from \"prop-types\";\nimport { selectFolderProfilesEnabled } from \"selectors/propertySets\";\nimport EmbeddedValueSetForm from \"components/shared/propertySets/EmbeddedValueSetForm\";\nimport ControlGroup from \"components/shared/fields/ControlGroup\";\n\nfunction FolderForm({\n  id,\n  parentFolderId,\n  handleSubmit,\n  onCancel,\n  submitting,\n}) {\n  const showFolderProfileFields = useSelector(selectFolderProfilesEnabled);\n\n  return (\n    <form className=\"form-horizontal\" onSubmit={handleSubmit}>\n      <ControlGroup\n        name=\"name\"\n        label={I18n.t(\"js.files.folder.form.name.label\")}\n      >\n        <Field\n          name=\"name\"\n          component=\"input\"\n          type=\"text\"\n          autoFocus\n          className=\"flex\"\n        />\n      </ControlGroup>\n      <ControlGroup\n        name=\"description\"\n        label={I18n.t(\"js.files.folder.form.description.label\")}\n      >\n        <Field\n          name=\"description\"\n          component=\"textarea\"\n          rows={5}\n          className=\"flex\"\n        />\n      </ControlGroup>\n      {showFolderProfileFields ? (\n        <EmbeddedValueSetForm\n          name=\"folder_profile\"\n          contextType=\"folder\"\n          contextId={id || parentFolderId}\n        />\n      ) : null}\n      <div className=\"form-actions flex my-4 gap-2 justify-end\">\n        <a className=\"btn btn-light\" href=\"#cancel\" onClick={onCancel}>\n          {I18n.t(\"js.cancel\")}\n        </a>\n        <button className=\"btn btn-success\" disabled={submitting}>\n          {id\n            ? I18n.t(\"js.files.folder.form.update_folder\")\n            : I18n.t(\"js.files.folder.form.create_folder\")}\n        </button>\n      </div>\n    </form>\n  );\n}\nFolderForm.propTypes = {\n  id: PropTypes.string,\n  parentFolderId: PropTypes.string,\n  handleSubmit: PropTypes.func,\n  onCancel: PropTypes.func,\n  submitting: PropTypes.bool,\n};\n\nexport default compose(\n  mapProps(({ folder, onSubmit, onCancel }) => ({\n    id: folder.id,\n    parentFolderId: folder.parent_folder_id,\n    initialValues: {\n      name: folder.name,\n      description: folder.description,\n      folder_profile: omit(folder.folder_profile, [\"$_displayValues_\"]),\n    },\n    onSubmit,\n    onCancel,\n  })),\n  reduxForm({ form: \"folder\", enableReinitialize: true }),\n)(FolderForm);\n","import React, { useState } from \"react\";\nimport { map, split, get, orderBy, includes, isEmpty } from \"lodash\";\n\nimport useFolderResource from \"components/files/hooks/useFolderResource\";\nimport Modal from \"components/shared/Modal\";\nimport Sorter from \"components/shared/tables/Sorter\";\nimport FolderRow from \"./table/FolderRow\";\nimport { Folder } from \"../../@types/files\";\n\ntype FolderSelectModalArgs = {\n  currentRootFolder: { id: string; namespace: string };\n  modalTitle: string;\n  closeModal: () => void;\n  onSelectFolder: (folder: Folder) => void;\n  selectedItemIds: string[];\n};\n\nfunction FolderSelectModal({\n  currentRootFolder,\n  closeModal,\n  onSelectFolder,\n  selectedItemIds,\n  modalTitle,\n}: FolderSelectModalArgs) {\n  const [sortBy, setSortBy]: [\n    [string, number],\n    (sortBy: [string, number]) => void,\n  ] = useState([\"name\", 1]);\n  const { loading, currentFolder, handleNavigate, breadcrumb } =\n    useFolderResource({ currentRootFolder });\n\n  function handleSort(sortBy) {\n    setSortBy(sortBy);\n  }\n\n  function selectFolder(e) {\n    e.preventDefault();\n    onSelectFolder(currentFolder);\n    closeModal();\n  }\n\n  return (\n    <Modal\n      onClose={closeModal}\n      title={modalTitle}\n      modalActionProps={{\n        submitText: \"js.files.folder.select\",\n        submit: selectFolder,\n        closeModal: (e) => {\n          e.preventDefault();\n          closeModal();\n        },\n      }}\n    >\n      {breadcrumb}\n      <table className=\"w-full\">\n        <thead className=\"bg-gray-100\">\n          <tr>\n            <th className=\"col-icon p-2\" />\n            <th className=\"col-name p-2\">\n              <Sorter\n                attribute=\"name\"\n                label={I18n.t(\"js.files.folder.file_name\")}\n                handleSort={handleSort}\n                sortBy={sortBy}\n              />\n            </th>\n          </tr>\n        </thead>\n        <tbody className=\"divide-y divide-gray-300\">\n          {loading ? (\n            <tr>\n              <td colSpan={2} className=\"empty-folder\">\n                {I18n.t(\"js.files.folder.loading\")}\n              </td>\n            </tr>\n          ) : isEmpty(get(currentFolder, \"subfolders\")) ? (\n            <tr>\n              <td colSpan={2} className=\"empty-folder\">\n                {I18n.t(\"js.files.folder.no_subfolders_message\")}\n              </td>\n            </tr>\n          ) : (\n            map(\n              orderBy(\n                get(currentFolder, \"subfolders\"),\n                sortBy[0],\n                sortBy[1] === -1 ? \"desc\" : \"asc\",\n              ),\n              (folder: Folder) => (\n                <FolderRow\n                  key={folder.id}\n                  {...folder}\n                  type={split(folder.i18n_type, \".\")[0]}\n                  navigateDisabled={\n                    includes(selectedItemIds, folder.id) ||\n                    split(folder.i18n_type, \".\")[0] === \"activitystream_folder\"\n                  }\n                  handleNavigate={(e) => {\n                    e.preventDefault();\n                    handleNavigate({ id: folder.id });\n                  }}\n                />\n              ),\n            )\n          )}\n        </tbody>\n      </table>\n    </Modal>\n  );\n}\n\nexport default FolderSelectModal;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, filter, get, isEmpty } from \"lodash\";\n\nimport FieldError from \"components/appCreator/items/form/FieldError\";\nimport FolderSelectModal from \"./FolderSelectModal\";\nimport preventDefault from \"../../helpers/components/preventDefault\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { useFetchFolder } from \"./api\";\n\nconst getIcon = (type) => {\n  switch (type) {\n    case \"root_folder.group\":\n      return <FontAwesomeIcon icon={regular(\"users\")} fixedWidth />;\n    default:\n      return <FontAwesomeIcon icon={regular(\"folder\")} fixedWidth />;\n  }\n};\n\nfunction SelectedFolder({ unselectFolder, folderId }) {\n  const { data: currentFolder, isLoading: loading } = useFetchFolder(folderId);\n\n  if (isEmpty(currentFolder) || loading) {\n    return (\n      <div>\n        <FontAwesomeIcon icon={regular(\"spinner\")} spin />\n      </div>\n    );\n  }\n\n  return (\n    <div className={\"flex gap-2 py-2\"}>\n      <div>{getIcon(currentFolder.i18n_type)}</div>\n      <div className=\"grow flex gap-2 items-center\">\n        {map(get(currentFolder, [\"folder_path\"], []), (folder) => (\n          <React.Fragment key={folder.id}>\n            <span className=\"text-muted\">{folder.name}</span>\n            <FontAwesomeIcon\n              icon={regular(\"chevron-right\")}\n              className={\"text-muted fa-sm\"}\n            />\n          </React.Fragment>\n        ))}\n        {currentFolder ? <span className=\"\">{currentFolder.name}</span> : null}\n      </div>\n      <div className=\"\">\n        {unselectFolder ? (\n          <a\n            href=\"#remove\"\n            className=\"fa fa-times remove btn-mini\"\n            onClick={preventDefault(() => unselectFolder({ id: folderId }))}\n            title={I18n.t(\"js.remove\")}\n          />\n        ) : null}\n      </div>\n    </div>\n  );\n}\n\nSelectedFolder.propTypes = {\n  folderId: PropTypes.string,\n  unselectFolder: PropTypes.func,\n};\n\nfunction FolderSelectionField({ input, meta, defaultFolder }) {\n  const [showModal, setShowModal] = useState(false);\n\n  const unselectFolder = (targetFolder) => {\n    input.onChange(filter(input.value, (id) => id !== targetFolder.id));\n  };\n\n  const selectFolder = (targetFolder) => {\n    if (input.value.indexOf(targetFolder.id) !== -1) return;\n\n    input.onChange([...input.value, targetFolder.id]);\n  };\n\n  return (\n    <>\n      <div className={\"FolderSelectionField\"}>\n        {showModal ? (\n          <FolderSelectModal\n            modalTitle={I18n.t(\"js.files.folder_selection.modal_title\")}\n            currentRootFolder={defaultFolder}\n            selectedItemIds={input.value}\n            onSelectFolder={selectFolder}\n            closeModal={() => setShowModal(false)}\n          />\n        ) : null}\n        <div\n          className={\"border-box px-3 divide-dashed divide-neutral divide-y\"}\n        >\n          {map(input.value, (folderId) => (\n            <SelectedFolder\n              key={folderId}\n              folderId={folderId}\n              unselectFolder={\n                folderId === defaultFolder?.id ? null : unselectFolder\n              }\n            />\n          ))}\n          <div className={\"py-2\"}>\n            <a\n              href=\"#\"\n              onClick={preventDefault(() => setShowModal(!showModal))}\n            >\n              <FontAwesomeIcon\n                icon={regular(\"folder-open\")}\n                fixedWidth\n                className={\"mr-2\"}\n              />\n              {I18n.t(\"js.files.folder_selection.button\")}\n            </a>\n          </div>\n        </div>\n      </div>\n      {meta.error && <FieldError error={meta.error} />}\n      <span className=\"help-block\">\n        {I18n.t(\"js.files.file.folder_selection.hint\")}\n      </span>\n    </>\n  );\n}\n\nFolderSelectionField.propTypes = {\n  ...FieldError.propTypes,\n  defaultFolder: PropTypes.object,\n};\n\nexport default FolderSelectionField;\n","// extracted by mini-css-extract-plugin\nexport default {};","import React from \"react\";\nimport { connect, useSelector } from \"react-redux\";\nimport { Field, reduxForm } from \"redux-form\";\nimport { compose } from \"recompose\";\nimport PropTypes from \"prop-types\";\n\nimport TextField from \"../appCreator/properties/edit/TextField\";\nimport { selectFileProfilesEnabled } from \"selectors/propertySets\";\nimport FolderSelectionField from \"./FolderSelectionField\";\nimport EmbeddedValueSetForm from \"components/shared/propertySets/EmbeddedValueSetForm\";\nimport ControlGroup from \"components/shared/fields/ControlGroup\";\nimport styles from \"./files.module.css\";\nimport FormActions from \"../shared/reduxForm/FormActions\";\nimport { useParams, useSearchParams } from \"helpers/tixxt-router\";\nimport { rootFolderIdSelector } from \"../../selectors/folders\";\nimport { isEmpty } from \"lodash\";\nimport { useFetchFolder } from \"./api\";\n\nfunction EditFileForm({\n  initialValues,\n  handleSubmit,\n  onCancel,\n  showFileProfileFields,\n  pristine,\n  submitting,\n}) {\n  const { groupSlug } = useParams();\n  const [searchParams] = useSearchParams();\n  const contextRootFolderId = useSelector(rootFolderIdSelector({ groupSlug }));\n  const folderId = searchParams.get(\"folder_id\") || contextRootFolderId;\n\n  const { data: folder, isLoading: loading } = useFetchFolder(folderId);\n\n  const defaultFolder = folder;\n\n  return (\n    <>\n      {loading && isEmpty(folder) ? (\n        I18n.t(\"js.loading\")\n      ) : (\n        <form className=\"form-horizontal\" onSubmit={handleSubmit}>\n          <ControlGroup name=\"name\" label={I18n.t(\"js.files.edit.name.label\")}>\n            <TextField name=\"name\" autoFocus />\n          </ControlGroup>\n          <ControlGroup\n            name=\"folder_ids\"\n            label={I18n.t(\"js.files.file.folder_selection.label\")}\n          >\n            <Field\n              name=\"folder_ids\"\n              component={FolderSelectionField}\n              props={{ defaultFolder }}\n            />\n          </ControlGroup>\n          <ControlGroup\n            name=\"description\"\n            label={I18n.t(\"js.files.edit.description.label\")}\n          >\n            <Field\n              name=\"description\"\n              component=\"textarea\"\n              rows={5}\n              className={styles.FileDescription}\n            />\n          </ControlGroup>\n          {showFileProfileFields ? (\n            <EmbeddedValueSetForm\n              name=\"file_profile\"\n              contextType=\"file\"\n              contextId={initialValues.id}\n            />\n          ) : null}\n          <FormActions\n            pristine={pristine}\n            submitting={submitting}\n            submitText={I18n.t(\"js.files.edit.submit\")}\n            onCancel={onCancel}\n          />\n        </form>\n      )}\n    </>\n  );\n}\n\nEditFileForm.propTypes = {\n  defaultFolder: PropTypes.shape({\n    id: PropTypes.string.isRequired,\n    group_id: PropTypes.string,\n  }),\n  initialValues: PropTypes.object.isRequired,\n  handleSubmit: PropTypes.func,\n  onCancel: PropTypes.func,\n  submitting: PropTypes.bool,\n  pristine: PropTypes.bool,\n  showFileProfileFields: PropTypes.bool,\n};\n\nexport default compose(\n  connect((state) => ({\n    showFileProfileFields: selectFileProfilesEnabled(state),\n  })),\n  reduxForm({\n    form: \"edit-file\",\n    enableReinitialize: true,\n  }),\n)(EditFileForm);\n","import React from \"react\";\nimport { isNil, map } from \"lodash\";\nimport PropertyShow from \"../../appCreator/properties/PropertyShow\";\n\nimport styles from \"./propertySets.module.css\";\nimport { usePropertySet } from \"components/shared/propertySets/api\";\n\ninterface MaybeWrappedProps {\n  onlyRows?: boolean;\n  children?: React.ReactNode | React.ReactNode[];\n}\n\nfunction MaybeWrapped({ onlyRows, children }: MaybeWrappedProps) {\n  return onlyRows ? (\n    <>{children}</>\n  ) : (\n    <table className={`${styles.ValueSetTable}`}>\n      <tbody>{children}</tbody>\n    </table>\n  );\n}\n\ninterface ValueSetTableProps {\n  contextType: string;\n  contextId?: string;\n  name: string;\n  values?: unknown;\n  onlyRows?: boolean;\n  showLoading?: boolean;\n  options?: object;\n}\n\nfunction ValueSetTable({\n  contextType,\n  contextId,\n  name,\n  values,\n  options,\n  onlyRows = false,\n  showLoading = true,\n}: ValueSetTableProps) {\n  const { isLoading: loading, data: propertySet } = usePropertySet({\n    name,\n    contextId,\n    contextType,\n  });\n\n  return (\n    <>\n      {showLoading && loading ? (\n        <MaybeWrapped onlyRows={onlyRows} key=\"loading\">\n          <tr>\n            <th className=\"muted\">Wird geladen...</th>\n            <td>\n              <i className=\"fa-regular fa-spinner fa-spin\" />\n            </td>\n          </tr>\n        </MaybeWrapped>\n      ) : null}\n      {isNil(propertySet) || isNil(values) ? null : (\n        <MaybeWrapped onlyRows={onlyRows} key=\"list\">\n          {map(propertySet.properties, (prop) => (\n            <tr key={prop.name}>\n              <th className=\"font-medium text-left pb-2\">{prop.label}</th>\n              <td className=\"pl-4 pb-2\">\n                <PropertyShow\n                  property={prop}\n                  item={{ values }}\n                  options={options}\n                />\n              </td>\n            </tr>\n          ))}\n        </MaybeWrapped>\n      )}\n    </>\n  );\n}\n\nexport default ValueSetTable;\n","import React, {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport PropTypes from \"prop-types\";\nimport {\n  compact,\n  difference,\n  endsWith,\n  get,\n  groupBy,\n  includes,\n  isEmpty,\n  map,\n  every,\n  some,\n} from \"lodash\";\nimport { useQuery } from \"react-query\";\n\nimport FolderSelectModal from \"./FolderSelectModal\";\nimport preventDefault from \"helpers/components/preventDefault\";\nimport { useDispatch } from \"react-redux\";\nimport useItemBatchSelection from \"../shared/hooks/useItemBatchSelection\";\nimport {\n  moveFiles,\n  moveFolders,\n  removeFiles,\n  removeFolders,\n} from \"../../actions/files\";\nimport Modal from \"../shared/Modal\";\nimport DefaultFolderRow from \"./table/FolderRow\";\nimport DefaultFileRow from \"./table/FileRow\";\n\nfunction BatchActions({\n  children,\n  contents,\n  currentFolder,\n  onRemoveItems,\n  onMoveItems,\n}) {\n  const headerRef = useRef(null);\n  const [isHoveringHeader, setIsHoveringHeader] = useState(false);\n\n  useEffect(() => {\n    if (headerRef.current !== null) {\n      headerRef.current.onmouseover = () => setIsHoveringHeader(true);\n      headerRef.current.onmouseleave = () => setIsHoveringHeader(false);\n    }\n  }, [headerRef.current]);\n\n  const ids = useRef([]);\n  ids.current = compact(\n    map(contents, (c) =>\n      !includes([\"activitystream_folder\", \"root_folder\"], c.type) ? c.id : null,\n    ),\n  );\n\n  const [selectedIds, selectIds] = useState([]);\n  const [isRemoving, setRemoving] = useState(false);\n  const [isMoving, setMoving] = useState(false);\n\n  const allSelected = difference(ids.current, selectedIds).length === 0;\n\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    (async () => {\n      try {\n        if (isRemoving) {\n          if (!isEmpty(selectedItemIdsByType.file)) {\n            await dispatch(\n              removeFiles({\n                body: {\n                  file_ids: map(selectedItemIdsByType.file, (f) => f.id),\n                },\n              }),\n            );\n          }\n          if (!isEmpty(selectedItemIdsByType.folder)) {\n            await dispatch(\n              removeFolders({\n                body: {\n                  folder_ids: map(selectedItemIdsByType.folder, (f) => f.id),\n                },\n              }),\n            );\n          }\n        }\n\n        setRemoving(false);\n        onRemoveItems(selectedIds);\n        selectIds([]);\n      } catch (e) {\n        setRemoving(false);\n      }\n    })();\n\n    return;\n  }, [isRemoving]);\n  const onSelectItem = useItemBatchSelection(ids, selectedIds, selectIds);\n\n  const selectAll = useCallback((e) => {\n    if (!e.target.checked) {\n      selectIds([]);\n    } else {\n      selectIds(ids.current);\n    }\n  }, []);\n\n  const selectedItemIdsByType = groupBy(\n    compact(\n      map(contents, (content) =>\n        includes(selectedIds, content.id)\n          ? {\n              type: content.type,\n              id: content.id,\n              canDestroy: content.can.destroy,\n              finalized: !!content.finalizedAt,\n              locked: !!content.lockedById,\n            }\n          : null,\n      ),\n    ),\n    \"type\",\n  );\n\n  const removeSelected = async () => {\n    window.bridge.confirm(\n      I18n.t(\"js.files.batch_actions.delete_confirm\"),\n      () => {\n        setRemoving(true);\n      },\n    );\n  };\n\n  const moveSelected = async (targetFolder) => {\n    setMoving(true);\n    try {\n      if (!isEmpty(selectedItemIdsByType.file)) {\n        await dispatch(\n          moveFiles({\n            body: {\n              file_ids: map(selectedItemIdsByType.file, (f) => f.id),\n              target_folder_id: targetFolder.id,\n              source_folder_id: currentFolder.id,\n            },\n          }),\n        );\n      }\n      if (!isEmpty(selectedItemIdsByType.folder)) {\n        await dispatch(\n          moveFolders({\n            body: {\n              folder_ids: map(selectedItemIdsByType.folder, (f) => f.id),\n              target_folder_id: targetFolder.id,\n            },\n          }),\n        );\n      }\n      onMoveItems(targetFolder.id);\n      selectIds([]);\n    } catch (e) {\n      setMoving(false);\n    }\n  };\n\n  const rowProps = (item) => {\n    const props = {\n      isSelected: includes(selectedIds, item.id),\n      showCheckbox: !isEmpty(selectedIds),\n    };\n\n    if (endsWith(item.type, \"folder\")) {\n      return {\n        ...props,\n        disableSelection: includes(\n          [\"activitystream_folder\", \"root_folder\"],\n          item.type,\n        ),\n        onSelectFolder: onSelectItem,\n      };\n    } else {\n      return {\n        ...props,\n        onSelectFile: onSelectItem,\n      };\n    }\n  };\n\n  const selectAllCheckbox = useMemo(\n    () => (\n      <td className=\"col-checkbox p-2 text-center\">\n        <input\n          type=\"checkbox\"\n          checked={allSelected}\n          onChange={selectAll}\n          className={\n            isHoveringHeader || !isEmpty(selectedIds) ? \"\" : \"invisible\"\n          }\n        />\n      </td>\n    ),\n    [allSelected, selectAll, isHoveringHeader, selectedIds],\n  );\n\n  const childProps = {\n    selectedIds,\n    onSelectItem,\n    headerRef,\n    selectAllCheckbox,\n    rowProps,\n  };\n\n  return (\n    <>\n      {!isEmpty(selectedIds) ? (\n        <Toolbar\n          currentFolder={currentFolder}\n          selectedItemIds={selectedIds}\n          selectedItemAndFolderIds={selectedItemIdsByType}\n          removeSelected={removeSelected}\n          moveSelected={moveSelected}\n        />\n      ) : null}\n      {isMoving ? (\n        <Modal static>\n          <Modal.Spinner label={I18n.t(\"js.files.batch_actions.is_moving\")} />\n        </Modal>\n      ) : null}\n      {isRemoving ? (\n        <Modal static>\n          <Modal.Spinner label={I18n.t(\"js.files.batch_actions.is_removing\")} />\n        </Modal>\n      ) : null}\n      {children(childProps)}\n    </>\n  );\n}\n\nBatchActions.propTypes = {\n  children: PropTypes.func,\n  contents: PropTypes.arrayOf(\n    PropTypes.oneOfType([\n      PropTypes.shape(DefaultFolderRow.propTypes),\n      PropTypes.shape(DefaultFileRow.propTypes),\n    ]),\n  ),\n  currentFolder: PropTypes.shape({\n    id: PropTypes.string,\n    namespace: PropTypes.string,\n    parentFolderId: PropTypes.string,\n  }),\n  onRemoveItems: PropTypes.func,\n  onMoveItems: PropTypes.func,\n};\n\nconst fileServerV2Discovery = async () => {\n  const response = await fetch(\"/api/storage/v2/discover\", {\n    credentials: \"include\",\n  });\n  return response.ok;\n};\n\n// returns true if user can destroy all selected folders and files\nconst canDestroyAndMove = (selectedItemAndFolderIds) => {\n  const folders = get(selectedItemAndFolderIds, [\"folder\"], []);\n  const files = get(selectedItemAndFolderIds, [\"file\"], []);\n\n  return every(folders, \"canDestroy\") && every(files, \"canDestroy\");\n};\n\nconst isFinalizedOrLocked = (selectedItemAndFolderIds) => {\n  const files = get(selectedItemAndFolderIds, [\"file\"], []);\n\n  return some(files, \"finalized\") || some(files, \"locked\");\n};\n\nconst Toolbar = ({\n  selectedItemIds,\n  removeSelected,\n  selectedItemAndFolderIds,\n  currentFolder,\n  moveSelected,\n}) => {\n  const formRef = useRef();\n  const [showModal, setShowModal] = useState(false);\n  const [isDownloading, setIsDownloading] = useState(false);\n\n  const disabled =\n    isEmpty(selectedItemIds) || !canDestroyAndMove(selectedItemAndFolderIds);\n\n  const canBeMoved = currentFolder.namespace !== \"activitystream_folders\";\n\n  const { data: fileServerV2available } = useQuery(\n    \"fileServerV2Discovery\",\n    fileServerV2Discovery,\n    { staleTime: 60 * 60 * 1000 },\n  );\n\n  const serializeItemAndFolderIds = () => {\n    const files = get(selectedItemAndFolderIds, [\"file\"], []);\n    const folders = get(selectedItemAndFolderIds, [\"folder\"], []);\n\n    return {\n      file_ids: map(files, \"id\"),\n      folder_ids: map(folders, \"id\"),\n      current_folder_id: currentFolder.id,\n    };\n  };\n\n  const startDownload = async () => {\n    setIsDownloading(true);\n\n    const response = await fetch(\"/api/v1/file_token\", {\n      method: \"post\",\n      headers: { \"Content-Type\": \"application/json\" },\n      credentials: \"include\",\n      body: JSON.stringify(serializeItemAndFolderIds()),\n    });\n\n    const responseData = await response.json();\n\n    formRef.current.token.value = responseData.token;\n    formRef.current.submit();\n    setIsDownloading(false);\n  };\n\n  return (\n    <>\n      <div className=\"fixed bottom-10 w-full lg:w-[calc(100%-260px)] 2xl:w-[calc(1536px - 280px)] flex justify-center z-50\">\n        <div className=\"files-toolbar flex bg-gray-200 gap-2 p-2 px-6 rounded-full items-center\">\n          <span className=\"text-sm text-muted\">\n            {selectedItemIds.length === 1\n              ? I18n.t(\"js.files.one_selected\")\n              : I18n.t(\"js.files.selected\", {\n                  count: selectedItemIds.length,\n                })}\n          </span>\n          {fileServerV2available ? (\n            <button\n              onClick={(e) => {\n                e.preventDefault();\n                startDownload(selectedItemIds);\n              }}\n              className=\"btn btn-light btn-sm\"\n              disabled={isDownloading}\n            >\n              <i className=\"fa-regular fa-cloud-download\" />{\" \"}\n              {I18n.t(\"js.files.show.toolbar.download_file\")}\n            </button>\n          ) : null}\n\n          {canBeMoved ? (\n            <span\n              title={\n                isFinalizedOrLocked(selectedItemAndFolderIds)\n                  ? I18n.t(\"js.files.batch_actions.disabled_hint\")\n                  : undefined\n              }\n            >\n              <button\n                onClick={(e) => {\n                  e.preventDefault();\n                  setShowModal(true);\n                }}\n                className=\"btn btn-light btn-sm\"\n                disabled={disabled}\n              >\n                <i className=\"fa-regular fa-arrows\" />{\" \"}\n                {I18n.t(\"js.files.batch_actions.move\")}\n              </button>\n            </span>\n          ) : null}\n          <span\n            title={\n              isFinalizedOrLocked(selectedItemAndFolderIds)\n                ? I18n.t(\"js.files.batch_actions.disabled_hint\")\n                : undefined\n            }\n          >\n            <button\n              className=\"btn btn-danger btn-sm delete-button\"\n              disabled={disabled}\n              onClick={preventDefault(removeSelected)}\n            >\n              <i className=\"fa-regular fa-trash-can\" />{\" \"}\n              {I18n.t(\"js.files.batch_actions.delete\")}\n            </button>\n          </span>\n        </div>\n        {showModal ? (\n          <FolderSelectModal\n            modalTitle={I18n.t(\"js.files.move.modal.title\")}\n            currentRootFolder={currentFolder}\n            selectedItemIds={selectedItemIds}\n            onSelectFolder={moveSelected}\n            closeModal={() => setShowModal(false)}\n          />\n        ) : null}\n        <form ref={formRef} method=\"post\" action=\"/api/storage/v2/archive\">\n          <input type=\"hidden\" name=\"token\" />\n        </form>\n      </div>\n    </>\n  );\n};\nToolbar.propTypes = {\n  removeSelected: PropTypes.func,\n  selectedItemIds: PropTypes.array,\n  moveSelected: PropTypes.func,\n  currentFolder: PropTypes.shape({\n    id: PropTypes.string,\n  }),\n};\n\nexport default BatchActions;\n","import { identity, isEmpty, map, pickBy, trim } from \"lodash\";\nimport { stringify as stringifyQuery } from \"query-string\";\n\n// Wraps value with quotes if necessary\nconst quote = (value) =>\n  value.match(/^[a-z0-9_\\-.]+$/i) ? value : `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n\n// Turns given value and name into filter syntax\n// Produces special syntax for tags\nconst filterToQueryString = (value, name) => {\n  const prefix = name === \"tag\" ? \"#\" : `${name}:`;\n  return `${prefix}${quote(value)}`;\n};\n\n// @param filters [Object] { tag: 'bla', 'profile.fach': 'potato' }\nexport function searchUrl({\n  groupSlug,\n  contextUrl,\n  q,\n  filters,\n  format,\n  ...params\n}) {\n  const formatExt = format === \"json\" ? \".json\" : \"\";\n  const baseSearchPath =\n    isEmpty(contextUrl) && !isEmpty(groupSlug)\n      ? `/groups/${groupSlug}/search${formatExt}`\n      : `${contextUrl || \"\"}/search${formatExt}`;\n  if (!isEmpty(filters) || !isEmpty(q)) {\n    params.q = searchQuery({ q, filters });\n  }\n\n  // Removes null and undefined\n  params = pickBy(params, identity);\n\n  return isEmpty(params)\n    ? baseSearchPath\n    : `${baseSearchPath}?${stringifyQuery(params)}`;\n}\n\n// Prepend filters as i.e. filtername:\"foo\" or #tag to q\nexport function searchQuery({ q: rawQ, filters }) {\n  let q = null;\n  // Prepend filters as i.e. filtername:\"foo\" or #tag to q\n  if (!isEmpty(filters)) {\n    const filterStrings = map(filters, filterToQueryString);\n    if (!isEmpty(rawQ)) {\n      filterStrings.push(rawQ);\n    }\n    q = trim(filterStrings.join(\" \"));\n  } else if (!isEmpty(rawQ)) {\n    q = trim(rawQ);\n  }\n\n  return q;\n}\n\n// Turns \"foo,asc\" into [\"foo\", 1]\n// Turns \"foo,desc\" into [\"foo\", -1]\nexport const parseSortByParam = (sortByParam) => {\n  if (isEmpty(sortByParam)) return null;\n\n  const [attribute, directionString] = sortByParam.split(\",\");\n  return attribute ? [attribute, directionString === \"desc\" ? -1 : 1] : null;\n};\n\n// Turns [\"foo\", 1] into \"foo,asc\"\n// Turns [\"foo\", -1] into \"foo,desc\"\nexport const serializeSortBy = (sortBy) => {\n  if (isEmpty(sortBy)) return null;\n\n  const [attribute, directionNumber] = sortBy;\n  return [attribute, directionNumber === -1 ? \"desc\" : \"asc\"].join(\",\");\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { TagUrlContext } from \"../appCreator/properties/show/Tag\";\nimport { SelectionUrlContext } from \"../appCreator/properties/show/Selection\";\nimport { searchUrl } from \"../globalSearch/urls\";\n\nconst tagUrl =\n  (contextUrl) =>\n  ({ name }) =>\n    searchUrl({ contextUrl, module: \"files\", filters: { tag: name } });\n\nconst selectionUrl =\n  (contextUrl) =>\n  ({ value, property }) =>\n    searchUrl({\n      contextUrl,\n      module: \"files\",\n      filters: {\n        [`profile.${property.name}`]: value,\n      },\n    });\n\nfunction UrlContextProvider({ contextUrl, children }) {\n  return (\n    <TagUrlContext.Provider value={tagUrl(contextUrl)}>\n      <SelectionUrlContext.Provider value={selectionUrl(contextUrl)}>\n        {children}\n      </SelectionUrlContext.Provider>\n    </TagUrlContext.Provider>\n  );\n}\nUrlContextProvider.propTypes = {\n  contextUrl: PropTypes.string,\n  children: PropTypes.node,\n};\n\nexport default UrlContextProvider;\n","import React from \"react\";\n\ninterface GenericErrorBoundaryTypes {\n  children: React.ReactNode;\n  headless?: boolean;\n}\n\nclass GenericErrorBoundary extends React.Component<GenericErrorBoundaryTypes> {\n  state: {\n    hasError: boolean;\n  };\n\n  constructor(props: GenericErrorBoundaryTypes) {\n    super(props);\n    this.state = { hasError: false };\n  }\n\n  componentDidCatch(error, info) {\n    // Display fallback UI\n    this.setState({ hasError: true });\n    // You can also log the error to an error reporting service\n    // logErrorToMyService(error, info);\n    debug(\"Caught at ErrorBoundary\", error, info);\n  }\n\n  render() {\n    if (this.state.hasError && this.props.headless) return null;\n\n    if (this.state.hasError) {\n      // You can render any custom fallback UI\n      return (\n        <div className=\"alert alert-error\">{I18n.t(\"js.generic_error\")}</div>\n      );\n    }\n    return this.props.children;\n  }\n}\n\nexport default GenericErrorBoundary;\n","import { find, last } from \"lodash\";\nimport PropTypes from \"prop-types\";\n\nconst pickImage = (images, [wantedWidth, wantedHeight]) =>\n  (\n    find(\n      images,\n      ({ width, height }) => width >= wantedWidth && height >= wantedHeight,\n    ) || last(images)\n  ).url;\n\npickImage.imagesPropType = PropTypes.arrayOf(\n  PropTypes.shape({\n    width: PropTypes.number.isRequired,\n    height: PropTypes.number.isRequired,\n    url: PropTypes.string.isRequired,\n  }),\n);\n\nexport default pickImage;\n","// extracted by mini-css-extract-plugin\nexport default {\"globalSearchFilterBar\":\"_fp76SAfdhaug1Hjz5T5\",\"searchQueryResult\":\"xaasY4OEXTe4TLQHjBLK\",\"folders_query\":\"T2gYhzIq8bhgqFYz0io4\",\"files_query\":\"Eq3k6MGyro3TB6dRMnat\",\"showMore\":\"o1ERNqMyxbAmCAan0v8g\",\"hit\":\"k1mjNfg6NSXn2_KrQBKw\",\"hitLeft\":\"stnlPJzy6rFaPaWvUcW4\",\"hitRight\":\"E3tSWinjAmbXA3JbQgyi\",\"hitMeta\":\"LybkatJxMmOg57KpoFoB\",\"fileHitShowIcon\":\"wVLPcGG8NYdmm81heKDZ\",\"hitTitle\":\"q9HEfyAWgZ5vClKqcrVh\",\"hitContent\":\"T64FxsKY9taHW5SdYi3W\",\"FileHit\":\"LknrguzWpxv4qpPMjKjZ\",\"FileHitMeta\":\"RxeZpFI_6VqNYQyGzqLp\",\"FolderHit\":\"arFtr4GPlYK7BoJSbIYs LknrguzWpxv4qpPMjKjZ\",\"FolderHitMeta\":\"TsnTBU7QwIfKNxzmpSRq RxeZpFI_6VqNYQyGzqLp\",\"FoundIn\":\"f2GymxUgzD06ByUmYHuA LybkatJxMmOg57KpoFoB\",\"Highlights\":\"sSh4Z9acCvZ1k8BXOlfc\"};","import React from \"react\";\n\ninterface NoteTypes {\n  html_content: string;\n}\n\nfunction Note({ html_content }: NoteTypes) {\n  return (\n    <div\n      className=\"note-view markdown-content prose break-words\"\n      dangerouslySetInnerHTML={{\n        __html:\n          html_content.length > 0\n            ? $.truncate(html_content, { length: 600 })\n            : `<span class=\"text-muted\">${I18n.t(\n                \"js.global_search.no_content\",\n              )}</span>`,\n      }}\n    />\n  );\n}\n\nexport default Note;\n","import React from \"react\";\nimport { map } from \"lodash\";\n\ninterface SurveyProps {\n  html_content: string;\n  options: Array<{\n    id: string;\n    label: string;\n    percent: number;\n  }>;\n}\n\nfunction Survey(props: SurveyProps) {\n  return (\n    <div className=\"survey-view activity-object-survey activity-object-question\">\n      <div className=\"note mb-2\">\n        <div\n          className=\"note-view markdown-content\"\n          dangerouslySetInnerHTML={{ __html: props.html_content }}\n        />\n      </div>\n      <div className=\"options\">\n        <div className=\"survey-options-view\">\n          <form>\n            <ul className=\"options-container text-sm\">\n              {map(props.options, (option) => (\n                <li key={option.id}>\n                  <div className=\"flex items-center p-2 bg-primary/10 justify-between\">\n                    <label className=\"checkbox\">{option.label}</label>\n                    <span className=\"stats\">\n                      <span className=\"percent\">{`${option.percent}%`}</span>\n                    </span>\n                  </div>\n                  <span\n                    className=\"votes-bar\"\n                    style={{ width: `${option.percent}%` }}\n                  >\n                    &nbsp;\n                  </span>\n                </li>\n              ))}\n            </ul>\n          </form>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default Survey;\n","import React from \"react\";\nimport { map, isEmpty } from \"lodash\";\nimport moment from \"moment-timezone\";\n\nimport pickImage from \"../../../helpers/pickImage\";\n\ninterface AppointmentTypes {\n  html_url: string;\n  name: string;\n  calendars: Array<{\n    id: string;\n    color: string;\n    name: string;\n  }>;\n  date: {\n    start: string;\n    time_zone: string;\n  };\n  image: {\n    sources: Array<{\n      width: number;\n      height: number;\n      url: string;\n    }>;\n    original_filename: string;\n  };\n  description?: string;\n  location?: {\n    name?: string;\n  };\n}\n\nfunction Appointment(props: AppointmentTypes) {\n  return (\n    <div className=\"activity-object-appointment flex flex-col gap-2\">\n      <div className=\"bg-primary/10 border-primary/25 border mb-2 p-2 rounded text-sm\">\n        <p>\n          <a href={props.html_url}>\n            <strong>{props.name}</strong>\n          </a>\n        </p>\n        <ol className=\"calendar-list\">\n          {map(props.calendars, (calendar) => (\n            <li key={calendar.id} className=\"flex items-center mr-2\">\n              <div\n                className=\"block h-2 rounded-full w-2 mr-1\"\n                style={{ backgroundColor: `#${calendar.color}` }}\n              />\n              <p>{calendar.name}</p>\n            </li>\n          ))}\n        </ol>\n        <p>\n          <time>{moment(props.date.start).format(\"LLL\")}</time>\n          <span className=\"timezone\">\n            {`(${moment\n              .tz(props.date.start, props.date.time_zone)\n              .format(\"zZ\")})`}\n          </span>\n        </p>\n      </div>\n      {!isEmpty(props.image) ? (\n        <div className=\"image\">\n          <img\n            src={pickImage(props.image.sources, [100, 100])}\n            alt={props.image.original_filename}\n          />\n        </div>\n      ) : null}\n      <p />\n      <p>{props.description ? props.description : null}</p>\n      <p />\n      <div className=\"accordion location\">\n        {props.location?.name ? (\n          <div className=\"accordion-group\">\n            <div className=\"accordion-heading\">\n              <strong>{props.location.name}</strong>\n            </div>\n          </div>\n        ) : null}\n      </div>\n    </div>\n  );\n}\n\nexport default Appointment;\n","// extracted by mini-css-extract-plugin\nexport default {\"activityAnswerCount\":\"d1Dbte4s9JTi25IzlWAb\",\"calendarName\":\"yjcCjFT1x41fWnSu127F\",\"activityImage\":\"AeJkmbz2mmWybGtXvKBK\",\"imageThumbs\":\"FV6DSRRQlRbCyuk0Z8ue\"};","import React from \"react\";\nimport { map } from \"lodash\";\n\nimport pickImage from \"../../../helpers/pickImage\";\nimport styles from \"../activitystreams.module.css\";\n\nexport interface ImageAttachmentsTypes {\n  images: Array<{ sources: string; original_filename: string; id: string }>;\n  activityUrl: string;\n}\n\nfunction ImageAttachments({ images, activityUrl }: ImageAttachmentsTypes) {\n  return (\n    <div className=\"activity-images attachments\">\n      <div className=\"images-view activity-object-image clearfix\">\n        <div className=\"image-preview preview preview-large\">\n          <a\n            href={activityUrl}\n            aria-label={I18n.t(\"js.composer.editor.buttons.image_link\")}\n          >\n            <img\n              src={pickImage(images[0].sources, [300, 300])}\n              alt={images[0].original_filename}\n              className={styles.activityImage}\n            />\n          </a>\n        </div>\n        <div className=\"mt-4 flex gap-2\">\n          {map(images, (img, index: number) =>\n            index != 0 && index <= 7 ? (\n              <div key={img.id} className=\"image-preview preview preview-small\">\n                <img\n                  src={pickImage(img.sources, [50, 50])}\n                  alt={img.original_filename}\n                  className={styles.activityImage}\n                />\n              </div>\n            ) : null,\n          )}\n          {images.length > 7 ? (\n            <div className=\"image-preview preview preview-small w-[50px] h-[50px] text-center items-center bg-gray-200 rounded\">\n              <span className=\"preview-text leading-[50px]\">...</span>\n            </div>\n          ) : null}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default ImageAttachments;\n","import React from \"react\";\n\ninterface FileAttachmentsTypes {\n  filesCount: number;\n}\n\nfunction FileAttachments({ filesCount }: FileAttachmentsTypes) {\n  return (\n    <div className=\"file-infos text-sm text-muted\">\n      <i className=\"fa-regular fa-file mr-1\" />\n      <span className=\"file-name\">\n        {I18n.t(\"js.global_search.activities.attachments.counting\", {\n          count: filesCount,\n        })}\n      </span>\n    </div>\n  );\n}\n\nexport default FileAttachments;\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\n\nexport interface LinkAttachmentTypes {\n  image?: string;\n  title?: string;\n  href?: string;\n  text?: string;\n}\n\nfunction LinkAttachment({ image, title, href, text }: LinkAttachmentTypes) {\n  return (\n    <div className=\"activity-links attachments\">\n      <div className=\"activity-object activity-object-link clearfix grid grid-cols-6 \">\n        {!isEmpty(image) ? (\n          <div>\n            <img src={image} alt={title} />\n          </div>\n        ) : null}\n        <div\n          className={isEmpty(image) ? \"col-span-6 full-width \" : \"col-span-4 \"}\n        >\n          {title && (\n            <p className=\"link-title\">\n              <a rel=\"nofollow\" href={href}>\n                {title}\n              </a>\n            </p>\n          )}\n          {href && (\n            <p>\n              <a className=\"link-href\" rel=\"nofollow\" href={href}>\n                {href}\n              </a>\n            </p>\n          )}\n          <p className=\"link-text\">{text}</p>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default LinkAttachment;\n","import React from \"react\";\nimport { map } from \"lodash\";\n\nexport interface TagAttachmentsTypes {\n  tags: Array<{\n    id: string;\n    name: string;\n  }>;\n}\n\nfunction TagAttachments({ tags }: TagAttachmentsTypes) {\n  return (\n    <div className=\"activity-tags pb-2 flex gap-2 flex-wrap empty:hidden\">\n      {map(tags, (tag) => (\n        <span className=\"tag\" key={tag.id}>\n          <div className=\"label\">\n            <a href={`/activitystreams/all?tag=${tag.name}`}>{tag.name}</a>\n          </div>\n        </span>\n      ))}\n    </div>\n  );\n}\n\nexport default TagAttachments;\n","import React from \"react\";\nimport { map } from \"lodash\";\n\nimport pickImage from \"../../../helpers/pickImage\";\n\nexport interface MentionAttachmentsTypes {\n  mentions: Array<{\n    id: string;\n    html_url: string;\n    display_name: string;\n    images: Array<{\n      width: number;\n      height: number;\n      url: string;\n    }>;\n  }>;\n}\n\nfunction MentionAttachments({ mentions }: MentionAttachmentsTypes) {\n  return (\n    <div className=\"activity-people attachments\">\n      <ul className=\"people-container activity-section empty:hidden !border-0\">\n        {map(mentions, (m) => (\n          <li key={m.id} className=\"mb-2 last:mb-0\">\n            <a\n              className=\"flex flex-1 gap-2 member-link\"\n              href={m.html_url}\n              title={m.display_name}\n            >\n              <img src={pickImage(m.images, [25, 25])} alt={m.display_name} />\n              {m.display_name}\n            </a>\n          </li>\n        ))}\n      </ul>\n    </div>\n  );\n}\n\nexport default MentionAttachments;\n","import type { ImageAttachmentsTypes } from \"./attachments/ImageAttachments\";\nimport type { LinkAttachmentTypes } from \"./attachments/LinkAttachment\";\nimport type { TagAttachmentsTypes } from \"./attachments/TagAttachments\";\nimport type { MentionAttachmentsTypes } from \"./attachments/MentionAttachments\";\n\nimport React from \"react\";\nimport { isEmpty, groupBy } from \"lodash\";\n\nimport ImageAttachments from \"./attachments/ImageAttachments\";\nimport FileAttachments from \"./attachments/FileAttachments\";\nimport LinkAttachment from \"./attachments/LinkAttachment\";\nimport TagAttachments from \"./attachments/TagAttachments\";\nimport MentionAttachments from \"./attachments/MentionAttachments\";\n\ninterface ActivityAttachmentsTypes {\n  attachments: Array<unknown>;\n  activityUrl: string;\n}\n\nfunction ActivityAttachments({\n  attachments,\n  activityUrl,\n}: ActivityAttachmentsTypes) {\n  const { image, file, link, tag, person } = groupBy(\n    attachments,\n    \"type\",\n  ) as unknown as {\n    image: ImageAttachmentsTypes[\"images\"];\n    file: Array<unknown>;\n    link: Array<LinkAttachmentTypes>;\n    tag: TagAttachmentsTypes[\"tags\"];\n    person: MentionAttachmentsTypes[\"mentions\"];\n  };\n  return (\n    <div>\n      {!isEmpty(image) ? (\n        <ImageAttachments images={image} activityUrl={activityUrl} />\n      ) : null}\n      {!isEmpty(person) ? <MentionAttachments mentions={person} /> : null}\n      {!isEmpty(tag) ? <TagAttachments tags={tag} /> : null}\n      {!isEmpty(link) ? <LinkAttachment {...link[0]} /> : null}\n      {!isEmpty(file) ? <FileAttachments filesCount={file.length} /> : null}\n    </div>\n  );\n}\n\nexport default ActivityAttachments;\n","import React from \"react\";\nimport { map, reduce, isEmpty } from \"lodash\";\nimport pickImage from \"helpers/pickImage\";\nimport styles from \"../globalSearch.module.css\";\n\nimport { NameWithProfileField } from \"components/memberships/MemberNameWithAdditions\";\nimport Note from \"../../../components/activitystreams/types/Note\";\nimport Question from \"../../../components/activitystreams/types/Question\";\nimport Survey from \"../../../components/activitystreams/types/Survey\";\nimport Appointment from \"../../../components/activitystreams/types/Appointment\";\nimport ActivityAttachments from \"../../activitystreams/ActivityAttachments\";\n\nconst LOOKUP = {\n  appointment: Appointment,\n  note: Note,\n  question: Question,\n  schedule: Survey,\n  survey: Survey,\n};\n\nfunction ActivityHit({ actor, object, html_url, created_at, activitystreams }) {\n  const TypeView = LOOKUP[object.type] || Note;\n  const actorImage = (\n    <img\n      className=\"w-16 h-16\"\n      src={pickImage(actor.images, [128, 128])}\n      alt={actor.display_name}\n    />\n  );\n  const nameWithProfileField = (\n    <NameWithProfileField\n      name={actor.display_name}\n      detectionProfileField={actor.detection_profile_field}\n      isExternal={actor.is_external}\n    />\n  );\n\n  return (\n    <div\n      className={`ActivityHit border-box py-2 ${styles.hit} activity clearfix`}\n    >\n      <div className=\"activity-header px-3 flex items-center mb-2\">\n        <div className=\"activity-actor-image py-4 mr-4\">\n          {actor.deleted ? (\n            <span className=\"member-link\">{actorImage}</span>\n          ) : (\n            <a\n              className=\"member-link\"\n              href={actor.html_url}\n              title={actor.display_name}\n            >\n              {actorImage}\n            </a>\n          )}\n        </div>\n        <div className=\"activity-headline py-4 flex-1\">\n          {actor.deleted ? (\n            <span className=\"activity-actor font-semibold member-link\">\n              {nameWithProfileField}\n            </span>\n          ) : (\n            <a\n              href={actor.html_url}\n              className={\"activity-actor font-semibold member-link\"}\n            >\n              {nameWithProfileField}\n            </a>\n          )}\n          <div className=\"activity-meta\">\n            <div className={\"flex flex-col \"}>\n              <div>\n                {reduce(\n                  map(activitystreams, ({ slug, name, html_url }) => (\n                    <a\n                      className=\"font-semibold leading-none text-normal text-sm\"\n                      href={html_url}\n                      key={slug}\n                    >\n                      {name}\n                    </a>\n                  )),\n                  (prev, curr) => [\n                    prev,\n                    <span className=\"text-muted\" key={curr.key + \"sep\"}>\n                      {\", \"}\n                    </span>,\n                    curr,\n                  ],\n                )}\n              </div>\n              <a href={html_url} className=\"muted text-sm leading-none\">\n                <time\n                  className=\"created\"\n                  dateTime={created_at}\n                  title={moment(created_at).format(\"LLLL\")}\n                >\n                  {moment(created_at).format(\"LLLL\")}\n                </time>\n              </a>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div className={\"flex flex-col p-3 gap-4\"}>\n        <div className={`activity-object ${styles.hitContent}`}>\n          <TypeView {...object} />\n        </div>\n        {!isEmpty(object.attachments) ? (\n          <ActivityAttachments\n            attachments={object.attachments}\n            activityUrl={html_url}\n          />\n        ) : null}\n        <div className={\"flex text-muted text-sm gap-2 empty:hidden\"}>\n          {object.answer_count > 0 ? (\n            <span>\n              {I18n.t(\"js.global_search.activities.answers.counting\", {\n                count: object.answer_count,\n              })}\n            </span>\n          ) : null}\n          {object.reply_count > 0 ? (\n            <span>\n              {I18n.t(\"js.global_search.activities.replies.counting\", {\n                count: object.reply_count,\n              })}\n            </span>\n          ) : null}\n        </div>\n      </div>\n      <div className=\"border-neutral border-dashed border-t\">\n        <a className=\"btn btn-link block\" href={html_url}>\n          {I18n.t(\"js.global_search.activities.show_activity\")}\n        </a>\n      </div>\n    </div>\n  );\n}\n\nexport default ActivityHit;\n","import React from \"react\";\n\ninterface QuestionTypes {\n  html_content: string;\n  answer_count: number;\n}\n\nfunction Question(props: QuestionTypes) {\n  return (\n    <div className={`activity-object-question`}>\n      <div className=\"clearfix question-content-container\">\n        <i className=\"fa fa-question-circle question-mark\" />\n        <div className=\"question-content grow min-w-0\">\n          <div\n            className=\"note-view markdown-content prose break-words\"\n            dangerouslySetInnerHTML={{ __html: props.html_content }}\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default Question;\n","import React from \"react\";\nimport { map } from \"lodash\";\n\nimport {\n  NameWithProfileField,\n  showNameWithProfileField,\n} from \"components/memberships/MemberNameWithAdditions\";\nimport pickImage from \"../../../helpers/pickImage\";\nimport styles from \"../globalSearch.module.css\";\n\nexport default function MessageHit({\n  id,\n  author,\n  subject,\n  html_content,\n  to,\n  created_at,\n}) {\n  return (\n    <div className={`MessageHit border-box`}>\n      <div className=\"detailsAuthor flex items-center p-4 border-neutral border-dashed border-b\">\n        <a\n          className=\"member-link mr-4\"\n          href={author.html_url}\n          title={author.name}\n        >\n          <img\n            className=\"w-10 h-10\"\n            src={pickImage(author.images, [80, 80])}\n            alt={author.name}\n          />\n        </a>\n\n        <div className=\"grow\">\n          <a href={author.html_url} className=\"font-semibold\">\n            <NameWithProfileField\n              name={author.name}\n              detectionProfileField={author.detection_profile_field}\n              isExternal={author.is_external}\n            />\n          </a>\n          <div className={\"text-sm\"}>\n            <span key=\"to\">{I18n.t(\"js.global_search.messages.to\")} </span>\n            {map(\n              to,\n              ({ id, name, detection_profile_field, is_external }, index) => (\n                <React.Fragment key={index}>\n                  {index > 0 ? <span key={`sep-${index}`}>, </span> : null}\n                  <a key={id} href={`/members/${id}`}>\n                    {showNameWithProfileField({\n                      name: name,\n                      detectionProfileField: detection_profile_field,\n                      isExternal: is_external,\n                    })}\n                  </a>\n                </React.Fragment>\n              ),\n            )}\n          </div>\n        </div>\n        <div className={\"text-sm\"}>\n          <span className={\"text-muted\"}>\n            <time\n              className=\"created\"\n              dateTime={created_at}\n              title={moment(created_at).format(\"LLLL\")}\n            >\n              {moment(created_at).format(\"DD.MM.YYYY HH:mm\")}\n            </time>\n          </span>\n        </div>\n      </div>\n\n      <div className=\"p-4 my-2\">\n        <div className=\"font-bold\">{subject}</div>\n        <div className={`activity-object ${styles.hitContent}`}>\n          <div\n            className=\"note-view markdown-content prose break-words\"\n            dangerouslySetInnerHTML={{\n              __html:\n                html_content.length > 0\n                  ? $.truncate(html_content, { length: 600 })\n                  : `<span class=\"text-muted\">${I18n.t(\n                      \"js.global_search.no_content\",\n                    )}</span>`,\n            }}\n          />\n        </div>\n      </div>\n      <div className=\"border-neutral border-dashed border-t\">\n        <a className=\"btn btn-link block\" href={`/messages/${id}`}>\n          {I18n.t(\"js.global_search.messages.show_message\")}\n        </a>\n      </div>\n    </div>\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nexport default function DateRange({ start, end, all_day }) {\n  const format = all_day ? \"LLL\" : \"LLLL\";\n\n  return (\n    <div className=\"muted pt-3 text-sm flex items-center\">\n      <div>\n        <span className=\"mr-1\">\n          {I18n.t(\"js.global_search.appointments.appointment_start\")}{\" \"}\n          <time>{moment(start).format(format)}</time>\n        </span>\n        {end\n          ? [\n              <br key={\"br\"} />,\n              <span className=\"end\" key={\"end\"}>\n                {I18n.t(\"js.global_search.appointments.appointment_end\")}{\" \"}\n                <time>{moment(end).format(format)}</time>\n              </span>,\n            ]\n          : null}\n      </div>\n    </div>\n  );\n}\n\nDateRange.propTypes = {\n  start: PropTypes.string.isRequired,\n  end: PropTypes.string,\n  all_day: PropTypes.bool,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map } from \"lodash\";\n\nfunction CalendarList({ calendars }) {\n  return (\n    <ul className={`CalendarList flex `}>\n      {map(calendars, ({ id, name, color }) => (\n        <li className=\"flex items-center mr-2\" key={id}>\n          <div\n            className=\"block h-2 rounded-full w-2 mr-1\"\n            style={{ backgroundColor: `#${color}` }}\n          />{\" \"}\n          <span className=\"font-semibold leading-none text-normal text-sm\">\n            {name}\n          </span>\n        </li>\n      ))}\n    </ul>\n  );\n}\n\nCalendarList.propTypes = {\n  calendars: PropTypes.arrayOf(\n    PropTypes.shape({\n      name: PropTypes.string.isRequired,\n      color: PropTypes.string.isRequired,\n    }),\n  ),\n  className: PropTypes.string,\n};\n\nexport default CalendarList;\n","import React from \"react\";\nimport styles from \"../globalSearch.module.css\";\nimport DateRange from \"components/appointments/DateRange\";\nimport CalendarList from \"components/appointments/CalendarList\";\nimport classNames from \"classnames\";\n\nfunction AppointmentHit({ html_url, name, html_description, date, calendars }) {\n  return (\n    <div className={`AppointmentHit border-box flex flex-col`}>\n      <div className=\"flex items-center p-4 border-neutral border-dashed border-b\">\n        <div>\n          <a href={html_url} className=\"font-semibold\">\n            {name}\n          </a>\n          <CalendarList calendars={calendars} className={styles.hitMeta} />\n          <DateRange {...date} className={styles.hitMeta} />\n        </div>\n      </div>\n      {html_description ? (\n        <div\n          className=\"p-4 prose prose-sm\"\n          dangerouslySetInnerHTML={{ __html: html_description }}\n        />\n      ) : null}\n      <div\n        className={classNames({\n          \"border-neutral border-dashed border-t\": html_description,\n        })}\n      >\n        <a className=\"btn btn-link block\" href={html_url}>\n          {I18n.t(\"js.global_search.messages.show_appointment\")}\n        </a>\n      </div>\n    </div>\n  );\n}\n\nexport default AppointmentHit;\n","import React from \"react\";\nimport styles from \"../globalSearch.module.css\";\nimport CalendarList from \"components/appointments/CalendarList\";\nimport classNames from \"classnames\";\n\nfunction RecurringAppointmentHit({\n  html_url,\n  name,\n  html_description,\n  date,\n  calendars,\n  recurrence_pattern,\n}) {\n  return (\n    <div className={`RecurringAppointmentHit border-box flex flex-col`}>\n      <div className=\"flex items-center p-4 border-neutral border-dashed border-b\">\n        <div>\n          <a href={html_url} className=\"font-semibold\">\n            {name}\n          </a>\n          <CalendarList calendars={calendars} className={styles.hitMeta} />\n          <div className=\"flex gap-2 muted pt-3 text-sm\">\n            <i className=\"fa-regular fa-arrows-repeat\" />\n            <div className=\"flex flex-col\">\n              <div className=\"font-semibold uppercase\">\n                {I18n.t(\"js.calendars.recurring_appointment.subtitle\")}\n              </div>\n              <div>\n                {I18n.t(\"js.calendars.recurring_appointment.starts_at\")}{\" \"}\n                <time>{moment(date.start).format(\"dddd, LL\")}</time>\n              </div>\n              <div>\n                {recurrence_pattern.recurrence_end_time\n                  ? I18n.t(\"js.calendars.recurring_appointment.ends_at\") +\n                    (\n                      <time>\n                        {moment(recurrence_pattern.recurrence_end_time).format(\n                          \"dddd, LL\",\n                        )}\n                      </time>\n                    )\n                  : I18n.t(\"js.calendars.recurring_appointment.no_end\")}\n              </div>\n              <div>\n                {I18n.t(\"js.calendars.recurring_appointment.frequency\")}{\" \"}\n                {I18n.t(\n                  \"js.calendars.appointment.recurrence-pattern.frequency.\" +\n                    recurrence_pattern.recurrence_frequency,\n                )}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      {html_description ? (\n        <div\n          className=\"p-4 prose prose-sm\"\n          dangerouslySetInnerHTML={{ __html: html_description }}\n        />\n      ) : null}\n      <div\n        className={classNames({\n          \"border-neutral border-dashed border-t\": html_description,\n        })}\n      >\n        <a className=\"btn btn-link block\" href={html_url}>\n          {I18n.t(\"js.global_search.messages.show_recurring_appointment\")}\n        </a>\n      </div>\n    </div>\n  );\n}\n\nexport default RecurringAppointmentHit;\n","import React from \"react\";\nimport styles from \"../globalSearch.module.css\";\nimport DateRange from \"components/appointments/DateRange\";\nimport CalendarList from \"components/appointments/CalendarList\";\nimport classNames from \"classnames\";\n\nfunction ModifiedRecurringAppointmentHit({\n  html_url,\n  name,\n  html_description,\n  date,\n  calendars,\n  recurring_appointment,\n}) {\n  return (\n    <div className={`ModifiedRecurringAppointmentHit border-box flex flex-col`}>\n      <div className=\"flex items-center p-4 border-neutral border-dashed border-b\">\n        <div>\n          <a href={html_url} className=\"font-semibold mr-1\">\n            {name}\n          </a>\n          {recurring_appointment ? (\n            <small>\n              (\n              <i className=\"fa-regular fa-arrows-repeat mr-1\" />\n              <a href={recurring_appointment.html_url}>\n                {recurring_appointment.name}\n              </a>\n              )\n            </small>\n          ) : null}\n          <CalendarList calendars={calendars} className={styles.hitMeta} />\n          <DateRange {...date} className={styles.hitMeta} />\n        </div>\n      </div>\n      {html_description ? (\n        <div\n          className=\"p-4 prose prose-sm\"\n          dangerouslySetInnerHTML={{ __html: html_description }}\n        />\n      ) : null}\n      <div\n        className={classNames({\n          \"border-neutral border-dashed border-t\": html_description,\n        })}\n      >\n        <a className=\"btn btn-link block\" href={html_url}>\n          {I18n.t(\"js.global_search.messages.show_appointment\")}\n        </a>\n      </div>\n    </div>\n  );\n}\n\nexport default ModifiedRecurringAppointmentHit;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport styles from \"../globalSearch.module.css\";\n\nexport default function Highlights({ highlights }) {\n  const [index, setIndex] = useState(0);\n  const highlight = highlights[index];\n  const total = highlights.length;\n\n  function nextHighlight(event) {\n    event.preventDefault();\n    setIndex(Math.min(index + 1, total - 1));\n  }\n  function prevHighlight(event) {\n    event.preventDefault();\n    setIndex(Math.max(index - 1, 0));\n  }\n\n  return (\n    <div\n      className={`Highlights ${styles.Highlights} flex gap-2 bg-gray-100 px-3 py-1 -mx-3 last:-mb-2 last:rounded-b`}\n    >\n      <div\n        className=\"prose prose-sm grow\"\n        dangerouslySetInnerHTML={{ __html: highlight }}\n      />\n      <div className=\"flex text-sm shrink-0 gap-1\">\n        <div\n          className=\"previous-container\"\n          style={{ opacity: index === 0 ? 0 : null }}\n        >\n          <a className=\"previous-hit\" href=\"#\" onClick={prevHighlight}>\n            <i className=\"fa fa-arrow-left\" aria-hidden=\"\" />\n          </a>\n        </div>\n        <span className=\"counter\">{`${index + 1} / ${total}`}</span>\n        <div\n          className=\"next-container\"\n          style={{ opacity: index === total - 1 ? 0 : null }}\n        >\n          <a className=\"next-hit\" href=\"#\" onClick={nextHighlight}>\n            <i className=\"fa fa-arrow-right\" aria-hidden=\"\" />\n          </a>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nHighlights.propTypes = {\n  highlights: PropTypes.arrayOf(PropTypes.string).isRequired,\n};\n","import React from \"react\";\n\nexport type PaginationState = {\n  page: null | number;\n  sort_by: null | string;\n  enabled: boolean;\n};\nconst SearchQueryPaginationContext = React.createContext<\n  PaginationState & { setPaginationState: (setPaginationState) => void }\n>({\n  page: null,\n  sort_by: null,\n  enabled: false,\n  setPaginationState: function () {\n    return;\n  },\n});\n\nexport default SearchQueryPaginationContext;\n","import React, { useContext } from \"react\";\nimport { map, reduceRight, get, isEmpty } from \"lodash\";\nimport classNames from \"classnames\";\n\nimport { FolderContentsTableWithProfile } from \"../../files/table/FolderContentsTable\";\nimport FileRow from \"../../files/table/FileRow\";\nimport Highlights from \"./Highlights\";\nimport styles from \"../globalSearch.module.css\";\nimport UrlContextProvider from \"../../files/UrlContextProvider\";\nimport { parseSortByParam, serializeSortBy } from \"../urls\";\nimport SearchQueryPaginationContext from \"../SearchQueryPaginationContext\";\n\nexport function FoundIn({ found_in }) {\n  return map(found_in, (path, i) => (\n    <div className={styles.FoundIn} key={i}>\n      <span>in </span>\n      {reduceRight(\n        map(path, ({ id, name }) => (\n          <a key={id} href={`/files/folders/${id}`}>\n            {name}\n          </a>\n        )),\n        (prev, curr) => [\n          prev,\n          <span className=\"divider muted \" key={curr.key + \"sep\"}>\n            {\" / \"}\n          </span>,\n          curr,\n        ],\n      )}\n    </div>\n  ));\n}\n\nexport function MetaRow({ extraColumns, children, className, striped }) {\n  return (\n    <tr className={classNames(className, { striped })}>\n      <td></td>\n      <td colSpan={5 + (extraColumns ? extraColumns.length : 0)}>{children}</td>\n    </tr>\n  );\n}\n\nfunction FileHit({ found_in, meta, striped, ...rowProps }) {\n  const highlights = get(meta, [\"highlight\", \"attachment.content\"]);\n\n  return (\n    <>\n      <FileRow {...rowProps} className={styles.FileHit} striped={striped} />\n      <MetaRow\n        extraColumns={rowProps.extraColumns}\n        striped={striped}\n        className={styles.FileHitMeta}\n      >\n        {isEmpty(found_in) ? null : <FoundIn found_in={found_in} />}\n        {isEmpty(highlights) ? null : <Highlights highlights={highlights} />}\n      </MetaRow>\n    </>\n  );\n}\n\nexport default function FileHits({ hits, meta, groupSlug }) {\n  const { sort_by, setPaginationState } = useContext(\n    SearchQueryPaginationContext,\n  );\n\n  const contents = map(hits, (hit, index) => ({\n    ...hit,\n    type: \"file\",\n    meta: meta[index],\n    profile: hit.file_profile,\n  }));\n\n  return (\n    <UrlContextProvider contextUrl={groupSlug ? `/groups/${groupSlug}` : \"\"}>\n      <FolderContentsTableWithProfile\n        contextType={groupSlug ? \"group\" : \"network\"}\n        contextId={groupSlug}\n        contents={contents}\n        FileRow={FileHit}\n        handleSort={(sortBy) => {\n          setPaginationState({ page: 1, sort_by: serializeSortBy(sortBy) });\n        }}\n        sortBy={parseSortByParam(sort_by)}\n      />\n    </UrlContextProvider>\n  );\n}\n\nFileHits.propTypes = {};\n","import React, { useContext } from \"react\";\nimport { map, isEmpty } from \"lodash\";\n\nimport { FolderContentsTableWithProfile } from \"../../files/table/FolderContentsTable\";\nimport FolderRow from \"../../files/table/FolderRow\";\nimport styles from \"../globalSearch.module.css\";\nimport { MetaRow, FoundIn } from \"./FileHits\";\nimport UrlContextProvider from \"../../files/UrlContextProvider\";\nimport { parseSortByParam, serializeSortBy } from \"../urls\";\nimport SearchQueryPaginationContext from \"../SearchQueryPaginationContext\";\n\nfunction FolderHit({ found_in, striped, ...rowProps }) {\n  return (\n    <>\n      <FolderRow {...rowProps} className={styles.FolderHit} striped={striped} />\n      <MetaRow\n        extraColumns={rowProps.extraColumns}\n        striped={striped}\n        className={styles.FolderHitMeta}\n      >\n        {isEmpty(found_in) ? null : <FoundIn found_in={found_in} />}\n      </MetaRow>\n    </>\n  );\n}\n\nexport default function FolderHits({ hits, meta, groupSlug }) {\n  const { sort_by, setPaginationState } = useContext(\n    SearchQueryPaginationContext,\n  );\n\n  const contents = map(hits, (hit, index) => ({\n    ...hit,\n    type: \"folder\",\n    meta: meta[index],\n    profile: hit.folder_profile,\n  }));\n\n  return (\n    <UrlContextProvider contextUrl={groupSlug ? `/groups/${groupSlug}` : \"\"}>\n      <FolderContentsTableWithProfile\n        contextType={groupSlug ? \"group\" : \"network\"}\n        contextId={groupSlug}\n        contents={contents}\n        FolderRow={FolderHit}\n        handleSort={(sortBy) => {\n          setPaginationState({ page: 1, sort_by: serializeSortBy(sortBy) });\n        }}\n        sortBy={parseSortByParam(sort_by)}\n        skipFileAttributes\n      />\n    </UrlContextProvider>\n  );\n}\n\nFolderHits.propTypes = {};\n","import React from \"react\";\nimport { map, isString, has, includes } from \"lodash\";\nimport pickImage from \"helpers/pickImage\";\nimport {\n  profileFieldAvailable,\n  ExternalMemberBadge,\n} from \"components/memberships/MemberNameWithAdditions\";\n\nfunction MembershipHit({\n  display_name,\n  images,\n  html_url,\n  profile,\n  is_network_admin,\n  detection_profile_field,\n  is_external,\n}) {\n  return (\n    <div className={`media items-center border-box px-3 py-2`}>\n      <a\n        className=\"member-link media-object h-10 w-10 self-start\"\n        href={html_url}\n        title={display_name}\n      >\n        <img\n          className={\"h-10 w-10\"}\n          src={pickImage(images, [80, 80])}\n          alt={display_name}\n          aria-hidden\n        />\n      </a>\n      <div className={\"media-body\"}>\n        <a className={\"font-medium\"} href={html_url}>\n          {display_name}\n        </a>\n        <ul className=\"text-sm\">\n          {profileFieldAvailable({\n            detectionProfileField: detection_profile_field,\n          }) && !includes(profile, detection_profile_field) ? (\n            <li>{detection_profile_field}</li>\n          ) : null}\n          {map(profile, (value, key) => (\n            <li key={key} className={`profile-field-${key}`}>\n              {has(value, \"displayValue\")\n                ? value.displayValue\n                : isString(value)\n                  ? value\n                  : null}\n            </li>\n          ))}\n        </ul>\n      </div>\n      <div className={\"badges\"}>\n        {is_external ? <ExternalMemberBadge /> : null}\n        {is_network_admin ? (\n          <span\n            className=\"badge bg-primary/50\"\n            data-bs-toggle=\"tooltip\"\n            title={I18n.t(\"js.directory.member_row.administrator\")}\n          >\n            {I18n.t(\"js.directory.member_row.administrator_short\")}\n          </span>\n        ) : null}\n      </div>\n    </div>\n  );\n}\n\nMembershipHit.propTypes = {};\n\nexport default MembershipHit;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\nimport pickImage from \"../../../helpers/pickImage\";\n\nfunction GroupHit({\n  name,\n  images,\n  html_url,\n  archived,\n  access,\n  member_count,\n  activity_count,\n  teaser,\n}) {\n  return (\n    <div className={`media items-center border-box px-3 py-2`}>\n      <a href={html_url} className={\"media-object h-16 w-16 -ml-1 self-start\"}>\n        {isEmpty(images) ? (\n          <i className=\"fa fa-users fa-2xl block flex h-16 w-16 items-center justify-center text-gray-400\" />\n        ) : (\n          <img\n            alt=\"\"\n            aria-hidden\n            className={\"h-16 w-16\"}\n            src={pickImage(images, [128, 128])}\n          />\n        )}\n      </a>\n      <div className={\"media-body\"}>\n        <span className={\"media-heading flex gap-1\"}>\n          {archived ? (\n            <i\n              className=\"fa fa-archive text-muted\"\n              title={I18n.t(\"js.directory.group_row.archived\")}\n            />\n          ) : null}\n          {access === \"closed\" ? (\n            <i\n              className=\"fa fa-lock text-muted\"\n              title={I18n.t(\"js.directory.group_row.closed\")}\n            />\n          ) : null}\n          {access === \"hidden\" ? (\n            <i\n              className=\"fa fa-eye-slash text-muted\"\n              title={I18n.t(\"js.directory.group_row.hidden\")}\n            />\n          ) : null}\n          <a href={html_url} className={\"font-medium\"}>\n            {name}\n          </a>\n        </span>\n        <p className={\"text-muted text-sm\"}>\n          {I18n.t(\"js.directory.group_row.member_count\", {\n            count: member_count || 0,\n          })}\n          {\", \"}\n          {I18n.t(\"js.directory.group_row.activity\", {\n            count: activity_count || 0,\n          })}\n        </p>\n        {isEmpty(teaser) ? null : (\n          <p className=\"mt-1 text-sm whitespace-pre-line break-words\">\n            {teaser}\n          </p>\n        )}\n      </div>\n    </div>\n  );\n}\n\nGroupHit.propTypes = {\n  name: PropTypes.string.isRequired,\n  images: pickImage.imagesPropType,\n  html_url: PropTypes.string.isRequired,\n};\n\nexport default GroupHit;\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\nimport PropTypes from \"prop-types\";\n\nimport Highlights from \"./Highlights\";\n\nconst pagePath = ({ group_slug, slug }) => {\n  const url = `/pages/${slug}`;\n  if (group_slug) {\n    return `/groups/${group_slug}${url}`;\n  }\n  return url;\n};\n\nfunction PageHit({ title, highlight, group_slug, slug }) {\n  return (\n    <div className={`PageHit border-box px-3 py-2`}>\n      <h4>\n        <a href={pagePath({ group_slug, slug })}>{title}</a>\n      </h4>\n\n      {isEmpty(highlight) || isEmpty(highlight[\"values.content\"]) ? null : (\n        <Highlights highlights={highlight[\"values.content\"]} />\n      )}\n    </div>\n  );\n}\n\nPageHit.propTypes = {\n  title: PropTypes.string,\n  highlight: PropTypes.array,\n  group_slug: PropTypes.any,\n  slug: PropTypes.any,\n};\n\nexport default PageHit;\n","import React from \"react\";\nimport { useLoadApp, useLoadItem } from \"components/appCreator/api\";\nimport Loading from \"components/shared/Loading\";\nimport { isArray, isObject } from \"lodash\";\n\ntype Props = {\n  item_id: string;\n  app_id: string;\n  frontend_app_url: string;\n};\n\nexport default function ItemHit({\n  item_id: itemId,\n  app_id: appId,\n  frontend_app_url: frontendAppUrl,\n}: Props) {\n  const { data: app, isLoading: appLoading } = useLoadApp({\n    appId,\n    externalAppId: null,\n  });\n  const { data: item, isLoading: itemLoading } = useLoadItem({\n    appId,\n    itemId,\n    externalItemId: null,\n    externalAppId: null,\n  });\n\n  if (appLoading || itemLoading || !app || !item)\n    return (\n      <div className={`ItemHit border-box px-3 py-2`}>\n        <Loading />\n      </div>\n    );\n\n  const title =\n    item?.display_values?.[app.title_property] ||\n    item?.values?.[app.title_property];\n\n  const imageProp = app.properties.find((p) => p.type == \"image\");\n  let imageUrl: string | undefined;\n  if (imageProp && item.values[imageProp.name]) {\n    const imageValue = item.values[imageProp.name];\n\n    if (isArray(imageValue) && isObject(imageValue[0]))\n      imageUrl = imageValue[0].url;\n    else if (isObject(imageValue) && \"url\" in imageValue)\n      imageUrl = imageValue.url;\n  }\n\n  // const teaser = getTeaser(app, item)\n\n  return (\n    <div className={`ItemHit border-box px-3 py-2`}>\n      <div className={\"flex gap-2\"}>\n        {imageUrl ? (\n          <a href={`${frontendAppUrl}/items/${item.id}`}>\n            <img\n              className={\"w-[100px]\"}\n              src={`/api/storage${imageUrl}/get/200x200`}\n              alt={title}\n            />\n          </a>\n        ) : null}\n        <h4>\n          <a href={`${frontendAppUrl}/items/${item.id}`}>{title}</a>{\" \"}\n          <a className=\"text-muted\" href={frontendAppUrl}>\n            {app.name}\n          </a>\n        </h4>\n      </div>\n    </div>\n  );\n}\n\n// Tixxt.Apps is not available outside of legacy frontend, so this doesn't work\n// Keeping it as a reference for now\n\n// function getTeaser(app, item) {\n//   let teaser: string | undefined;\n//   const layoutOptions =\n//       app.collection_layout.options[app.collection_layout.layout];\n//   if (\"teaser\" in layoutOptions && layoutOptions?.teaser?.body_template) {\n//     const formatter = new Tixxt.Apps.Formatters.TemplatePropertyFormatter();\n//     teaser = Application.markdown(\n//         formatter.fromRaw(\n//             layoutOptions?.teaser?.body_template,\n//             new Backbone.Model(item),\n//         ),\n//     );\n//   }\n// }\n","import { useQuery, useQueryClient } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { searchUrl } from \"./urls\";\nimport { identity, keys, pickBy, mapValues, slice } from \"lodash\";\n\ntype SearchQueryParams = {\n  q: string;\n  module?: string;\n  groupSlug?: string;\n};\n\ntype SearchResultsPayload = {\n  [queryName: string]: {\n    hits: {\n      id: string;\n      // etc...\n    }[];\n    meta: { _score: number }[];\n    total: number;\n    per: number;\n    page: number;\n    sort_by: number;\n  };\n};\n\nexport function useSearchResults(\n  query: SearchQueryParams,\n  options: { enabled?: boolean } = {},\n) {\n  const filteredQuery = pickBy(query, identity);\n  const url = searchUrl({ ...filteredQuery, format: \"json\" });\n\n  return useQuery<SearchResultsPayload>(\n    [\"search\", filteredQuery],\n    () => fetchApi(url),\n    {\n      refetchOnWindowFocus: false,\n      staleTime: 60_000,\n      ...options,\n    },\n  );\n}\n\n// This fetches pages of a single query\n// It assumes that a module filter is active\n// and updates the query in the module search result in the query cache directly\nexport function useSearchResultsPage(\n  query: {\n    query_name: string;\n    page: number;\n    sort_by?: string | null;\n    q: string;\n    groupSlug?: string;\n  },\n  options: {\n    enabled?: boolean;\n  } = {},\n) {\n  const queryClient = useQueryClient();\n  const filteredQuery = pickBy(query, identity);\n  const url = searchUrl(filteredQuery);\n\n  return useQuery<SearchResultsPayload>(url, () => fetchApi(url), {\n    refetchOnWindowFocus: false,\n    cacheTime: 0,\n    ...options,\n    onSuccess: (pageData) => {\n      const queriesData = queryClient.getQueriesData<SearchResultsPayload>([\n        \"search\",\n      ]);\n      queriesData.forEach(([key, cacheData]) => {\n        const [, cachedQuery] = key as [\"search\", SearchQueryParams];\n\n        // Update module search result\n        if (cachedQuery.module && keys(pageData)[0] in cacheData) {\n          queryClient.setQueryData(key, { ...cacheData, ...pageData });\n        }\n\n        // Update a matching global search result query\n        if (\n          !cachedQuery.module &&\n          cachedQuery.q === query.q &&\n          cachedQuery.groupSlug === query.groupSlug\n        ) {\n          // Limit to 5 results so it still works with the global search results\n          const truncatedPageData = mapValues(\n            pageData,\n            ({ hits, meta, ...rest }) => ({\n              hits: slice(hits, 0, 5),\n              meta: slice(meta, 0, 5),\n              ...rest,\n            }),\n          );\n          queryClient.setQueryData(key, { ...cacheData, ...truncatedPageData });\n        }\n      });\n    },\n  });\n}\n","import React, { useContext } from \"react\";\nimport Pagination from \"components/shared/Pagination\";\nimport { QueryParams } from \"./SearchQueryResult\";\nimport SearchQueryPaginationContext from \"./SearchQueryPaginationContext\";\n\nexport default function SearchResultPagination({\n  total,\n  per,\n  loading,\n}: Pick<QueryParams, \"total\" | \"per\" | \"loading\">) {\n  const { setPaginationState, page, ...paginationState } = useContext(\n    SearchQueryPaginationContext,\n  );\n\n  return (\n    <Pagination\n      page={page || 1}\n      onPaginate={(page) => {\n        setPaginationState({ ...paginationState, page });\n      }}\n      loading={loading}\n      totalPages={Math.ceil(total / per)}\n    />\n  );\n}\n","import React, { useContext } from \"react\";\nimport SearchQueryPaginationContext from \"components/globalSearch/SearchQueryPaginationContext\";\nimport { QueryParams } from \"components/globalSearch/SearchQueryResult\";\n\nexport default function SearchSortSelector({\n  availableSorts,\n}: {\n  availableSorts: QueryParams[\"available_sorts\"];\n}) {\n  const { setPaginationState, sort_by, ...paginationState } = useContext(\n    SearchQueryPaginationContext,\n  );\n\n  if (!availableSorts) return null;\n\n  return (\n    <div className={\"max-w-md\"}>\n      <select\n        onChange={(e) =>\n          setPaginationState({\n            ...paginationState,\n            sort_by: e.target.value,\n          })\n        }\n        value={sort_by || \"score,asc\"}\n      >\n        {availableSorts.map(({ key, label }) => (\n          <option key={key} value={key}>\n            {label}\n          </option>\n        ))}\n      </select>\n    </div>\n  );\n}\n","import React, { useState } from \"react\";\nimport invariant from \"invariant\";\nimport { isEmpty, map, pick } from \"lodash\";\nimport { stringify as stringifyQuery } from \"query-string\";\n\nimport GenericErrorBoundary from \"components/shared/GenericErrorBoundary\";\nimport ActivityHit from \"./hits/ActivityHit\";\nimport MessageHit from \"./hits/MessageHit\";\nimport AppointmentHit from \"./hits/AppointmentHit\";\nimport RecurringAppointmentHit from \"./hits/RecurringAppointmentHit\";\nimport ModifiedRecurringAppointmentHit from \"./hits/ModifiedRecurringAppointmentHit\";\nimport FileHits from \"./hits/FileHits\";\nimport FolderHits from \"./hits/FolderHits\";\nimport MembershipHit from \"./hits/MembershipHit\";\nimport GroupHit from \"./hits/GroupHit\";\nimport PageHit from \"./hits/PageHit\";\nimport ItemHit from \"./hits/ItemHit\";\nimport styles from \"./globalSearch.module.css\";\nimport { searchUrl } from \"./urls\";\nimport { useSearchResultsPage } from \"components/globalSearch/api\";\nimport SearchQueryPaginationContext, {\n  PaginationState,\n} from \"components/globalSearch/SearchQueryPaginationContext\";\nimport SearchResultPagination from \"./SearchResultPagination\";\nimport SearchSortSelector from \"./SearchSortSelector\";\n\n// Component that displays search results for a single query\nfunction Result({\n  title,\n  iconClass,\n  fullResultUrl,\n  hits,\n  meta,\n  total,\n  per,\n  page,\n  sort_by,\n  loading: initialLoading,\n  renderHit,\n  renderHits,\n  queryName,\n  routeParams,\n  available_sorts,\n}: QueryProps & QueryParams) {\n  const [paginationState, setPaginationState] = useState<PaginationState>({\n    page: page,\n    sort_by: sort_by || null,\n    enabled: false,\n  });\n\n  const contextValue = {\n    ...paginationState,\n    setPaginationState: (paginationState) =>\n      setPaginationState({ ...paginationState, enabled: true }),\n  };\n\n  const { isLoading: pageLoading } = useSearchResultsPage(\n    {\n      query_name: queryName,\n      page: paginationState.page || 1,\n      sort_by: paginationState.sort_by,\n      ...pick(routeParams, [\"q\", \"groupSlug\"]),\n    },\n    { enabled: paginationState.enabled },\n  );\n\n  return (\n    <SearchQueryPaginationContext.Provider value={contextValue}>\n      <div className={\"flex mt-8 mb-4 items-center\"}>\n        <h2 id={`${queryName}-results`} className={\"h2-default m-0 grow\"}>\n          <i className={`${iconClass} fa-fw text-muted mr-2`} />\n          {title}\n        </h2>\n        {!isEmpty(available_sorts) ? (\n          <SearchSortSelector availableSorts={available_sorts} />\n        ) : null}\n      </div>\n      {pageLoading ? (\n        <strong>\n          <i className=\"fa fa-spinner fa-spin\" />{\" \"}\n          {I18n.t(\"js.global_search.loading\")}\n        </strong>\n      ) : total > 0 ? (\n        <div className=\"hits flex flex-col gap-2\">\n          {renderHits\n            ? renderHits(hits, meta)\n            : renderHit\n              ? map(hits as { id: string }[], (hit, index) => (\n                  <GenericErrorBoundary key={index}>\n                    {renderHit(hit, meta[index])}\n                  </GenericErrorBoundary>\n                ))\n              : JSON.stringify(hits)}\n        </div>\n      ) : (\n        <div className=\"no-hits muted\">\n          {I18n.t(\"js.global_search.no_results\")}\n        </div>\n      )}\n      {!pageLoading &&\n      !routeParams.module &&\n      hits &&\n      hits.length < total &&\n      fullResultUrl ? (\n        <div key=\"more\" className={styles.showMore}>\n          <a href={fullResultUrl}>\n            {I18n.t(\"js.global_search.show_more_results\")}\n          </a>\n        </div>\n      ) : null}\n      {!pageLoading && routeParams.module && hits && hits.length < total ? (\n        <SearchResultPagination\n          total={total}\n          per={per}\n          loading={initialLoading || pageLoading}\n        />\n      ) : null}\n    </SearchQueryPaginationContext.Provider>\n  );\n}\n\n// Map query names to the components to be rendered\nexport type QueryParams = {\n  queryName: string;\n  routeParams: {\n    q: string;\n    groupSlug?: string;\n    module: string | null;\n    page: string;\n  };\n  hits?: unknown[];\n  meta: { _score: number }[];\n  total: number;\n  per: number;\n  page: number;\n  sort_by?: string;\n  loading: boolean;\n  available_sorts: null | { key: string; label: string }[];\n};\ntype QueryProps = {\n  title: string;\n  iconClass: string;\n  fullResultUrl: string | null;\n  renderHit?: (hit: any, meta: any) => React.ReactNode;\n  renderHits?: (hits: any, meta: any) => React.ReactNode;\n};\nexport const QUERY_MAPPING: {\n  [key: string]:\n    | ((\n        params: Pick<QueryParams, \"routeParams\" | \"sort_by\" | \"hits\">,\n      ) => QueryProps)\n    | undefined;\n} = {\n  activities_query: ({ routeParams: { q, groupSlug } }) => ({\n    title: I18n.t(\"js.activitystreams.module_name\"),\n    iconClass: \"fa-regular fa-earth-europe\",\n    fullResultUrl: searchUrl({ q, groupSlug, module: \"activities\" }),\n    renderHit(hit) {\n      return <ActivityHit {...hit} key={hit.id} />;\n    },\n  }),\n  messages_query: ({ routeParams: { q } }) => ({\n    title: I18n.t(\"js.messages.module_name\"),\n    iconClass: \"fa-regular fa-inbox\",\n    fullResultUrl: searchUrl({ q, module: \"messages\" }),\n    renderHit(hit) {\n      return <MessageHit {...hit} key={hit.id} />;\n    },\n  }),\n  appointments_query: ({ routeParams: { q, groupSlug } }) => ({\n    title: I18n.t(\"js.calendars.module_name\"),\n    iconClass: \"fa-regular fa-calendar-day\",\n    fullResultUrl: searchUrl({ q, groupSlug, module: \"appointments\" }),\n    renderHit(hit) {\n      switch (hit.type) {\n        case \"recurring_appointment\":\n          return <RecurringAppointmentHit {...hit} key={hit.id} />;\n        case \"modified_recurring_appointment\":\n          return <ModifiedRecurringAppointmentHit {...hit} key={hit.id} />;\n        default:\n          return <AppointmentHit {...hit} key={hit.id} />;\n      }\n    },\n  }),\n  files_query: ({ routeParams: { q, groupSlug } }) => ({\n    title: I18n.t(\"js.files.module_name\"),\n    iconClass: \"fa-regular fa-files\",\n    fullResultUrl: searchUrl({ q, groupSlug, module: \"files\" }),\n    renderHits(hits, meta) {\n      return <FileHits hits={hits} meta={meta} groupSlug={groupSlug} q={q} />;\n    },\n  }),\n  folders_query: ({ routeParams: { q, groupSlug } }) => ({\n    title: I18n.t(\"js.files.search.folder_results_heading\"),\n    iconClass: \"fa-regular fa-folder-open\",\n    fullResultUrl: searchUrl({ q, groupSlug, module: \"files\" }),\n    renderHits(hits, meta) {\n      return <FolderHits hits={hits} meta={meta} groupSlug={groupSlug} q={q} />;\n    },\n  }),\n  memberships_query: ({ routeParams: { q } }) => ({\n    title: I18n.t(\"js.directory.title.members\"),\n    iconClass: \"fa-regular fa-user\",\n    fullResultUrl: `/members?${stringifyQuery({ q })}`,\n    renderHit(hit) {\n      return <MembershipHit {...hit} key={hit.id} />;\n    },\n  }),\n  groups_query: ({ routeParams: { q }, hits }) => {\n    const groupHits = hits as { group_category_id?: string }[] | undefined;\n    const groupCategory =\n      groupHits && groupHits.length > 0\n        ? Tixxt.currentNetwork\n            .group_categories()\n            .get(groupHits[0].group_category_id)\n        : null;\n\n    return {\n      title: I18n.t(\"js.directory.title.groups\"),\n      iconClass: \"fa-regular fa-users\",\n      fullResultUrl: groupCategory\n        ? `/directory/${groupCategory.get(\"slug\")}?${stringifyQuery({ q })}`\n        : null,\n      renderHit(hit) {\n        return <GroupHit {...hit} key={hit.id} />;\n      },\n    };\n  },\n  pages_query: ({ routeParams: { q, groupSlug } }) => ({\n    title: I18n.t(\"js.pages.module_name\"),\n    iconClass: \"fa-regular fa-sidebar\",\n    fullResultUrl: searchUrl({ q, groupSlug, module: \"pages\" }),\n    renderHit(hit, { highlight }) {\n      return <PageHit {...hit} highlight={highlight} key={hit.id} />;\n    },\n  }),\n  items_query: ({ routeParams: { q, groupSlug } }) => ({\n    title: I18n.t(\"js.app_creator.module_name\"),\n    iconClass: \"fa-regular fa-table\",\n    fullResultUrl: searchUrl({ q, groupSlug, module: \"items\" }),\n    renderHit(hit) {\n      return <ItemHit {...hit} key={hit.item_id} />;\n    },\n  }),\n};\n\nexport default function SearchQueryResult(props: QueryParams) {\n  const { queryName, ...remainingProps } = props;\n  const propsFn = QUERY_MAPPING[queryName];\n  invariant(propsFn, `No propsFn defined to render results for ${queryName}.`);\n  const extraProps = propsFn(props);\n\n  return <Result {...remainingProps} queryName={queryName} {...extraProps} />;\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, isEmpty, values, sum } from \"lodash\";\nimport classnames from \"classnames\";\n\nimport { QUERY_MAPPING, QueryParams } from \"./SearchQueryResult\";\nimport { searchUrl } from \"./urls\";\n\nimport styles from \"./globalSearch.module.css\";\nimport invariant from \"invariant\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { useSearchResults } from \"components/globalSearch/api\";\n\nfunction FilterButton({\n  queryName,\n  total,\n  routeParams,\n  hits,\n  disabled,\n}: {\n  queryName: string;\n  total: number;\n  routeParams: QueryParams[\"routeParams\"];\n  hits: QueryParams[\"hits\"];\n  disabled?: boolean;\n}) {\n  const propsFn = QUERY_MAPPING[queryName];\n  invariant(propsFn, `No propsFn defined to render results for ${queryName}.`);\n  const { title, fullResultUrl } = propsFn({ routeParams, hits });\n\n  return (\n    <li className={classnames({ disabled: !total })}>\n      <a\n        className={classnames(\"relative btn btn-light\", {\n          disabled: disabled,\n        })}\n        href={fullResultUrl || `#${queryName}-results`}\n        onClick={disabled ? (e) => e.preventDefault() : undefined}\n      >\n        {title}\n        {total > 0 ? (\n          <span className=\"!absolute badge rounded-xl bg-unread -right-1.5 !-top-1.5\">\n            {total}\n          </span>\n        ) : null}\n      </a>\n    </li>\n  );\n}\n\nfunction GlobalSearchButton({ q, enabled }: { q: string; enabled?: boolean }) {\n  const { data } = useSearchResults({ q }, { enabled });\n  const total = sum(map(values(data), \"total\"));\n\n  return (\n    <a\n      // remove \"module\", because we want to remove any \"module\" filters\n      // remove \"page\", because a) we want to start on page 1\n      // and b) because if it's emtpy it still gets added and we do not want nor need this\n      // (and it can cause problems with UserBar menu item highlighting)\n      href={searchUrl({ q })}\n      className={\"btn btn-light relative\"}\n    >\n      <FontAwesomeIcon\n        icon={solid(\"arrow-left\")}\n        className={\"text-primary mr-2\"}\n      />\n      {I18n.t(\"js.global_search.filter.search_globally\")}\n      {total > 0 ? (\n        <span className=\"!absolute badge rounded-xl bg-unread -right-1.5 !-top-1.5\">\n          {total}\n        </span>\n      ) : null}\n    </a>\n  );\n}\n\nfunction FilterModule({\n  searchResults,\n  routeParams,\n  loading,\n}: {\n  searchResults: { [key: string]: { total: number; hits: object[] } };\n  routeParams: QueryParams[\"routeParams\"];\n  loading?: boolean;\n}) {\n  if (isEmpty(routeParams.module) && isEmpty(searchResults)) return null;\n\n  return (\n    <ul\n      className={classnames(\n        \"btn-toolbar justify-start\",\n        styles.globalSearchFilterBar,\n      )}\n    >\n      {routeParams.module || routeParams.groupSlug ? (\n        <li className={\"pull-right\"}>\n          <GlobalSearchButton q={routeParams.q} enabled={!loading} />\n        </li>\n      ) : null}\n      {map(searchResults, ({ total, hits }, queryName) => (\n        <FilterButton\n          key={queryName}\n          queryName={queryName}\n          total={total}\n          routeParams={routeParams}\n          hits={hits}\n          disabled={!!routeParams.module}\n        />\n      ))}\n    </ul>\n  );\n}\n\nFilterModule.propTypes = {\n  searchResults: PropTypes.object,\n  routeParams: PropTypes.shape({\n    q: PropTypes.string,\n    module: PropTypes.string,\n    groupSlug: PropTypes.string,\n  }),\n};\n\nexport default FilterModule;\n","import React from \"react\";\nimport FilterModule from \"./FilterModule\";\nimport { map } from \"lodash\";\nimport SearchQueryResult from \"./SearchQueryResult\";\nimport classNames from \"classnames\";\n\nfunction SearchResults({ results, params, loading, error }) {\n  return (\n    <div\n      className={classNames(\"flex flex-col gap-4\", {\n        \"mt-4\": !window.isApp,\n        \"mt-16\": window.isApp,\n      })}\n    >\n      <FilterModule\n        searchResults={results}\n        routeParams={params}\n        loading={loading}\n      />\n      {loading ? (\n        <strong>\n          <i className=\"fa fa-spinner fa-spin\" />{\" \"}\n          {I18n.t(\"js.global_search.loading\")}\n        </strong>\n      ) : null}\n      {error ? (\n        <div className=\"alert alert-error\">\n          {I18n.t(\"js.global_search.loading_error\")}\n        </div>\n      ) : null}\n      {map(results, (result, queryName) => (\n        <SearchQueryResult\n          key={queryName}\n          queryName={queryName}\n          routeParams={params}\n          loading={loading}\n          {...result}\n        />\n      ))}\n    </div>\n  );\n}\n\nexport default SearchResults;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport SearchResults from \"./SearchResults\";\nimport { searchQuery } from \"./urls\";\nimport { useSearchResults } from \"./api\";\n\n/*\nThis component can be used to embed search results into a different module\nIt is used to give immediate feedback when using the files search/filters\n */\nfunction EmbeddedSearchResults({ q, filters, groupSlug, module, page = 1 }) {\n  const query = searchQuery({ q, filters });\n  const {\n    loading,\n    data: searchResults,\n    error,\n  } = useSearchResults({\n    q: query,\n    groupSlug,\n    module,\n    page,\n  });\n\n  const searchParams = { q: query, groupSlug, module, page };\n\n  return (\n    <SearchResults\n      results={searchResults}\n      params={searchParams}\n      loading={loading}\n      error={error}\n    />\n  );\n}\n\nEmbeddedSearchResults.propTypes = {\n  q: PropTypes.string,\n  filters: PropTypes.object,\n  groupSlug: PropTypes.string,\n  module: PropTypes.string,\n  page: PropTypes.number,\n};\n\nexport default EmbeddedSearchResults;\n","import { get, intersection, keyBy, keys, map, uniqBy } from \"lodash\";\n\n// Create a deep merged profile property set from file and folder profile which contains all fields from both profiles\n// It tries to merge options or solve all conflicts in favor of the fileProfile\n//\n// @param [Array] fileProfileProps\n// @param [Array] folderProfileProps\n//\n// @return [Object] mergedProfile object indexed by name key\nconst mergeFileAndFolderProfiles = (fileProfileProps, folderProfileProps) => {\n  const keyedFileProfile = keyBy(fileProfileProps, \"name\");\n  const keyedFolderProfile = keyBy(folderProfileProps, \"name\");\n\n  const intersectionProfileKeys = intersection(\n    keys(keyedFileProfile),\n    keys(keyedFolderProfile),\n  );\n\n  return {\n    ...keyedFolderProfile, // folderProfile first, then overwrite with fileProfile\n    ...keyedFileProfile,\n    ...keyBy(\n      map(intersectionProfileKeys, (key) => {\n        // in both profiles the field is a selection => merge options but prefer props (like label) from fileProfile\n        if (\n          get(keyedFileProfile, [key, \"type\"]) === \"selection\" &&\n          get(keyedFolderProfile, [key, \"type\"]) === \"selection\"\n        ) {\n          return {\n            ...keyedFolderProfile[key],\n            ...keyedFileProfile[key],\n            options: [\n              ...uniqBy(\n                [\n                  ...get(keyedFileProfile, [key, \"options\"], []), // fileProfile first for uniqBy\n                  ...get(keyedFolderProfile, [key, \"options\"], []),\n                ],\n                (o) => o[\"value\"],\n              ),\n            ],\n          };\n        }\n\n        // all other cases => prefer fileProfile\n        return keyedFileProfile[key];\n      }),\n      \"name\",\n    ),\n  };\n};\n\nexport default mergeFileAndFolderProfiles;\n","import React, { useMemo, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useSelector } from \"react-redux\";\nimport {\n  get,\n  filter,\n  find,\n  map,\n  reduce,\n  isEmpty,\n  compact,\n  uniq,\n  concat,\n  debounce,\n} from \"lodash\";\nimport { Field } from \"redux-form\";\nimport classnames from \"classnames\";\nimport {\n  selectFileProfilesEnabled,\n  selectFolderProfilesEnabled,\n} from \"selectors/propertySets\";\n\nimport SelectionField from \"components/appCreator/properties/edit/SelectionField\";\nimport TagField from \"components/appCreator/properties/edit/TagField\";\nimport mergeFileAndFolderProfiles from \"./mergeFileAndFolderProfiles\";\nimport styles from \"../files.module.css\";\nimport ReduxForm from \"../../shared/reduxForm\";\nimport { usePropertySet } from \"../../shared/propertySets/api\";\n\n// Helper component to isolate profile loading and filter building\nfunction ProfileFilters({ contextId, contextType, children }) {\n  const { loading: folderProfileLoading, data: folderProfile } = usePropertySet(\n    { name: \"folder_profile\", contextId, contextType },\n  );\n\n  const { loading: fileProfileLoading, data: fileProfile } = usePropertySet({\n    name: \"file_profile\",\n    contextId,\n    contextType,\n  });\n\n  const filterLoading = fileProfileLoading || folderProfileLoading;\n\n  const mergedProfile = mergeFileAndFolderProfiles(\n    get(fileProfile, [\"properties\"], []),\n    get(folderProfile, [\"properties\"], []),\n  );\n\n  // Filter given profile for selection properties\n  const selectionFilters = filter(mergedProfile, (p) => p.type === \"selection\");\n  // Get the first tag field from given profile\n  const tagFilter = find(mergedProfile, (p) => p.type === \"tag\");\n  const tagParents = uniq(\n    compact(\n      concat(\n        [\"network\"],\n        get(fileProfile, [\"tag_parents\"], []),\n        get(folderProfile, [\"tag_parents\"], []),\n      ),\n    ),\n  );\n\n  return children({ filterLoading, selectionFilters, tagFilter, tagParents });\n}\n\n// Helper component to skip profile loading and filter building\nconst NoExtraFilters = ({ children }) => children({ filterLoading: false });\n\nconst formValuesToSearchParams = ({\n  search: q = null,\n  tag: rawTag = null,\n  ...rawFilters\n}) => {\n  const filters = reduce(\n    rawFilters,\n    (result, filterValue, filterName) => {\n      if (!isEmpty(filterValue)) result[`profile.${filterName}`] = filterValue;\n      return result;\n    },\n    {},\n  );\n\n  if (!isEmpty(rawTag)) filters.tag = rawTag.name;\n\n  if (isEmpty(q) && isEmpty(filters)) return null;\n\n  return { q, filters };\n};\n\nfunction SearchFilters({ contextId, contextType, initialValues, onSubmit }) {\n  const handleSubmit = (values) => onSubmit(formValuesToSearchParams(values));\n  const debouncedSubmit = useMemo(\n    () => debounce(handleSubmit, 300),\n    [onSubmit],\n  );\n  const fileProfilesEnabled = useSelector(selectFileProfilesEnabled);\n  const folderProfilesEnabled = useSelector(selectFolderProfilesEnabled);\n  const profileEnabled = fileProfilesEnabled || folderProfilesEnabled;\n\n  const FilterProvider = profileEnabled ? ProfileFilters : NoExtraFilters;\n\n  const [showFilters, setShowFilters] = useState(false);\n\n  return (\n    <FilterProvider contextId={contextId} contextType={contextType}>\n      {({ filterLoading, selectionFilters, tagFilter, tagParents }) => {\n        const filterAvailable =\n          !isEmpty(selectionFilters) || !isEmpty(tagFilter);\n\n        return (\n          <div className=\"FilesSearch grow\">\n            <ReduxForm\n              className=\"!max-w-none\"\n              form=\"files-search\"\n              onSubmit={handleSubmit}\n              onChange={(values, _dispatch, _props, previousValues) =>\n                // Submit changes to search text debounced\n                values.search !== previousValues.search\n                  ? debouncedSubmit(values)\n                  : handleSubmit(values)\n              }\n              initialValues={initialValues}\n              noActions\n            >\n              <div className=\"flex flex-row gap-2 divide-gray-300 divide-x place-items-end\">\n                <div className=\"input-group grow\">\n                  <Field\n                    component=\"input\"\n                    type=\"text\"\n                    name=\"search\"\n                    placeholder={I18n.t(\"js.files.search.placeholder\")}\n                  />\n                  <button className=\"btn btn-primary\" type=\"submit\">\n                    <i className=\"fa fa-search\" />\n                  </button>\n                </div>\n                {filterAvailable ? (\n                  <div className=\"pl-2\">\n                    <a\n                      href=\"#\"\n                      className={classnames(\"btn btn-light\", {\n                        active: showFilters,\n                      })}\n                      onClick={(e) => {\n                        e.preventDefault();\n                        setShowFilters(!showFilters);\n                      }}\n                    >\n                      <i className=\"fa-regular fa-filter\" />\n                    </a>\n                  </div>\n                ) : filterLoading ? (\n                  <div className=\"pl-2\">\n                    <button className=\"btn btn-light disabled\" disabled>\n                      <i className=\"fa-regular fa-spinner fa-spin\" />\n                    </button>\n                  </div>\n                ) : null}\n              </div>\n\n              {filterAvailable && showFilters ? (\n                <div\n                  className={classnames(\n                    \"form-horizontal mt-2 max-w-xl\",\n                    styles.FilesSearchFilters,\n                  )}\n                >\n                  {map(selectionFilters, (property) => (\n                    <div key={property.name} className=\"control-group\">\n                      <label\n                        className=\"control-label\"\n                        htmlFor={`filter-${property.name}`}\n                      >\n                        {property.label}\n                      </label>\n                      <div className=\"controls\">\n                        <SelectionField\n                          id={`filter-${property.name}`}\n                          name={property.name}\n                          options={property.options}\n                          select={true}\n                        />\n                      </div>\n                    </div>\n                  ))}\n                  {tagFilter ? (\n                    <div key=\"tags\" className=\"control-group\">\n                      <label className=\"control-label\" htmlFor=\"filter-tags\">\n                        {tagFilter.label}\n                      </label>\n                      <div className=\"controls\">\n                        <TagField\n                          id=\"filter-tags\"\n                          name=\"tag\"\n                          allowCreate={false}\n                          multiple={false}\n                          tagParents={tagParents}\n                          internal={tagFilter.internal}\n                        />\n                      </div>\n                    </div>\n                  ) : null}\n                </div>\n              ) : null}\n            </ReduxForm>\n          </div>\n        );\n      }}\n    </FilterProvider>\n  );\n}\n\nSearchFilters.propTypes = {\n  contextId: PropTypes.string,\n  contextType: PropTypes.string,\n  initialValues: PropTypes.shape({\n    q: PropTypes.text,\n    filters: PropTypes.object,\n  }),\n  onSubmit: PropTypes.func,\n};\n\nexport default SearchFilters;\n","import React, { useState } from \"react\";\nimport Search from \"./search\";\nimport { useDispatch } from \"react-redux\";\nimport { removeFolders, moveFolders } from \"../../actions/files\";\nimport FolderSelectModal from \"./FolderSelectModal\";\n\ntype FolderActionArgs = {\n  folderId: string;\n  searchEnabled: boolean;\n  searchProps: {\n    contextId: string;\n    contextType: \"group\" | \"network\";\n    values: object;\n    showLoading: boolean;\n  };\n  name: string;\n  namespace: string;\n  onRemoveItems: (ids: string[]) => void;\n  onMoveItems: (id: string) => void;\n  can: {\n    add_files: boolean;\n    update: boolean;\n    destroy: boolean;\n    create_subfolders: boolean;\n  };\n  type: string;\n};\n\nfunction FolderActions({\n  folderId,\n  searchEnabled,\n  searchProps,\n  can,\n  name,\n  namespace,\n  onRemoveItems,\n  onMoveItems,\n  type,\n}: FolderActionArgs) {\n  const dispatch = useDispatch();\n  const [showModal, setShowModal] = useState(false);\n  const contextPath =\n    searchProps.contextType == \"group\"\n      ? `/groups/${searchProps.contextId}`\n      : \"\";\n\n  async function removeFolder(e) {\n    e.preventDefault();\n\n    if (confirm(I18n.t(\"js.files.folder.delete_confirmation\", { name }))) {\n      try {\n        await dispatch(\n          removeFolders({\n            body: {\n              folder_ids: [folderId],\n            },\n          }),\n        );\n        onRemoveItems([folderId]);\n      } catch (e) {\n        console.error(e);\n      }\n    }\n  }\n\n  async function moveFolder(targetFolder) {\n    try {\n      await dispatch(\n        moveFolders({\n          body: {\n            folder_ids: [folderId],\n            target_folder_id: targetFolder.id,\n          },\n        }),\n      );\n      onMoveItems(targetFolder.id);\n    } catch (e) {\n      console.error(e);\n    }\n  }\n\n  return (\n    <>\n      {showModal && (\n        <FolderSelectModal\n          modalTitle={I18n.t(\"js.files.move.modal.title\")}\n          currentRootFolder={{ id: folderId, namespace }}\n          selectedItemIds={[folderId]}\n          onSelectFolder={moveFolder}\n          closeModal={() => setShowModal(false)}\n        />\n      )}\n      <div className=\"btn-toolbar divide-gray-300 divide-x justify-end items-stretch mb-4\">\n        {searchEnabled && <Search {...searchProps} />}\n        {(can?.add_files || type !== \"activitystream_folder\") && (\n          <div className=\"pl-2 first:pl-0\">\n            <div className=\"btn-group\">\n              {can?.add_files && (\n                <a\n                  href={`${contextPath}/files/new?folder_id=${folderId}`}\n                  className=\"btn btn-primary whitespace-nowrap\"\n                >\n                  <i className=\"fa-regular fa-circle-plus mr-2\" />\n                  {I18n.t(\"js.files.add_files\")}\n                </a>\n              )}\n              {type !== \"activitystream_folder\" && (\n                <>\n                  <a\n                    className=\"btn btn-light dropdown-toggle\"\n                    href=\"#\"\n                    data-bs-toggle=\"dropdown\"\n                  >\n                    <i className=\"fa-solid fa-ellipsis\" />\n                  </a>\n                  <ul className=\"context-menu dropdown-menu left\">\n                    {can?.create_subfolders && (\n                      <li>\n                        <a\n                          href={`${contextPath}/files/folders/new?folder_id=${folderId}`}\n                        >\n                          <i className=\"fa-regular fa-circle-plus mr-2\" />\n                          {I18n.t(\"js.files.new_folder\")}\n                        </a>\n                      </li>\n                    )}\n                    {can?.destroy && (\n                      <li>\n                        <a\n                          href=\"#move\"\n                          onClick={(e) => {\n                            e.preventDefault();\n                            setShowModal(true);\n                          }}\n                        >\n                          <i className=\"fa-regular fa-arrows-up-down-left-right mr-2\" />\n                          {I18n.t(\"js.files.folder.headline_tools.move_folder\")}\n                        </a>\n                      </li>\n                    )}\n                    {can?.update && (\n                      <>\n                        <li className=\"divider\" />\n                        <li>\n                          <a\n                            href={`${contextPath}/files/folders/${folderId}/edit`}\n                          >\n                            <i className=\"fa-regular fa-pen-to-square mr-2\" />\n                            {I18n.t(\n                              \"js.files.folder.headline_tools.edit_folder\",\n                            )}\n                          </a>\n                        </li>\n                      </>\n                    )}\n                    {can?.destroy && (\n                      <li>\n                        <a\n                          className=\"text-danger\"\n                          href=\"#destroy\"\n                          onClick={removeFolder}\n                        >\n                          <i className=\"fa-regular fa-trash-can mr-2\" />\n                          {I18n.t(\n                            \"js.files.folder.headline_tools.delete_folder\",\n                          )}\n                        </a>\n                      </li>\n                    )}\n                  </ul>\n                </>\n              )}\n            </div>\n          </div>\n        )}\n      </div>\n    </>\n  );\n}\n\nexport default FolderActions;\n","import React, { useRef, useState, useEffect } from \"react\";\nimport classNames from \"classnames\";\n\ninterface FullSizeContentTypes {\n  children: ({ height }: { height: number }) => React.ReactNode;\n  className?: string;\n}\n\nfunction FullSizeContent({ children, className }: FullSizeContentTypes) {\n  const ref = useRef<HTMLDivElement>(null);\n  const [style, setStyle] = useState<{ height: number }>();\n\n  useEffect(() => {\n    function updateStyle() {\n      if (!ref.current) return;\n      if (ref.current.offsetTop == 0) return;\n      setStyle({\n        height: window.innerHeight - ref.current.offsetTop,\n      });\n    }\n\n    updateStyle();\n    window.addEventListener(\"resize\", updateStyle);\n    return () => {\n      window.removeEventListener(\"resize\", updateStyle);\n    };\n  }, [ref.current]);\n\n  return (\n    <div className={classNames(\"FullSizeContent\", className)} ref={ref}>\n      {ref.current && style && children(style)}\n    </div>\n  );\n}\n\nexport default FullSizeContent;\n","import { useEffect } from \"react\";\n\nexport default function useFullWidthLayout() {\n  useEffect(() => {\n    if (document.body.classList.contains(\"tixxt--full\")) {\n      document.body.classList.add(\"full-content\");\n    }\n\n    return () => {\n      if (document.body.classList.contains(\"full-content\")) {\n        document.body.classList.remove(\"full-content\");\n      }\n    };\n  }, []);\n}\n","import React, { useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport { omit, isEmpty, find } from \"lodash\";\n\nimport Text from \"../appCreator/properties/show/Text\";\nimport ValueSetTable from \"../shared/propertySets/ValueSetTable\";\nimport FolderContentsTable, {\n  FolderContentsTableWithProfile,\n} from \"./table/FolderContentsTable\";\nimport BatchActions from \"./BatchActions\";\nimport UrlContextProvider from \"./UrlContextProvider\";\nimport SelectableFileRow from \"./table/SelectableFileRow\";\nimport SelectableFolderRow from \"./table/SelectableFolderRow\";\nimport {\n  selectFileProfilesEnabled,\n  selectFolderProfilesEnabled,\n} from \"../../selectors/propertySets\";\nimport EmbeddedSearchResults from \"../globalSearch/EmbeddedSearchResults\";\nimport FolderActions from \"./FolderActions\";\nimport { useFoldersUnreads } from \"../../api/unreads\";\nimport FullSizeContent from \"../shared/FullSizeContent\";\nimport useFullWidthLayout from \"hooks/useFullWidthLayout\";\n\nfunction FolderListing({\n  description,\n  profile,\n  loading,\n  error,\n  contents,\n  sortBy,\n  handleSort,\n  onRemoveItems,\n  id,\n  namespace,\n  parentFolderId,\n  onMoveItems,\n  contextUrl,\n  type,\n  can,\n  name,\n  total_files_count,\n  total_subfolders_count,\n  ...tableProps\n}) {\n  useFullWidthLayout();\n\n  const [searchParams, setSearchParams] = useState(null);\n  const folderProfilesEnabled = useSelector(selectFolderProfilesEnabled);\n  const fileProfilesEnabled = useSelector(selectFileProfilesEnabled);\n  const TableComponent =\n    fileProfilesEnabled || folderProfilesEnabled\n      ? FolderContentsTableWithProfile\n      : FolderContentsTable;\n\n  const groupSlug = Tixxt.currentContext.get(\"slug\") || null;\n\n  const { data: unreads } = useFoldersUnreads();\n\n  const unreadsCount = find(unreads, {\n    group_slug: groupSlug,\n  })?.sum;\n\n  return (\n    <>\n      {unreadsCount > 0 && (\n        <div className=\"alert alert-info flex gap-2 items-center\">\n          {unreadsCount === 1\n            ? I18n.t(\"js.files.approval.single.hint\")\n            : I18n.t(\"js.files.approval.hint\", { count: unreadsCount })}\n          <a\n            className=\"btn btn-light\"\n            href={\n              groupSlug !== null\n                ? `/groups/${groupSlug}/files/approval`\n                : \"/files/approval\"\n            }\n          >\n            {I18n.t(\"js.files.approval.activation\")}\n          </a>\n        </div>\n      )}\n      <UrlContextProvider contextUrl={contextUrl}>\n        <FolderActions\n          folderId={id}\n          name={name}\n          namespace={namespace}\n          type={type}\n          searchEnabled={folderProfilesEnabled}\n          can={can}\n          onRemoveItems={onRemoveItems}\n          onMoveItems={onMoveItems}\n          searchProps={{\n            contextId: groupSlug,\n            contextType: groupSlug ? \"group\" : \"network\",\n            values: profile,\n            showLoading: false,\n            onSubmit: setSearchParams,\n          }}\n        />\n        {(description || (folderProfilesEnabled && !isEmpty(profile))) && (\n          <div className=\"border-box p-2 mb-4 text-sm\">\n            <div className=\"mb-4\">\n              <Text value={description} property={{ multiline: true }} />\n            </div>\n            {folderProfilesEnabled && (\n              <ValueSetTable\n                name=\"folder_profile\"\n                contextId={groupSlug}\n                contextType={groupSlug ? \"group\" : \"network\"}\n                values={profile}\n                showLoading={false}\n                options={{\n                  listStyle: \"flex gap-2\",\n                  listItemStyle: \"flex after:content-['']\",\n                }}\n              />\n            )}\n          </div>\n        )}\n        {searchParams ? (\n          <EmbeddedSearchResults\n            module=\"files\"\n            groupSlug={contextUrl.split(\"/\")[2]}\n            {...searchParams}\n          />\n        ) : (\n          <BatchActions\n            contents={contents}\n            currentFolder={{ id, namespace, parentFolderId }}\n            onRemoveItems={onRemoveItems}\n            onMoveItems={onMoveItems}\n          >\n            {({\n              selectedIds,\n              onSelectItem,\n              headerRef,\n              selectAllCheckbox,\n              rowProps,\n            }) => (\n              <FullSizeContent>\n                {(style) => (\n                  <div\n                    style={style}\n                    className={\"overflow-auto w-full min-h-content\"}\n                  >\n                    <TableComponent\n                      contextId={groupSlug}\n                      contextType={groupSlug ? \"group\" : \"network\"}\n                      loading={loading}\n                      error={error}\n                      selectedIds={selectedIds}\n                      onSelectItem={onSelectItem}\n                      contents={contents}\n                      total_files_count={total_files_count}\n                      total_subfolders_count={total_subfolders_count}\n                      sortBy={sortBy}\n                      handleSort={handleSort}\n                      headerRef={headerRef}\n                      extraPreColumn={selectAllCheckbox}\n                      FileRow={SelectableFileRow}\n                      FolderRow={SelectableFolderRow}\n                      rowProps={rowProps}\n                      {...tableProps}\n                    />\n                  </div>\n                )}\n              </FullSizeContent>\n            )}\n          </BatchActions>\n        )}\n      </UrlContextProvider>\n    </>\n  );\n}\n\nFolderListing.propTypes = {\n  ...omit(FolderContentsTableWithProfile.propTypes, [\n    \"contextId\",\n    \"contextType\",\n  ]),\n  description: PropTypes.string,\n  profile: PropTypes.object,\n  groupId: PropTypes.string,\n  contextUrl: PropTypes.string,\n  can: PropTypes.shape({\n    destroy_contents: PropTypes.bool,\n  }),\n  total_files_count: PropTypes.number,\n  total_subfolders_count: PropTypes.number,\n};\n\nexport default FolderListing;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport ValueSetTable from \"../shared/propertySets/ValueSetTable\";\nimport UrlContextProvider from \"./UrlContextProvider\";\nimport { selectFileProfilesEnabled } from \"../../selectors/propertySets\";\n\n// The rows of the file profile to be used within the existing file info table\n// which is rendered by backbone\nfunction FileProfileRows({ fileId, values, contextUrl }) {\n  const fileProfilesEnabled = useSelector(selectFileProfilesEnabled);\n\n  return fileProfilesEnabled && values ? (\n    <UrlContextProvider contextUrl={contextUrl}>\n      <ValueSetTable\n        name=\"file_profile\"\n        contextId={fileId}\n        contextType=\"file\"\n        values={values}\n        onlyRows\n      />\n    </UrlContextProvider>\n  ) : null;\n}\nFileProfileRows.propTypes = {\n  fileId: PropTypes.string.isRequired,\n  values: PropTypes.object,\n  contextUrl: PropTypes.string,\n};\n\nexport default FileProfileRows;\n","// extracted by mini-css-extract-plugin\nexport default {\"DocumentActionButton\":\"uWGQaky3neNrdOah3pmt\",\"DocumentActionsSupText\":\"R7FbUMLG4U2lGEqKCvfl\"};","import styles from \"./documents.module.css\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport classNames from \"classnames\";\n\nfunction DocumentAction({\n  fileId,\n  action,\n  icon,\n  type,\n  showReviewChanges,\n  disabled,\n}) {\n  const trackView = () => {\n    fetch(`/api/storage/files/${fileId}/track_view`, {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n  };\n\n  const El = disabled\n    ? ({ children, ...props }) => <span {...props}>{children}</span>\n    : ({ children, ...props }) => (\n        <a\n          {...props}\n          href={`/files/${fileId}/${type}/host/${action}${\n            showReviewChanges ? \"?show_review_changes\" : \"\"\n          }`}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          onClick={trackView}\n        >\n          {children}\n        </a>\n      );\n\n  return (\n    <El\n      className={classNames(\n        \"btn btn-light flex items-center gap-1\",\n        styles.DocumentActionButton,\n        {\n          disabled,\n        },\n      )}\n    >\n      {icon ? <>{icon} </> : null}\n      {I18n.t(`js.files.show.toolbar.wopi.actions.${action}`)}\n    </El>\n  );\n}\n\nDocumentAction.propTypes = {\n  fileId: PropTypes.string.isRequired,\n  action: PropTypes.string.isRequired,\n  type: PropTypes.oneOf([\"wopi\", \"docs\"]),\n  icon: PropTypes.node,\n  showReviewChanges: PropTypes.bool,\n  disabled: PropTypes.bool,\n};\n\nexport default DocumentAction;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, some, filter, isEmpty, reject } from \"lodash\";\nimport { useQuery } from \"react-query\";\n\nimport DocumentAction from \"./DocumentAction\";\n\n// Removes review action if edit is authorized\nfunction simplifyActions(actions) {\n  const authorizedActions = filter(actions, {\n    authorized: true,\n  });\n\n  if (some(authorizedActions, { action: \"edit\" })) {\n    return reject(authorizedActions, { action: \"review\" });\n  } else {\n    return authorizedActions;\n  }\n}\n\nasync function fetchActions({ fileId, type }) {\n  const response = await fetch(`/files/${fileId}/${type}/actions`, {\n    credentials: \"include\",\n  });\n\n  return response.json();\n}\n\nexport default function DocumentActions({\n  fileId,\n  locked,\n  finalized,\n  type,\n  renderSuptext,\n  renderIcon,\n}) {\n  const { data } = useQuery([\"documentActions\", fileId, type], () =>\n    fetchActions({ fileId, type }),\n  );\n  const authorizedActions = simplifyActions(data);\n  if (isEmpty(authorizedActions)) return null;\n\n  return (\n    <div className=\"flex flex-col pt-1 mt-2\">\n      <span className={`text-xs text-muted -mt-[15px]`}>\n        {renderSuptext(authorizedActions)}\n      </span>\n      <div className=\"btn-group\">\n        {map(authorizedActions, ({ action, app }) => (\n          <DocumentAction\n            key={action}\n            fileId={fileId}\n            action={action}\n            icon={renderIcon(app)}\n            type={type}\n            disabled={(locked || finalized) && action !== \"view\"}\n          />\n        ))}\n      </div>\n    </div>\n  );\n}\nDocumentActions.propTypes = {\n  fileId: PropTypes.string.isRequired,\n  locked: PropTypes.bool,\n  type: PropTypes.string.isRequired,\n  renderSuptext: PropTypes.func.isRequired,\n  renderIcon: PropTypes.func.isRequired,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, uniq } from \"lodash\";\n\nimport DocumentActions from \"./DocumentActions\";\nimport excel from \"./wopi_icons/excel_16x2.png\";\nimport word from \"./wopi_icons/word_16x2.png\";\nimport powerpoint from \"./wopi_icons/powerpoint_16x2.png\";\nimport visio from \"./wopi_icons/visio_16x2.png\";\nimport office from \"./wopi_icons/Office-color_32x32x32.png\";\n\nconst ICONS = {\n  excel,\n  word,\n  powerpoint,\n  visio,\n  default: office,\n};\n\nexport default function WopiActions({ fileId, locked, finalized }) {\n  return (\n    <DocumentActions\n      type=\"wopi\"\n      fileId={fileId}\n      locked={locked}\n      finalized={finalized}\n      renderSuptext={(authorizedActions) =>\n        I18n.t(\"js.files.show.toolbar.wopi.suptext\", {\n          app: uniq(map(authorizedActions, \"app\")).join(\"/\"),\n        })\n      }\n      renderIcon={(app) => (\n        <img src={ICONS[app.toLowerCase()] || ICONS.default} alt={app} />\n      )}\n    />\n  );\n}\nWopiActions.propTypes = {\n  fileId: PropTypes.string.isRequired,\n  locked: PropTypes.bool,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport DocumentActions from \"./DocumentActions\";\n\nconst ICONS = {\n  spreadsheets: \"fa-regular fa-file-excel\",\n  documents: \"fa-regular fa-file-word\",\n  presentations: \"fa-regular fa-file-powerpoint\",\n};\nexport default function OnlyOfficeActions({ fileId, locked, finalized }) {\n  return (\n    <DocumentActions\n      type=\"docs\"\n      fileId={fileId}\n      locked={locked}\n      finalized={finalized}\n      renderSuptext={() => I18n.t(\"js.files.show.toolbar.only_office.suptext\")}\n      renderIcon={(app) =>\n        ICONS[app] ? <i className={ICONS[app]} aria-hidden=\"true\" /> : null\n      }\n    />\n  );\n}\nOnlyOfficeActions.propTypes = {\n  fileId: PropTypes.string.isRequired,\n  locked: PropTypes.bool,\n};\n","import FolderForm from \"./FolderForm\";\nimport EditFileForm from \"./EditFileForm\";\nimport FolderListing from \"./FolderListing\";\nimport FileProfileRows from \"./FileProfileRows\";\nimport FileSelector from \"./composer/FileSelector\";\nimport WopiActions from \"./documents/WopiActions\";\nimport OnlyOfficeActions from \"./documents/OnlyOfficeActions\";\nimport wrapProvider from \"../../helpers/components/wrapProvider\";\nimport store from \"../../store\";\n\nexport default {\n  \"files/FolderForm\": wrapProvider(store)(FolderForm),\n  \"files/EditFileForm\": wrapProvider(store)(EditFileForm),\n  \"files/FolderListing\": wrapProvider(store)(FolderListing),\n  \"files/FileProfileRows\": wrapProvider(store)(FileProfileRows),\n  \"files/composer/FileSelector\": wrapProvider(store)(FileSelector),\n  \"files/wopi/WopiActions\": wrapProvider(store)(WopiActions),\n  \"files/onlyOffice/OnlyOfficeActions\": wrapProvider(store)(OnlyOfficeActions),\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Selection\":\"pVAirJKibS09YY66XbtS\"};","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport Select from \"react-select\";\nimport { compose } from \"recompose\";\nimport { map, isEmpty, includes, get } from \"lodash\";\nimport { useQuery } from \"react-query\";\nimport { stringify } from \"query-string\";\n\nimport wrapProvider from \"helpers/components/wrapProvider\";\nimport store from \"store\";\nimport styles from \"components/shared/styles/select.module.css\";\n\nconst useReservableMeetingRooms = ({ dateRange, roomId, loadData }) => {\n  const query = {\n    filter: \"reservable\",\n    ...dateRange,\n    room_id: roomId || null,\n  };\n\n  const url = `/meeting_rooms?${stringify(query)}`;\n\n  return useQuery(url, { enabled: loadData });\n};\n\nfunction MeetingRoomSelect({ meeting, show, disabled, dateRange, onChange }) {\n  const preSelectedRoomId = get(meeting, \"room_id\") || null;\n\n  const loadData = !isEmpty(dateRange.end);\n\n  const {\n    isLoading: loading,\n    data: meetingRooms,\n    error,\n  } = useReservableMeetingRooms({\n    dateRange,\n    roomId: preSelectedRoomId,\n    loadData,\n  });\n\n  return show ? (\n    <div className=\"control-group meeting-room\">\n      <label className=\"control-label\">\n        {I18n.t(\"js.calendars.appointment.meeting.meeting_rooms.label\")}\n      </label>\n      <div className=\"controls custom-controls border-box\">\n        <div className=\"flex-col space-y-2 p-2\">\n          {disabled ? (\n            <p className=\"text-sm\">\n              {I18n.t(\n                \"js.calendars.appointment.meeting.meeting_rooms.select_hint\",\n              )}\n            </p>\n          ) : (\n            <p className=\"text-sm\">\n              {I18n.t(\"js.calendars.appointment.meeting.buffer_time\")}\n            </p>\n          )}\n          <div className=\"controls>\">\n            {loading ? (\n              <>\n                <i className=\"fa fa-spinner spin\" />{\" \"}\n                {I18n.t(\n                  \"js.calendars.appointment.meeting.meeting_rooms.loading\",\n                )}\n              </>\n            ) : error ? (\n              <p className=\"text-danger\">{I18n.t(\"js.generic_error\")}</p>\n            ) : isEmpty(meetingRooms) ? (\n              <p className=\"text-danger\">\n                {I18n.t(\n                  \"js.calendars.appointment.meeting.meeting_rooms.nothing_free\",\n                )}\n              </p>\n            ) : (\n              <Select\n                isClearable\n                className={styles.Selection}\n                isDisabled={disabled}\n                value={\n                  includes(map(meetingRooms, \"id\"), get(meeting, \"room_id\"))\n                    ? { value: meeting, label: meeting.room_name }\n                    : null\n                }\n                options={map(meetingRooms, (room) => ({\n                  value: room,\n                  label:\n                    room.name +\n                    (room.occupied\n                      ? \" \" +\n                        I18n.t(\"js.calendars.appointment.meeting.occupied\")\n                      : \"\"),\n                  isDisabled: room.occupied,\n                }))}\n                onChange={(e) => {\n                  onChange(\n                    isEmpty(e)\n                      ? null\n                      : { room_id: e.value.id, room_name: e.value.name },\n                  );\n                }}\n                placeholder={I18n.t(\n                  \"js.calendars.appointment.meeting.meeting_rooms.select\",\n                )}\n                classNamePrefix={\"Select\"}\n                id=\"meeting-room-selection\"\n              />\n            )}\n          </div>\n        </div>\n      </div>\n    </div>\n  ) : null;\n}\n\nMeetingRoomSelect.propTypes = {\n  meeting: PropTypes.shape({\n    room_id: PropTypes.string,\n    reservation_id: PropTypes.string,\n    room_name: PropTypes.string,\n  }),\n  show: PropTypes.bool,\n  disabled: PropTypes.bool,\n  dateRange: PropTypes.shape({\n    start: PropTypes.string,\n    end: PropTypes.string,\n  }),\n  onChange: PropTypes.func,\n};\n\nexport default compose(wrapProvider(store))(MeetingRoomSelect);\n","import { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport classNames from \"classnames\";\nimport React, { MouseEventHandler } from \"react\";\nimport classnames from \"classnames\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ntype DropDownArgs = {\n  children: React.ReactNode;\n  alignment?: \"start\" | \"end\";\n  className?: string;\n};\n\nfunction DropDown({ children, className, alignment = \"end\" }: DropDownArgs) {\n  return (\n    <ul\n      className={classnames(\n        `dropdown-menu dropdown-menu-${alignment}`,\n        className,\n      )}\n    >\n      {children}\n    </ul>\n  );\n}\n\ntype DropDownItemArgs = {\n  children?: React.ReactNode;\n  url?: string;\n  icon?: IconProp;\n  text?: string;\n  additional?: React.ReactNode;\n  linkStyle?: string;\n  iconStyle?: React.CSSProperties;\n  method?: string;\n  className?: string;\n  iconClassName?: string;\n  onSelect?: MouseEventHandler<HTMLAnchorElement>;\n};\n\nexport function DropDownItem({\n  children,\n  url,\n  icon,\n  text,\n  additional,\n  linkStyle,\n  iconStyle,\n  method,\n  className,\n  iconClassName,\n  onSelect,\n}: DropDownItemArgs) {\n  return (\n    <li className={className}>\n      {children ? (\n        children\n      ) : (\n        <a\n          href={url || \"#\"}\n          className={classNames(\"dropdown-item\", linkStyle)}\n          data-method={method}\n          onClick={onSelect}\n        >\n          <span className=\"flex items-center space-x-1\">\n            {icon && (\n              <FontAwesomeIcon\n                icon={icon}\n                className={classNames(\"fa-fw\", iconClassName)}\n                style={iconStyle}\n              />\n            )}\n            {text && <span className=\"flex-1\">{text}</span>}\n            {additional}\n          </span>\n        </a>\n      )}\n    </li>\n  );\n}\n\ntype DropDownSubMenuArgs = {\n  text: string;\n  children: React.ReactNode;\n  className?: string;\n  icon?: IconProp;\n  iconClassName?: string;\n  side?: \"left\" | \"right\";\n};\n\nexport function DropDownSubMenu({\n  text,\n  children,\n  className,\n  side = \"right\",\n}: DropDownSubMenuArgs) {\n  return (\n    <li className={classnames(\"relative group\", className)}>\n      <div className=\"dropdown-item flex items-center w-full text-left cursor-pointer\">\n        <span className=\"flex-1\">{text}</span>\n        <FontAwesomeIcon icon={regular(\"chevron-right\")} className=\"ml-auto\" />\n      </div>\n      <ul\n        className={classNames(\n          \"dropdown-menu absolute top-0 mt-0 hidden group-hover:block\",\n          {\n            \"left-full ml-1\": side == \"right\",\n            \"right-full mr-1\": side == \"left\",\n          },\n        )}\n      >\n        {children}\n      </ul>\n    </li>\n  );\n}\n\nDropDown.Item = DropDownItem;\nDropDown.SubMenu = DropDownSubMenu;\nexport default DropDown;\n","import React, { useEffect, useRef } from \"react\";\nimport moment from \"moment-timezone\";\n\ninterface TimeAgoProps {\n  time: string;\n}\n\nfunction TimeAgo(props: TimeAgoProps) {\n  const ref = useRef(null);\n  let el;\n\n  useEffect(() => {\n    if (!el && ref.current) {\n      el = $(ref.current);\n      el.timeago(\"init\");\n    } else {\n      el.timeago(\"updateFromDOM\");\n    }\n    return () => el.timeago(\"dispose\");\n  });\n\n  return (\n    <time\n      className=\"timeago\"\n      dateTime={props.time}\n      title={moment(props.time).format(\n        I18n.t(\"plugins.Locale.Formats.valid_datetime\"),\n      )}\n      ref={ref}\n    >\n      {props.time}\n    </time>\n  );\n}\n\nexport default TimeAgo;\n","import type { ComponentType } from \"react\";\nimport React from \"react\";\nimport { map } from \"lodash\";\nimport { withProps } from \"recompose\";\nimport TimeAgo from \"./TimeAgo\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ntype Texts = {\n  title: string;\n  generatingInfo: string;\n  createdAt: string;\n  generateNew: string;\n  generateNewHint: string;\n};\n\ninterface ProgressTypes {\n  percentage: number;\n  texts: Texts;\n}\n\nfunction Progress({ percentage, texts }: ProgressTypes) {\n  return (\n    <>\n      <div className=\"progress\">\n        <div\n          className=\"progress-bar progress-bar-striped progress-bar-animated\"\n          style={{ width: `${percentage}%` }}\n        >\n          {percentage.toFixed()}%\n        </div>\n      </div>\n      <p className={\"text-sm\"}>{texts.generatingInfo}</p>\n    </>\n  );\n}\n\ninterface StartTypes {\n  createdAt: string;\n  files: Array<{\n    id: string;\n    extension: string;\n    fileUrl: string;\n    downloadUrl: string;\n  }>;\n\n  createExport(...args: unknown[]): unknown;\n\n  status: \"initialized\" | \"in_progress\" | \"finished\";\n  texts: Texts;\n}\n\nfunction Start({ createdAt, files, createExport, status, texts }: StartTypes) {\n  return (\n    <>\n      {status === \"finished\" ? (\n        <>\n          <p>\n            {texts.createdAt}{\" \"}\n            <strong>\n              <TimeAgo time={createdAt} />\n            </strong>\n          </p>\n          <ul className=\"flex gap-4 border-b border-neutral border-solid pb-4 mb-4\">\n            {map(files, (file) => (\n              <li key={file.id}>\n                <a href={file.fileUrl}>\n                  <FontAwesomeIcon\n                    icon={regular(\"file-lines\")}\n                    className={\"mr-1\"}\n                  />\n                  {file.extension.toUpperCase()}\n                </a>{\" \"}\n                <a href={file.downloadUrl}>\n                  <i className=\"fa fa-cloud-download\" />\n                </a>\n              </li>\n            ))}\n          </ul>\n        </>\n      ) : null}\n      <div className={\"flex gap-2 items-baseline\"}>\n        <a onClick={createExport} href=\"#\" className={\"btn btn-light\"}>\n          {texts.generateNew}\n        </a>\n        <span className={\"text-sm text-muted\"}>{texts.generateNewHint}</span>\n      </div>\n    </>\n  );\n}\n\ninterface ExporterTypes extends ProgressTypes, StartTypes {\n  canExport?: boolean;\n  texts: Texts;\n}\n\nfunction Exporter({ status, canExport, texts, ...props }: ExporterTypes) {\n  return canExport ? (\n    <div className=\"flex gap-4 border-box p-4 w-max\">\n      <i className=\"fa-light fa-cloud-arrow-down fa-4x text-muted\" />\n      <div className=\"grow max-w-prose flex flex-col gap-2\">\n        <h4 className={\"text-md font-semibold\"}>{texts.title}</h4>\n        {status === \"initialized\" || status === \"in_progress\" ? (\n          <Progress texts={texts} {...props} />\n        ) : (\n          <Start status={status} texts={texts} {...props} />\n        )}\n      </div>\n    </div>\n  ) : null;\n}\n\nconst AppItemsExporter = withProps(() => ({\n  texts: {\n    title: I18n.t(\"js.apps.export.headline\"),\n    generatingInfo: I18n.t(\"js.apps.export.in_progress_hint\"),\n    createdAt: I18n.t(\"js.apps.export.date\"),\n    generateNew: I18n.t(\"js.apps.export.create_new\"),\n    generateNewHint: I18n.t(\"js.apps.export.create_new_hint\"),\n    error: I18n.t(\"js.apps.export.failure\"),\n  },\n}))(Exporter as ComponentType<never>);\n\nconst MembershipsExporter = withProps(() => ({\n  texts: {\n    title: I18n.t(\"js.administration.members.export.headline\"),\n    generatingInfo: I18n.t(\"js.administration.members.export.generating_info\"),\n    createdAt: I18n.t(\"js.administration.members.export.export_created_at\"),\n    generateNew: I18n.t(\"js.administration.members.export.generate_new\"),\n    generateNewHint: I18n.t(\n      \"js.administration.members.export.generate_new_hint\",\n    ),\n  },\n}))(Exporter);\n\nconst ConsumersExporter = withProps(() => ({\n  texts: {\n    title: I18n.t(\"js.administration.consumer_manager.export.headline\"),\n    generatingInfo: I18n.t(\n      \"js.administration.consumer_manager.export.generating_info\",\n    ),\n    createdAt: I18n.t(\n      \"js.administration.consumer_manager.export.export_created_at\",\n    ),\n    generateNew: I18n.t(\n      \"js.administration.consumer_manager.export.generate_new\",\n    ),\n    generateNewHint: I18n.t(\n      \"js.administration.consumer_manager.export.generate_new_hint\",\n    ),\n  },\n}))(Exporter);\n\nexport default Exporter;\nexport { AppItemsExporter, MembershipsExporter, ConsumersExporter };\n","import React from \"react\";\nimport Modal from \"./Modal\";\n\ninterface RecurringAppointmentDecisionModalProps {\n  showModal: boolean;\n  onClose: (show: boolean) => void;\n  handleDecision: (decision: \"this\" | \"all\") => void;\n}\n\nconst RecurringAppointmentDecisionModal: React.FC<\n  RecurringAppointmentDecisionModalProps\n> = ({ showModal, onClose, handleDecision }) => {\n  return (\n    showModal && (\n      <Modal\n        static\n        title={I18n.t(\"js.calendars.reucrring_appointment.rsvp.apply_to.label\")}\n        onClose={onClose}\n        useMinHeightMax={true}\n      >\n        <div className=\"btn-group flex justify-center\">\n          <button\n            type=\"button\"\n            className=\"btn btn-primary\"\n            onClick={() => handleDecision(\"this\")}\n          >\n            {I18n.t(\"js.calendars.reucrring_appointment.rsvp.apply_to.this\")}\n          </button>\n          <button\n            type=\"button\"\n            className=\"btn btn-light\"\n            onClick={() => handleDecision(\"all\")}\n          >\n            {I18n.t(\"js.calendars.reucrring_appointment.rsvp.apply_to.all\")}\n          </button>\n        </div>\n      </Modal>\n    )\n  );\n};\n\nexport default RecurringAppointmentDecisionModal;\n","import MarkdownEditor from \"./markdownEditor\";\nimport MeetingRoomSelect from \"./MeetinRoomSelect\";\nimport TranslationControls from \"./TranslationControls\";\nimport Exporter, {\n  AppItemsExporter,\n  ConsumersExporter,\n  MembershipsExporter,\n} from \"./SimpleExporter\";\nimport wrapProvider from \"../../helpers/components/wrapProvider\";\nimport store from \"../../store\";\nimport RecurringAppointmentDecisionModal from \"./RecurringAppointmentDecisionModal\";\n\nexport default {\n  \"shared/MarkdownEditor\": MarkdownEditor,\n  \"shared/Exporter\": Exporter,\n  \"shared/AppItemsExporter\": AppItemsExporter,\n  \"shared/MembershipsExporter\": MembershipsExporter,\n  \"shared/ConsumersExporter\": ConsumersExporter,\n  \"shared/MeetingRoomSelect\": MeetingRoomSelect,\n  \"shared/TranslationControls\": wrapProvider(store)(TranslationControls),\n  \"shared/RecurringAppointmentDecisionModal\": RecurringAppointmentDecisionModal,\n};\n","import React, { useEffect, useState } from \"react\";\nimport { useQuery } from \"react-query\";\nimport classNames from \"classnames\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport type { Dispatch } from \"redux\";\nimport { currentMemberSelector } from \"selectors/environment\";\nimport DropDown, {\n  DropDownItem,\n  DropDownSubMenu,\n} from \"components/shared/DropDown\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { light } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ninterface TranslationControlsProps {\n  object_language: string;\n  type: string;\n  target_id: string;\n  resetTranslation: (language: string) => void;\n  translateObject: (content: string, language: string) => void;\n}\n\ninterface Language {\n  language: string;\n  name: string;\n  supports_formality: boolean;\n}\n\nexport default function TranslationControls({\n  type,\n  target_id,\n  object_language,\n  resetTranslation,\n  translateObject,\n}: TranslationControlsProps) {\n  const dispatch: Dispatch = useDispatch();\n  const currentMember = useSelector(currentMemberSelector);\n  const { data: languages } = useQuery<Language[]>(\"/translations/languages\");\n  const [primaryLanguages, setPrimaryLanguages] = useState<Language[]>([]);\n  const [secondaryLanguages, setSecondaryLanguages] = useState<Language[]>([]);\n  const [selectedLanguage, setSelectedLanguage] = useState(\n    object_language || \"ORIGINAL\",\n  );\n\n  useEffect(() => {\n    const [primary, secondary] = categorizeLanguages();\n    setPrimaryLanguages(primary);\n    setSecondaryLanguages(secondary);\n  }, [languages, selectedLanguage, currentMember]);\n\n  function handleLanguageSelect(\n    event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n    language: string,\n  ) {\n    event.preventDefault();\n    dispatch({\n      type: \"currentMember/LANGUAGE/SET_LAST_USED\",\n      payload: language,\n    });\n\n    translateActivityReply(language);\n    setSelectedLanguage(language);\n  }\n\n  function translateActivityReply(targetLanguage: string) {\n    if (targetLanguage === \"ORIGINAL\") {\n      resetTranslation(targetLanguage);\n    } else {\n      fetch(`/translations/${targetLanguage}/${type}/${target_id}`)\n        .then((response) => response.json())\n        .then((data) => {\n          translateObject(data.text, targetLanguage);\n        })\n        .catch((e) => {\n          console.error(e);\n          toastr.error(\n            I18n.t(\"js.activitystreams.activity.translation_controls.error\"),\n          );\n        });\n    }\n  }\n  function categorizeLanguages() {\n    const primaryLanguageKeys = [\n      currentMember?.last_used_translation_language,\n      \"DE\",\n      \"EN-GB\",\n      \"ES\",\n      \"FR\",\n    ];\n    const primary =\n      languages\n        ?.filter((lang) => primaryLanguageKeys.includes(lang.language))\n        .sort(\n          (a, b) =>\n            primaryLanguageKeys.indexOf(a.language) -\n            primaryLanguageKeys.indexOf(b.language),\n        ) || [];\n\n    const secondary =\n      languages?.filter(\n        (lang) => !primaryLanguageKeys.includes(lang.language),\n      ) || [];\n\n    return [primary, secondary];\n  }\n\n  function renderLanguageListItem(lang: Language) {\n    return (\n      <a\n        className={classNames(\"dropdown-item translate-menu-item\", {\n          disabled: selectedLanguage === lang.language,\n        })}\n        href=\"#\"\n        onClick={(event) => handleLanguageSelect(event, lang.language)}\n      >\n        {lang.name}\n      </a>\n    );\n  }\n\n  return (\n    <div className=\"translation-controls\">\n      <a\n        className=\"translate-button btn btn-sm text-muted dropdown-toggle\"\n        data-bs-toggle=\"dropdown\"\n        aria-label=\"Translate\"\n      >\n        <FontAwesomeIcon icon={light(\"language\")} />\n      </a>\n      <DropDown>\n        {selectedLanguage !== \"ORIGINAL\" && (\n          <DropDownItem>\n            <a\n              className=\"dropdown-item translate-menu-item\"\n              href=\"#\"\n              onClick={(event) => handleLanguageSelect(event, \"ORIGINAL\")}\n            >\n              {I18n.t(\n                \"js.activitystreams.activity.translation_controls.show_original\",\n              )}\n            </a>\n          </DropDownItem>\n        )}\n        {primaryLanguages.map((lang) => (\n          <DropDownItem key={lang.language}>\n            {renderLanguageListItem(lang)}\n          </DropDownItem>\n        ))}\n        {secondaryLanguages.length > 0 && (\n          <DropDownSubMenu\n            text={I18n.t(\n              \"js.activitystreams.activity.translation_controls.more\",\n            )}\n            side={window.isApp ? \"left\" : \"right\"}\n          >\n            {secondaryLanguages.map((lang) => (\n              <DropDownItem key={lang.language}>\n                {renderLanguageListItem(lang)}\n              </DropDownItem>\n            ))}\n          </DropDownSubMenu>\n        )}\n      </DropDown>\n    </div>\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { compose, getContext } from \"recompose\";\n\nconst LayoutToggle = compose(\n  getContext({\n    enableInheritance: PropTypes.bool,\n  }),\n)(({ type, onTypeChange, enableInheritance }) => (\n  <>\n    <div className=\"max-w-prose mb-4\">\n      {I18n.t(\"js.administration.app_creator.app.item_layout.description\")}\n    </div>\n    <div className=\"controls\">\n      <label className=\"radio\">\n        <input\n          type=\"radio\"\n          checked={type === \"auto\"}\n          onChange={() => onTypeChange(\"auto\")}\n        />\n        {I18n.t(\n          \"js.administration.app_creator.app.item_layout.no_custom_layout\",\n        )}\n      </label>\n    </div>\n    {enableInheritance ? (\n      <div className=\"controls\">\n        <label className=\"radio\">\n          <input\n            type=\"radio\"\n            checked={type === \"inherit\"}\n            onChange={() => onTypeChange(\"inherit\")}\n          />\n          {I18n.t(\n            \"js.administration.app_creator.app.item_layout.inherit_layout\",\n          )}\n        </label>\n      </div>\n    ) : null}\n    <div className=\"controls\">\n      <label className=\"radio\">\n        <input\n          type=\"radio\"\n          checked={type === \"custom\"}\n          onChange={() => onTypeChange(\"custom\")}\n        />\n        {I18n.t(\"js.administration.app_creator.app.item_layout.custom_layout\")}\n      </label>\n    </div>\n  </>\n));\n\nLayoutToggle.propTypes = {\n  type: PropTypes.string.isRequired,\n  onTypeChange: PropTypes.func.isRequired,\n};\n\nexport default LayoutToggle;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { get } from \"lodash\";\n\nconst columnLayoutTypes = [\"a\", \"ab\", \"abc\", \"a-bc\", \"a-bc-d\", \"ab-c\"];\n\nfunction LayoutSelect({ layout, onLayoutChange }) {\n  return (\n    <div\n      className=\"select-layout mt-4\"\n      style={{ display: \"simple\" === layout ? \"none\" : null }}\n    >\n      <div className=\"controls\">\n        <div className=\"flex justify-start gap-2 flex-wrap sm:justify-evenly\">\n          {columnLayoutTypes.map((t) => (\n            <label className=\"flex flex-col gap-1 items-center\" key={t}>\n              <input\n                className=\"layout\"\n                type=\"radio\"\n                checked={t === layout}\n                onChange={() => onLayoutChange(t)}\n              />\n              <img\n                src={get(window.Preload, [\n                  \"AppCreatorAssets\",\n                  \"item_layout\",\n                  t,\n                ])}\n                alt={I18n.t(\n                  `js.administration.app_creator.app.item_layout.layouts.${t}`,\n                )}\n              />\n            </label>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n}\nLayoutSelect.propTypes = {\n  layout: PropTypes.string.isRequired,\n  onLayoutChange: PropTypes.func.isRequired,\n};\n\nexport default LayoutSelect;\n","import React from \"react\";\nimport { compose, toClass, withHandlers } from \"recompose\";\nimport { DragSource, DropTarget } from \"react-dnd\";\nimport classNames from \"classnames\";\n\nconst cardSource = {\n  beginDrag: ({ property, column, index }) => ({\n    property,\n    column,\n    index,\n  }),\n\n  endDrag: ({ addColumnProperty, moveColumnProperty }, monitor) => {\n    const item = monitor.getItem();\n    const dropResult = monitor.getDropResult();\n\n    if (!dropResult) {\n      return;\n    }\n\n    if (item.column) {\n      debug(\"moveColumnProperty\", item, dropResult);\n      moveColumnProperty(item, dropResult);\n    } else {\n      debug(\"addColumnProperty\", item.property, dropResult);\n      addColumnProperty(item.property, dropResult);\n    }\n  },\n};\n\nconst cardTarget = {\n  drop: ({ property, column, index }) => {\n    return {\n      property,\n      column,\n      index,\n      _type: \"property\",\n    };\n  },\n};\n\nconst DragSourceProperty = compose(\n  DropTarget(\"property\", cardTarget, (connect, monitor) => ({\n    connectDropTarget: connect.dropTarget(),\n    isOver: monitor.isOver(),\n    canDrop: monitor.canDrop(),\n  })),\n  DragSource(\"property\", cardSource, (connect, monitor) => ({\n    connectDragSource: connect.dragSource(),\n    isDragging: monitor.isDragging(),\n  })),\n  toClass,\n  withHandlers({\n    onSelect:\n      ({ selected, column, index, onSelect }) =>\n      () => {\n        onSelect ? onSelect(selected ? null : { column, index }) : null;\n      },\n  }),\n)(\n  ({\n    isDragging,\n    isOver,\n    connectDragSource,\n    connectDropTarget,\n    property,\n    selected,\n    onSelect,\n  }) =>\n    connectDragSource(\n      connectDropTarget(\n        <div>\n          {isOver && <div className=\"h-10 rounded bg-neutral/50 mb-1\" />}\n          <div\n            onClick={onSelect}\n            className={classNames(\n              \"overflow-hidden bg-primary p-2 rounded text-white text-center cursor-move\",\n              {\n                \"bg-primary/75\": selected,\n                \"border-4 border-white/50\": isOver,\n                hidden: isDragging,\n              },\n            )}\n          >\n            {property.label}\n          </div>\n        </div>,\n      ),\n    ),\n);\n\nexport default DragSourceProperty;\n","import React from \"react\";\nimport { compose, toClass } from \"recompose\";\nimport { DropTarget } from \"react-dnd\";\nimport DragSourceProperty from \"./DragSourceProperty\";\nimport classNames from \"classnames\";\n\nconst columnTarget = {\n  drop: ({ char, column }, monitor) => {\n    if (monitor.didDrop()) {\n      return;\n    } // hasDroppedOnChild\n\n    return {\n      column: char,\n      index: column.length,\n      _type: \"column\",\n    };\n  },\n};\n\nconst DropTargetColumn = compose(\n  DropTarget(\"property\", columnTarget, (connect, monitor) => ({\n    connectDropTarget: connect.dropTarget(),\n    isOverAny: monitor.isOver(),\n    isOver: monitor.isOver({ shallow: true }),\n  })),\n  toClass,\n)(\n  ({\n    connectDropTarget,\n    isOver,\n    isOverAny,\n    char,\n    column,\n    selectedColumnProperty,\n    selectColumnProperty,\n    moveColumnProperty,\n    removeColumnProperty,\n  }) => (\n    <div className=\"content\">\n      {connectDropTarget(\n        <div\n          className={classNames(\"min-h-[128px] bg-neutral/40 rounded p-2\", {\n            \"pb-10\": isOverAny,\n          })}\n        >\n          <div className=\"flex flex-col gap-1\">\n            {column.map(({ property }, i) => (\n              <DragSourceProperty\n                index={i}\n                key={i}\n                property={property}\n                column={char}\n                selected={\n                  selectedColumnProperty &&\n                  selectedColumnProperty.column === char &&\n                  selectedColumnProperty.index === i\n                }\n                onSelect={selectColumnProperty}\n                moveColumnProperty={moveColumnProperty}\n                removeColumnProperty={removeColumnProperty}\n              />\n            ))}\n            {isOver && <div className=\"h-10 rounded bg-neutral/75\" />}\n          </div>\n        </div>,\n      )}\n    </div>\n  ),\n);\n\nexport default DropTargetColumn;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { DragDropContext } from \"react-dnd\";\nimport HTML5Backend from \"react-dnd-html5-backend\";\nimport {\n  compose,\n  setDisplayName,\n  withState,\n  withProps,\n  withHandlers,\n  getContext,\n} from \"recompose\";\nimport { get } from \"lodash\";\nimport DragSourceProperty from \"./DragSourceProperty\";\nimport DropTargetColumn from \"./DropTargetColumn\";\n\nconst ColumnConfigurator = compose(\n  getContext({\n    enableLabelHiding: PropTypes.bool,\n  }),\n  DragDropContext(HTML5Backend),\n  withState(\"selectedColumnProperty\", \"selectColumnProperty\", null), // { index: number, column: char }\n  withHandlers({\n    addColumnProperty:\n      ({ columns, onColumnsUpdate, selectColumnProperty }) =>\n      ({ name }, { index, column }) => {\n        onColumnsUpdate({\n          ...columns,\n          [column]: [\n            ...(columns[column] || []).slice(0, index),\n            { name, show_label: true },\n            ...(columns[column] || []).slice(index),\n          ],\n        });\n        selectColumnProperty({ index, column });\n      },\n    moveColumnProperty:\n      ({ columns, onColumnsUpdate, selectColumnProperty }) =>\n      (from, to) => {\n        const item = { ...columns[from.column][from.index] };\n        if (from.column === to.column) {\n          if (from.index === to.index) {\n            return;\n          }\n\n          const column = [...columns[to.column]]; // copy\n          column.splice(to.index, 0, column.splice(from.index, 1)[0]); // mutate\n          onColumnsUpdate({\n            ...columns,\n            [to.column]: column,\n          });\n          selectColumnProperty({\n            column: to.column,\n            index: to.index > from.index ? to.index - 1 : to.index,\n          });\n        } else {\n          if (to.column === null) {\n            onColumnsUpdate({\n              ...columns,\n              [from.column]: [\n                ...columns[from.column].slice(0, from.index),\n                ...columns[from.column].slice(from.index + 1),\n              ],\n            });\n          } else {\n            onColumnsUpdate({\n              ...columns,\n              [from.column]: [\n                ...columns[from.column].slice(0, from.index),\n                ...columns[from.column].slice(from.index + 1),\n              ],\n              [to.column]: [\n                ...(columns[to.column] || []).slice(0, to.index),\n                item,\n                ...(columns[to.column] || []).slice(to.index),\n              ],\n            });\n          }\n        }\n      },\n    toggleShowLabel:\n      ({ columns, onColumnsUpdate, selectedColumnProperty }) =>\n      () => {\n        const { index, column } = selectedColumnProperty;\n        const columnProperty =\n          columns[selectedColumnProperty.column][selectedColumnProperty.index];\n        onColumnsUpdate({\n          ...columns,\n          [column]: [\n            ...columns[column].slice(0, index),\n            { ...columnProperty, show_label: !columnProperty.show_label },\n            ...columns[column].slice(index + 1),\n          ],\n        });\n      },\n    removeSelectedColumnProperty:\n      ({ columns, onColumnsUpdate, selectedColumnProperty }) =>\n      () => {\n        const { index, column } = selectedColumnProperty;\n        onColumnsUpdate({\n          ...columns,\n          [column]: [\n            ...columns[column].slice(0, index),\n            ...columns[column].slice(index + 1),\n          ],\n        });\n      },\n  }),\n  // assigns matching property to column entry\n  withProps(({ columns, properties }) => {\n    const byName = {};\n    properties.forEach(({ name, label, type }) => {\n      byName[name] = { name, label, type };\n    });\n\n    const columnProperties = _.transform(\n      [\"a\", \"b\", \"c\", \"d\"],\n      (result, char) => {\n        result[char] = (columns[char] || []).map(({ name, show_label }) => ({\n          name,\n          show_label,\n          property: byName[name],\n        }));\n      },\n      {},\n    );\n\n    return {\n      properties,\n      columns: columnProperties,\n    };\n  }),\n  withProps(({ columns, selectedColumnProperty }) => ({\n    selectedColumnProperty:\n      selectedColumnProperty &&\n      get(columns, [\n        selectedColumnProperty.column,\n        selectedColumnProperty.index,\n      ])\n        ? {\n            ...columns[selectedColumnProperty.column][\n              selectedColumnProperty.index\n            ],\n            ...selectedColumnProperty,\n          }\n        : null,\n  })),\n  setDisplayName(\"ColumnConfigurator\"),\n)(\n  ({\n    layout,\n    sourceProperties,\n    columns,\n    selectedColumnProperty,\n    addColumnProperty,\n    moveColumnProperty,\n    removeSelectedColumnProperty,\n    selectColumnProperty,\n    toggleShowLabel,\n    enableLabelHiding,\n  }) => (\n    <div className=\"assign-properties\">\n      <div className=\"grid grid-cols-1 grid-rows-[auto,_1fr,_auto] sm:grid-rows-[auto,_1fr] md:grid-rows-1 sm:grid-cols-5 gap-4 mt-4\">\n        <div className=\"flex flex-col\">\n          <h4>\n            {I18n.t(\"js.administration.app_creator.app.item_layout.fields\")}\n          </h4>\n          <div className=\"properties-source flex flex-col gap-1\">\n            {sourceProperties.map((property, i) => (\n              <DragSourceProperty\n                key={i}\n                property={property}\n                column={null}\n                addColumnProperty={addColumnProperty}\n              />\n            ))}\n          </div>\n        </div>\n        <div className=\"sm:row-span-2 sm:col-span-4 md:col-span-3 md:row-span-1\">\n          <h4>\n            {I18n.t(\"js.administration.app_creator.app.item_layout.layout\")}\n          </h4>\n          <div className=\"flex flex-col gap-2\">\n            {_.map(layout.split(\"-\"), (row) => (\n              <div className=\"flex gap-2\" key={row}>\n                {_.map(row, (char) => (\n                  <div\n                    className=\"border-box p-2 flex-grow flex flex-col gap-2\"\n                    key={char}\n                  >\n                    <div className=\"text-center font-semibold\">\n                      {I18n.t(\n                        `js.administration.app_creator.app.item_layout.columns.${char}`,\n                      )}\n                    </div>\n                    <DropTargetColumn\n                      char={char}\n                      column={columns[char]}\n                      selectedColumnProperty={selectedColumnProperty}\n                      selectColumnProperty={selectColumnProperty}\n                      moveColumnProperty={moveColumnProperty}\n                    />\n                  </div>\n                ))}\n              </div>\n            ))}\n          </div>\n        </div>\n        <div className=\"flex flex-col flex-grow\">\n          <h4>\n            {I18n.t(\n              \"js.administration.app_creator.app.item_layout.fieldoptions\",\n            )}\n          </h4>\n          {selectedColumnProperty && (\n            <div className=\"property-options flex flex-col gap-2 items-stretch\">\n              {enableLabelHiding && (\n                <label className=\"checkbox !items-baseline text-sm\">\n                  <input\n                    type=\"checkbox\"\n                    onChange={toggleShowLabel}\n                    checked={!!selectedColumnProperty.show_label}\n                  />\n                  {I18n.t(\n                    \"js.administration.app_creator.app.property.show_fieldname\",\n                  )}\n                </label>\n              )}\n              <button\n                className=\"btn btn-light btn-sm\"\n                onClick={removeSelectedColumnProperty}\n              >\n                {I18n.t(\n                  \"js.administration.app_creator.app.property.remove_fieldname\",\n                )}\n              </button>\n            </div>\n          )}\n        </div>\n      </div>\n    </div>\n  ),\n);\n\nconst propertyShape = PropTypes.shape({\n  id: PropTypes.string,\n  name: PropTypes.string,\n  label: PropTypes.string,\n  type: PropTypes.string,\n});\nconst columnShape = PropTypes.shape({\n  showLabel: PropTypes.bool,\n  property: propertyShape,\n});\nColumnConfigurator.propTypes = {\n  properties: PropTypes.arrayOf(propertyShape).isRequired,\n  layout: PropTypes.string.isRequired,\n  columns: PropTypes.shape({\n    a: PropTypes.arrayOf(columnShape),\n    b: PropTypes.arrayOf(columnShape),\n    c: PropTypes.arrayOf(columnShape),\n    d: PropTypes.arrayOf(columnShape),\n  }).isRequired,\n  onColumnsUpdate: PropTypes.func.isRequired,\n};\n\nexport default ColumnConfigurator;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport {\n  compose,\n  setDisplayName,\n  withState,\n  withProps,\n  getContext,\n  withHandlers,\n} from \"recompose\";\nimport classnames from \"classnames\";\nimport { values, filter, flatten } from \"lodash\";\nimport LayoutSelect from \"./LayoutSelect\";\nimport ColumnConfigurator from \"./ColumnConfigurator\";\n\nconst updateTabAt = (tabs, index, data) => [\n  ...tabs.slice(0, index),\n  { ...tabs[index], ...data },\n  ...tabs.slice(index + 1),\n];\nconst TabConfigurator = compose(\n  getContext({\n    enableColumns: PropTypes.bool,\n    exclusivePropertyUsage: PropTypes.bool,\n  }),\n  withState(\"selectedTabIndex\", \"selectTabIndex\", 0),\n  withProps(\n    ({ tabs, selectedTabIndex, properties, exclusivePropertyUsage }) => {\n      let sourceProperties = properties;\n\n      if (exclusivePropertyUsage) {\n        const usedProperties = {};\n        tabs.forEach((tab) => {\n          flatten(values(tab.columns)).forEach((columnProp) => {\n            usedProperties[columnProp.name] = true;\n          });\n        });\n\n        sourceProperties = filter(\n          properties,\n          (prop) => !usedProperties[prop.name],\n        );\n      }\n\n      return {\n        selectedTab: tabs[selectedTabIndex],\n        sourceProperties,\n      };\n    },\n  ),\n  withHandlers({\n    addTab:\n      ({ tabs, onTabsChange, selectTabIndex }) =>\n      (e) => {\n        e.preventDefault();\n        onTabsChange([\n          ...tabs,\n          {\n            name: I18n.t(\n              \"js.administration.app_creator.app.item_layout.tabs.new_tab\",\n            ),\n            layout: \"a\",\n            columns: { a: [], b: [], c: [], d: [] },\n          },\n        ]);\n        selectTabIndex(tabs.length);\n      },\n    updateSelectedTabName:\n      ({ tabs, selectedTabIndex, onTabsChange }) =>\n      (e) => {\n        onTabsChange(\n          updateTabAt(tabs, selectedTabIndex, { name: e.target.value }),\n        );\n      },\n    updateSelectedTabColumns:\n      ({ tabs, selectedTabIndex, onTabsChange }) =>\n      (columns) => {\n        onTabsChange(updateTabAt(tabs, selectedTabIndex, { columns }));\n      },\n    updateSelectedTabLayout:\n      ({ tabs, selectedTabIndex, onTabsChange }) =>\n      (layout) => {\n        onTabsChange(updateTabAt(tabs, selectedTabIndex, { layout }));\n      },\n    removeSelectedTab:\n      ({ tabs, selectedTabIndex, onTabsChange }) =>\n      (e) => {\n        e.preventDefault();\n        onTabsChange([\n          ...tabs.slice(0, selectedTabIndex),\n          ...tabs.slice(selectedTabIndex + 1),\n        ]);\n      },\n  }),\n  setDisplayName(\"TabConfigurator\"),\n)(\n  ({\n    tabs,\n    selectedTab,\n    selectTabIndex,\n    addTab,\n    updateSelectedTabName,\n    removeSelectedTab,\n    properties,\n    sourceProperties,\n    updateSelectedTabColumns,\n    updateSelectedTabLayout,\n    enableColumns,\n  }) => (\n    <div>\n      <div className=\"border-box p-3 mt-4\">\n        <ul className=\"nav nav-tabs mb-4\">\n          {tabs.map((tab, i) => (\n            <li key={i} className={classnames({ active: selectedTab === tab })}>\n              <a\n                href=\"#\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  selectTabIndex(i);\n                }}\n              >\n                {tab.name}\n              </a>\n            </li>\n          ))}\n          <li>\n            <a href=\"#\" onClick={addTab}>\n              + Tab\n            </a>\n          </li>\n        </ul>\n\n        {selectedTab ? (\n          <div className=\"flex flex-col gap-4 divide-y divide-neutral\">\n            <div className=\"form-horizontal\">\n              <div className=\"control-group required\">\n                <label className=\"control-label\">\n                  {I18n.t(\n                    \"js.administration.app_creator.app.item_layout.tabs.tab_name\",\n                  )}\n                  <abbr title={I18n.t(\"js.required\")}>*</abbr>\n                </label>\n                <div className=\"controls\">\n                  <input\n                    type=\"text\"\n                    value={selectedTab.name}\n                    onChange={updateSelectedTabName}\n                  />\n                  {tabs.length > 1 ? (\n                    <span>\n                      &nbsp;\n                      <a href=\"#\" onClick={removeSelectedTab}>\n                        Tab entfernen\n                      </a>\n                    </span>\n                  ) : null}\n                </div>\n              </div>\n            </div>\n\n            {enableColumns ? (\n              <div>\n                <LayoutSelect\n                  layout={selectedTab.layout}\n                  onLayoutChange={updateSelectedTabLayout}\n                />\n              </div>\n            ) : null}\n\n            <ColumnConfigurator\n              properties={properties}\n              sourceProperties={sourceProperties}\n              columns={selectedTab.columns}\n              layout={selectedTab.layout}\n              onColumnsUpdate={updateSelectedTabColumns}\n            />\n          </div>\n        ) : null}\n      </div>\n    </div>\n  ),\n);\n\nconst tabShape = PropTypes.shape({\n  name: PropTypes.string.isRequired,\n  layout: PropTypes.string.isRequired,\n});\n\nTabConfigurator.propTypes = {\n  tabs: PropTypes.arrayOf(tabShape).isRequired,\n  onTabsChange: PropTypes.func.isRequired,\n  properties: PropTypes.array.isRequired,\n};\n\nexport default TabConfigurator;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { compose, withContext } from \"recompose\";\nimport LayoutToggle from \"./LayoutToggle\";\nimport TabConfigurator from \"./TabConfigurator\";\n\nfunction ItemLayoutEditor({\n  type,\n  onTypeChange,\n  tabs,\n  onTabsChange,\n  properties,\n}) {\n  return (\n    <div>\n      <LayoutToggle type={type} onTypeChange={onTypeChange} />\n      {type === \"custom\" ? (\n        <TabConfigurator\n          tabs={tabs}\n          onTabsChange={onTabsChange}\n          properties={properties}\n        />\n      ) : null}\n    </div>\n  );\n}\n\nItemLayoutEditor.propTypes = {\n  ...LayoutToggle.propTypes,\n  ...TabConfigurator.propTypes,\n};\n\nconst contextTypes = {\n  enableInheritance: PropTypes.bool,\n  enableColumns: PropTypes.bool,\n  enableLabelHiding: PropTypes.bool,\n  exclusivePropertyUsage: PropTypes.bool,\n};\n\nconst ItemDetailLayoutEditor = compose(\n  withContext(contextTypes, () => ({\n    enableInheritance: false,\n    enableColumns: true,\n    enableLabelHiding: true,\n    exclusivePropertyUsage: false,\n  })),\n)(ItemLayoutEditor);\n\nconst ItemEditLayoutEditor = compose(\n  withContext(contextTypes, () => ({\n    enableInheritance: true,\n    enableColumns: false,\n    enableLabelHiding: false,\n    exclusivePropertyUsage: true,\n  })),\n)(ItemLayoutEditor);\n\nexport default ItemLayoutEditor;\nexport { ItemDetailLayoutEditor, ItemEditLayoutEditor };\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { isEmpty, map } from \"lodash\";\n\nfunction PropertiesReference({ properties, additional_fields }) {\n  return (\n    <div className=\"props-reference\">\n      {isEmpty(properties) ? (\n        <p className=\"text-info\">\n          {I18n.t(\"js.administration.app_creator.app.no_fields_present\")}\n        </p>\n      ) : (\n        <>\n          <label className=\"font-medium\">\n            {I18n.t(\"js.administration.app_creator.app.available_fields\")}\n          </label>\n          <div className=\"border-box p-3 prose\">\n            {isEmpty(additional_fields) ? null : (\n              <ul>\n                {map(additional_fields, (field) => (\n                  <li key={field} className=\"m-0 p-0\">\n                    {field}\n                  </li>\n                ))}\n              </ul>\n            )}\n            <ul>\n              {map(properties, (prop) =>\n                !isEmpty(prop.name) && prop.type !== \"image\" ? (\n                  <li\n                    key={prop.name}\n                    className={`ref-${prop.type} m-0 p-0`}\n                  >{`${prop.name} [${prop.type}]`}</li>\n                ) : null,\n              )}\n            </ul>\n          </div>\n        </>\n      )}\n    </div>\n  );\n}\nPropertiesReference.propTypes = {\n  properties: PropTypes.arrayOf(\n    PropTypes.shape({\n      name: PropTypes.string,\n      label: PropTypes.string,\n      type: PropTypes.string,\n    }),\n  ),\n  additional_fields: PropTypes.arrayOf(PropTypes.string),\n};\n\nexport default PropertiesReference;\n","import PropTypes from \"prop-types\";\nimport React, { useEffect, useState } from \"react\";\n\nimport PropertiesReference from \"./PropertiesReference\";\n\nconst ADDITIONAL_PROPERTIES = [\n  \"created_at\",\n  \"updated_at\",\n  \"author\",\n  \"last_author\",\n];\n\nfunction ActivityIntegration({ properties, activity }) {\n  const [teaserTemplate, setTeaserTemplate] = useState(\n    activity.teaser_template,\n  );\n\n  useEffect(\n    () => setTeaserTemplate(activity.teaser_template),\n    [activity.teaser_template],\n  );\n\n  return (\n    <div className=\"mt-6\">\n      <h4>\n        {I18n.t(\n          \"js.administration.app_creator.app.integrations.item_preview_in_stream.header\",\n        )}\n      </h4>\n      <p className=\"max-w-prose\">\n        {I18n.t(\n          \"js.administration.app_creator.app.integrations.item_preview_in_stream.description\",\n        )}\n      </p>\n      <div className=\"grid grid-cols-4 gap-4 mt-4\">\n        <div className=\"col-span-3\">\n          <label\n            htmlFor=\"app-integration-activity-body\"\n            className=\"font-medium\"\n          >\n            {I18n.t(\n              \"js.administration.app_creator.app.integrations.item_preview_in_stream.label\",\n            )}\n          </label>\n          <textarea\n            className=\"span12\"\n            id=\"app-integration-activity-body\"\n            rows={10}\n            value={teaserTemplate}\n            onChange={(e) => {\n              e.preventDefault();\n              setTeaserTemplate(e.target.value);\n\n              activity.onActivityTeaserChange(e.target.value);\n            }}\n          ></textarea>\n          <p\n            className=\"help-block prose\"\n            dangerouslySetInnerHTML={{\n              __html: I18n.t(\n                \"js.administration.app_creator.app.overview.list.example\",\n                {\n                  example_var1: \"%{category}\",\n                  example_var2: \"%{date}\",\n                },\n              ),\n            }}\n          ></p>\n        </div>\n        <PropertiesReference\n          properties={properties}\n          additional_fields={ADDITIONAL_PROPERTIES}\n        />\n      </div>\n    </div>\n  );\n}\nActivityIntegration.propTypes = {\n  properties: PropertiesReference.propTypes.properties,\n  activity: PropTypes.shape({\n    teaser_template: PropTypes.string,\n    onActivityTeaserChange: PropTypes.func,\n  }),\n};\n\nexport default ActivityIntegration;\n","import PropTypes from \"prop-types\";\nimport React, { useState } from \"react\";\nimport { map } from \"lodash\";\n\nimport PropertiesReference from \"./PropertiesReference\";\n\nfunction SingleEmailIntegration({\n  properties,\n  integration,\n  onChange,\n  onRemove,\n}) {\n  const [subject, setSubject] = useState(integration.email_subject_template);\n  const [text, setText] = useState(integration.email_text_template);\n\n  return (\n    <div className=\"mt-4 border-box p-3\">\n      <div className=\"flex justify-end mb-2\">\n        <a\n          href=\"#\"\n          className=\"btn btn-danger btn-sm\"\n          onClick={(e) => {\n            e.preventDefault();\n            onRemove();\n          }}\n        >\n          <i className=\"fa-regular fa-trash mr-1\" />\n          {I18n.t(\n            \"js.administration.app_creator.app.integrations.email_notifications.delete_integration\",\n          )}\n        </a>\n      </div>\n      <div className=\"row-fluid\">\n        <div className=\"span12 form-horizontal\">\n          <div className=\"control-group\">\n            <label\n              htmlFor=\"app-integration-item-owner-property\"\n              className=\"control-label\"\n            >\n              {I18n.t(\n                \"js.administration.app_creator.app.integrations.email_notifications.assignee_property\",\n              )}\n            </label>\n            <div className=\"controls\">\n              <select\n                className=\"span12\"\n                value={integration.assignee_property_id}\n                onChange={(e) => {\n                  e.preventDefault();\n                  onChange({\n                    ...integration,\n                    assignee_property_id: e.target.value,\n                  });\n                }}\n              >\n                <option value={-1}>\n                  {I18n.t(\n                    \"js.administration.app_creator.app.relation.no_selection\",\n                  )}\n                </option>\n                {map(properties, (prop) =>\n                  prop.type === \"membership\" ? (\n                    <option key={prop.name} value={prop.name}>\n                      {prop.label}\n                    </option>\n                  ) : null,\n                )}\n              </select>\n            </div>\n          </div>\n\n          <div className=\"control-group\">\n            <label\n              htmlFor=\"app-integration-item-owner-trigger\"\n              className=\"control-label\"\n            >\n              {I18n.t(\n                \"js.administration.app_creator.app.integrations.email_notifications.trigger\",\n              )}\n            </label>\n            <div className=\"controls\">\n              <select\n                className=\"span12\"\n                value={integration.trigger}\n                onChange={(e) => {\n                  e.preventDefault();\n                  onChange({\n                    ...integration,\n                    trigger: e.target.value,\n                  });\n                }}\n              >\n                <option value=\"assign\">\n                  {I18n.t(\n                    \"js.administration.app_creator.app.integrations.email_notifications.trigger_assign\",\n                  )}\n                </option>\n                <option value=\"unassign\">\n                  {I18n.t(\n                    \"js.administration.app_creator.app.integrations.email_notifications.trigger_unassign\",\n                  )}\n                </option>\n              </select>\n            </div>\n          </div>\n\n          <div className=\"control-group\">\n            <label\n              className=\"control-label\"\n              htmlFor=\"app-integration-email-subject\"\n            >\n              {I18n.t(\n                \"js.administration.app_creator.app.integrations.email_notifications.subject\",\n              )}\n            </label>\n            <div className=\"controls\">\n              <input\n                className=\"span12\"\n                id=\"app-integration-email-subject\"\n                type=\"text\"\n                value={subject}\n                onChange={(e) => {\n                  e.preventDefault();\n                  setSubject(e.target.value);\n\n                  onChange({\n                    ...integration,\n                    email_subject_template: e.target.value,\n                  });\n                }}\n              />\n            </div>\n          </div>\n\n          <div className=\"control-group\">\n            <label\n              className=\"control-label\"\n              htmlFor=\"app-integration-email-body\"\n            >\n              {I18n.t(\n                \"js.administration.app_creator.app.integrations.email_notifications.text\",\n              )}\n            </label>\n            <div className=\"controls\">\n              <textarea\n                className=\"span12\"\n                id=\"app-integration-email-body\"\n                rows={5}\n                value={text}\n                onChange={(e) => {\n                  e.preventDefault();\n                  setText(e.target.value);\n\n                  onChange({\n                    ...integration,\n                    email_text_template: e.target.value,\n                  });\n                }}\n              />\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nSingleEmailIntegration.propTypes = {\n  properties: PropertiesReference.propTypes.properties,\n  integration: PropTypes.shape({\n    type: PropTypes.string,\n    trigger: PropTypes.string,\n    assignee_property_id: PropTypes.oneOfType([\n      PropTypes.string,\n      PropTypes.number,\n    ]),\n    email_subject_template: PropTypes.string,\n    email_text_template: PropTypes.string,\n  }),\n  onChange: PropTypes.func,\n  onRemove: PropTypes.func,\n};\n\nexport default SingleEmailIntegration;\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { isEmpty, map } from \"lodash\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport PropertiesReference from \"./PropertiesReference\";\nimport SingleEmailIntegration from \"./SingleEmailIntegration\";\n\nconst ADDITIONAL_PROPERTIES = [\n  \"author\",\n  \"last_author\",\n  \"app_name\",\n  \"actor_name\",\n];\n\nconst EmailIntegration = ({\n  properties,\n  emailIntegrations,\n  onEmailIntegrationsChange,\n}) => {\n  const addIntegration = () => {\n    onEmailIntegrationsChange([\n      ...emailIntegrations,\n      {\n        uuid: uuidv4(),\n        type: \"email_notification\",\n        trigger: \"assign\",\n        assignee_property_id: \"-1\",\n        email_subject_template: \"\",\n        email_text_template: \"\",\n      },\n    ]);\n  };\n\n  const removeIntegration = (index) => {\n    onEmailIntegrationsChange([\n      ...emailIntegrations.slice(0, index),\n      ...emailIntegrations.slice(index + 1),\n    ]);\n  };\n\n  const changeIntegration = (index, integration) => {\n    onEmailIntegrationsChange([\n      ...emailIntegrations.slice(0, index),\n      integration,\n      ...emailIntegrations.slice(index + 1),\n    ]);\n  };\n\n  return (\n    <div className=\"mt-6\">\n      <h4>\n        {I18n.t(\n          \"js.administration.app_creator.app.integrations.email_notifications.title\",\n        )}\n      </h4>\n      <div className=\"grid grid-cols-4 gap-4 mt-4\">\n        <div className=\"col-span-3\">\n          <p className=\"max-w-prose\">\n            {I18n.t(\n              \"js.administration.app_creator.app.integrations.email_notifications.description\",\n            )}\n          </p>\n          <p\n            className=\"help-block\"\n            dangerouslySetInnerHTML={{\n              __html: I18n.t(\n                \"js.administration.app_creator.app.overview.list.example\",\n                {\n                  example_var1: \"%{category}\",\n                  example_var2: \"%{date}\",\n                },\n              ),\n            }}\n          ></p>\n        </div>\n        <PropertiesReference\n          properties={properties}\n          additional_fields={ADDITIONAL_PROPERTIES}\n        />\n      </div>\n      <div className=\"btn-toolbar justify-end mt-4\">\n        <div className=\"btn-group\">\n          <a\n            className=\"btn btn-primary\"\n            href=\"#\"\n            onClick={(e) => {\n              e.preventDefault();\n              addIntegration();\n            }}\n          >\n            <i className=\"fa-regular fa-circle-plus mr-1\" />\n            {I18n.t(\n              \"js.administration.app_creator.app.integrations.email_notifications.add_integration\",\n            )}\n          </a>\n        </div>\n      </div>\n      {map(emailIntegrations, (integration, i) => {\n        // dirty workaround to apply a uuid as key (if not available yet), trick the optimised react rendering\n        if (isEmpty(integration.uuid)) {\n          integration.uuid = uuidv4();\n        }\n\n        return (\n          <SingleEmailIntegration\n            key={integration.uuid}\n            integration={integration}\n            properties={properties}\n            onChange={(updatedIntegration) =>\n              changeIntegration(i, updatedIntegration)\n            }\n            onRemove={() => removeIntegration(i)}\n          />\n        );\n      })}\n    </div>\n  );\n};\nEmailIntegration.propTypes = {\n  properties: PropertiesReference.propTypes.properties,\n  emailIntegrations: PropTypes.arrayOf(\n    SingleEmailIntegration.propTypes.integration,\n  ),\n  onEmailIntegrationsChange: PropTypes.func,\n};\n\nexport default EmailIntegration;\n","import React, { useState } from \"react\";\nimport classnames from \"classnames\";\n\nimport PropertiesReference from \"./PropertiesReference\";\nimport ActivityIntegration from \"./ActivityIntegration\";\nimport EmailIntegration from \"./EmailIntegration\";\n\nfunction IntegrationsEditor({\n  properties,\n  activity,\n  emailIntegrations,\n  onEmailIntegrationsChange,\n}) {\n  const [activeTab, setActiveTab] = useState(\"activity\");\n\n  return (\n    <div className=\"tabbable tabs-right\">\n      <ul className=\"nav nav-tabs\">\n        <li className={classnames({ active: activeTab === \"activity\" })}>\n          <a href=\"#\" onClick={() => setActiveTab(\"activity\")}>\n            {I18n.t(\n              \"js.administration.app_creator.app.integrations.activity.title\",\n            )}\n          </a>\n        </li>\n        <li className={classnames({ active: activeTab === \"email\" })}>\n          <a href=\"#\" onClick={() => setActiveTab(\"email\")}>\n            {I18n.t(\n              \"js.administration.app_creator.app.integrations.email_notifications.title\",\n            )}\n          </a>\n        </li>\n      </ul>\n      <div className=\"tab-content\">\n        <div\n          className={classnames({\n            hidden: activeTab !== \"activity\",\n          })}\n        >\n          <ActivityIntegration properties={properties} activity={activity} />\n        </div>\n        <div className={classnames({ hidden: activeTab !== \"email\" })}>\n          <EmailIntegration\n            properties={properties}\n            emailIntegrations={emailIntegrations}\n            onEmailIntegrationsChange={onEmailIntegrationsChange}\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n\nIntegrationsEditor.propTypes = {\n  properties: PropertiesReference.propTypes.properties,\n  activity: ActivityIntegration.propTypes.activity,\n  emailIntegrations: EmailIntegration.propTypes.emailIntegrations,\n  onEmailIntegrationsChange:\n    EmailIntegration.propTypes.onEmailIntegrationsChange,\n};\n\nexport default IntegrationsEditor;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\n\nfunction AssignedMember({ id, imageId, displayValue }) {\n  return (\n    <a\n      className=\"flex gap-1\"\n      href={`?assignee_id=${id}&assignee_name=${encodeURIComponent(\n        displayValue,\n      )}&image_id=${imageId}`}\n    >\n      <img\n        className=\"card-assignment-profile-image rounded-full\"\n        alt={`${displayValue}`}\n        src={\n          !isEmpty(imageId)\n            ? `/api/storage/images/${imageId}/get/25x25`\n            : Assets[\"profile_25x25.jpg\"]\n        }\n      />\n      {displayValue}\n    </a>\n  );\n}\n\nAssignedMember.propTypes = {\n  id: PropTypes.string,\n  displayValue: PropTypes.string,\n  imageId: PropTypes.string,\n};\n\nexport default AssignedMember;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isArray, map } from \"lodash\";\nimport AssignedMember from \"../details/AssignedMember\";\n\nfunction AssignedMembers({ memberships }) {\n  return (\n    <div className=\"card-footer border-t border-neutral border-dashed pt-2\">\n      <div className=\"card-assignments\">\n        <div className=\"members flex gap-2 flex-wrap\">\n          {isArray(memberships) ? (\n            map(memberships, (membership, index) =>\n              index < 7 ? (\n                <AssignedMember key={membership.id} {...membership} />\n              ) : null,\n            )\n          ) : (\n            <AssignedMember {...memberships} />\n          )}\n          {memberships.length > 7 ? `+${memberships.length - 7}` : null}\n        </div>\n      </div>\n      <div className=\"clearfix\" />\n    </div>\n  );\n}\nAssignedMembers.propTypes = {\n  cardId: PropTypes.string,\n  memberships: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.string,\n      imageId: PropTypes.string,\n    }),\n  ),\n};\n\nexport default AssignedMembers;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map } from \"lodash\";\n\nfunction Tag(tag) {\n  return (\n    <span className=\"tag\">\n      <a className=\"hover:no-underline\" href={`?tag=${tag.name}`}>\n        {tag.name}\n      </a>\n    </span>\n  );\n}\nTag.propTypes = {\n  id: PropTypes.string,\n  name: PropTypes.string,\n};\n\nfunction Tags({ tags }) {\n  return (\n    <div className=\"tags-container flex gap-1 flex-wrap\">\n      {map(tags, (tag) => (\n        <Tag key={tag.id} {...tag} />\n      ))}\n    </div>\n  );\n}\nTags.propTypes = {\n  tags: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.string,\n      name: PropTypes.string,\n    }),\n  ),\n};\n\nexport default Tags;\n","import React, { useRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\n\nimport Tags from \"./Tags\";\n\nexport default function Info({ logo, description, tags, setFilteredByTag }) {\n  const descriptionContainer = useRef(null);\n\n  return (\n    <div className=\"card-info flex flex-col gap-2\">\n      {!isEmpty(logo) ? (\n        <div className=\"logo-container\">\n          <img className=\"logo rounded\" src={`/api/storage${logo.url}/get`} />\n        </div>\n      ) : null}\n      {!isEmpty(description) ? (\n        <div className=\"description-container\">\n          <div\n            ref={descriptionContainer}\n            className=\"description-text line-clamp-3 break-words prose\"\n            dangerouslySetInnerHTML={{\n              __html: Application.markdown(description),\n            }}\n          />\n          {descriptionContainer?.current?.clientHeight > 64 ? (\n            <div className=\"description-overlay\" />\n          ) : null}\n        </div>\n      ) : null}\n      {!isEmpty(tags) ? (\n        <Tags tags={tags} setFilteredByTag={setFilteredByTag} />\n      ) : null}\n    </div>\n  );\n}\nInfo.propTypes = {\n  logo: PropTypes.shape({\n    url: PropTypes.string,\n  }),\n  description: PropTypes.string,\n  setDescriptionContainer: PropTypes.func,\n  setFilteredByTag: PropTypes.func,\n  parseMarkdown: PropTypes.func,\n  descriptionContainer: PropTypes.shape({\n    clientHeight: PropTypes.number,\n  }),\n  tags: PropTypes.arrayOf(\n    PropTypes.shape({\n      name: PropTypes.string,\n      id: PropTypes.string,\n    }),\n  ),\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nfunction FileCounter({ filesCount }) {\n  return (\n    <div className=\"card-files\">\n      <i className=\"fa-regular fa-file file-icon mr-1\" />\n      {filesCount}\n    </div>\n  );\n}\nFileCounter.propTypes = {\n  filesCount: PropTypes.number,\n};\n\nexport default FileCounter;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport moment from \"moment-timezone\";\nimport { isEmpty } from \"lodash\";\nimport preventDefault from \"../../../../helpers/components/preventDefault\";\n\nexport default function Title({\n  title,\n  date,\n  cardId,\n  toggleArchive,\n  isArchive,\n  isUnassigned,\n}) {\n  const [showMenu, setShowMenu] = useState(false);\n\n  function toggleMenu() {\n    setShowMenu(!showMenu);\n  }\n\n  return (\n    <div className=\"card-title flex justify-between\">\n      <div className=\"card-title-wrapper\">\n        <a\n          className=\"title-text font-semibold line-clamp-2\"\n          href={isArchive ? `${cardId}` : `items/${cardId}`}\n        >\n          {title}\n        </a>\n        {date && !isEmpty(date.value) ? (\n          <p>\n            <strong>{date.label}:</strong>{\" \"}\n            {moment(date.value).format(date.format)}\n          </p>\n        ) : null}\n      </div>\n\n      {!isUnassigned ? (\n        <div\n          className=\"card-actions\"\n          onBlur={() => (showMenu ? setTimeout(toggleMenu, 250) : null)}\n        >\n          <a\n            href=\"#\"\n            onClick={preventDefault(toggleMenu)}\n            className=\"dropdown-toggle show-card-details text-muted\"\n          >\n            <i className=\"fa fa-ellipsis-h show-card-details-icon\" />\n          </a>\n          <ul\n            className=\"dropdown-menu pull-right\"\n            style={{ display: showMenu ? \"inherit\" : \"none\" }}\n          >\n            <li>\n              <a href={isArchive ? cardId : `items/${cardId}`}>\n                {I18n.t(\"js.apps.wall.show\")}\n              </a>\n              <a href={isArchive ? `${cardId}/edit` : `items/${cardId}/edit`}>\n                {I18n.t(\"js.apps.wall.edit\")}\n              </a>\n              <a onClick={toggleArchive} href=\"#\">\n                {isArchive\n                  ? I18n.t(\"js.apps.wall.restore\")\n                  : I18n.t(\"js.apps.wall.archive\")}\n              </a>\n            </li>\n          </ul>\n        </div>\n      ) : null}\n    </div>\n  );\n}\nTitle.propTypes = {\n  title: PropTypes.string,\n  date: PropTypes.oneOfType([\n    PropTypes.shape({\n      value: PropTypes.string,\n      label: PropTypes.string,\n      format: PropTypes.string,\n    }),\n    PropTypes.string,\n  ]),\n  cardId: PropTypes.string,\n  toggleMenu: PropTypes.func,\n  onSetShowMenuRef: PropTypes.func,\n  toggleArchive: PropTypes.func,\n  showMenu: PropTypes.bool,\n  isArchive: PropTypes.bool,\n  isUnassigned: PropTypes.bool,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport moment from \"moment\";\n\nfunction ArchiveInfo({ archivedBy, archivedAt }) {\n  return (\n    <div className=\"card-archive-info\">\n      {I18n.t(\"js.apps.wall.archive_info\", {\n        date: moment(archivedAt).format(\"DD. MMMM YYYY\"),\n        time: moment(archivedAt).format(\"hh:mm\"),\n        person_name: archivedBy,\n      })}\n    </div>\n  );\n}\nArchiveInfo.propTypes = {\n  archivedBy: PropTypes.string,\n  archivedAt: PropTypes.string,\n};\nexport default ArchiveInfo;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { compose, withState, withHandlers, withProps } from \"recompose\";\nimport classNames from \"classnames\";\nimport { isEmpty, isArray } from \"lodash\";\nimport { DragSource, DropTarget } from \"react-dnd\";\nimport AssignedMembers from \"./details/AssignedMembers\";\nimport Info from \"./details/Info\";\nimport FileCounter from \"./details/FileCounter\";\nimport Title from \"./details/Title\";\nimport ArchiveInfo from \"./details/ArchiveInfo\";\nimport { archiveItem, unarchiveItem } from \"../../../actions/appCreator\";\n\nconst cardSource = {\n  canDrag(props) {\n    console.log(\"CAN MOVE\", props.canMoveCard);\n    return props.canMoveCard;\n  },\n  beginDrag(props) {\n    props.setCardHeight(props.cardRef.clientHeight);\n    return {\n      cardId: props.cardId,\n    };\n  },\n  endDrag(props, monitor) {\n    if (monitor.didDrop()) {\n      const result = monitor.getDropResult();\n      props.onMoveCard({\n        cardId: props.cardId,\n        fieldName: result.fieldName,\n        targetColumn: result.column,\n        insertAfterCardId: result.insertAfterCardId,\n      });\n    }\n  },\n};\n\nconst cardTarget = {\n  hover(props) {\n    props.setHoveredCardId && props.setHoveredCardId(props.cardId);\n  },\n};\n\nconst Card = compose(\n  DragSource(\"card\", cardSource, (connect, monitor) => ({\n    connectDragSource: connect.dragSource(),\n    isDragging: monitor.isDragging(),\n  })),\n  DropTarget(\"card\", cardTarget, (connect, monitor) => ({\n    connectDropTarget: connect.dropTarget(),\n    isOver: monitor.isOver(),\n    canDrop: monitor.canDrop(),\n  })),\n)(({\n  title,\n  description,\n  date,\n  tags,\n  logo,\n  connectDragSource,\n  isDragging,\n  connectDropTarget,\n  isOver,\n  cardId,\n  filesCount,\n  memberships,\n  onSetCardRef,\n  cardHeight,\n  archiveItem,\n  isArchive,\n  unarchiveItem,\n  archivedBy,\n  archivedAt,\n  setFilteredByTag,\n  setFilteredByMember,\n  isUnassigned,\n}) => {\n  return connectDragSource(\n    connectDropTarget(\n      <div>\n        <div\n          className={classNames(\"border-box p-3 hover:cursor-move\", {\n            [\"opacity-25\"]: isDragging,\n            [\"w-40\"]: isUnassigned,\n          })}\n        >\n          <div ref={onSetCardRef} className=\"card flex flex-col gap-2\">\n            <Title\n              toggleArchive={isArchive ? unarchiveItem : archiveItem}\n              isArchive={isArchive}\n              title={title}\n              date={date}\n              cardId={cardId}\n              isUnassigned={isUnassigned}\n            />\n            <div\n              className={classNames(\"flex flex-col gap-2\", {\n                hidden: isUnassigned,\n              })}\n            >\n              <Info\n                logo={logo}\n                description={description}\n                tags={tags}\n                setFilteredByTag={setFilteredByTag}\n                setFilteredByMember={setFilteredByMember}\n              />\n              {filesCount > 0 ? <FileCounter filesCount={filesCount} /> : null}\n              {!isEmpty(memberships) ? (\n                <AssignedMembers memberships={memberships} />\n              ) : null}\n              {isArchive ? (\n                <ArchiveInfo archivedBy={archivedBy} archivedAt={archivedAt} />\n              ) : null}\n            </div>\n          </div>\n        </div>\n        {isOver && !isDragging ? (\n          <div\n            className=\"new-position bg-neutral rounded mt-2\"\n            style={{ height: cardHeight }}\n          />\n        ) : null}\n      </div>,\n    ),\n  );\n});\nCard.propTypes = {\n  title: PropTypes.string,\n  filesCount: PropTypes.number,\n  memberships: PropTypes.oneOfType([\n    PropTypes.arrayOf(\n      PropTypes.shape({ id: PropTypes.string, displayValue: PropTypes.string }),\n    ),\n    PropTypes.shape({ id: PropTypes.string, displayValue: PropTypes.string }),\n  ]),\n  description: PropTypes.string,\n  date: PropTypes.oneOfType([\n    PropTypes.shape({\n      value: PropTypes.string,\n      label: PropTypes.string,\n      format: PropTypes.string,\n    }),\n    PropTypes.string,\n  ]),\n  tags: PropTypes.arrayOf(\n    PropTypes.shape({\n      name: PropTypes.string,\n      id: PropTypes.string,\n    }),\n  ),\n  logo: PropTypes.shape({\n    url: PropTypes.string,\n  }),\n  setCard: PropTypes.func,\n  onMoveCard: PropTypes.func,\n  setHoveredCardId: PropTypes.func,\n  onSetCardRef: PropTypes.func,\n  setCardHeight: PropTypes.func,\n  archiveItem: PropTypes.func,\n  unarchiveItem: PropTypes.func,\n  setFilteredByTag: PropTypes.func,\n  setFilteredByMember: PropTypes.func,\n  cardId: PropTypes.string,\n  appId: PropTypes.string,\n  cardHeight: PropTypes.number,\n  isArchive: PropTypes.bool,\n  archivedBy: PropTypes.string,\n  archivedAt: PropTypes.string,\n  column: PropTypes.string,\n  isUnassigned: PropTypes.bool,\n  canMoveCard: PropTypes.bool,\n};\n\nexport default compose(\n  connect(null, (dispatch, { appId, cardId, column }) => ({\n    archiveItem: () => dispatch(archiveItem({ appId, itemId: cardId, column })),\n    unarchiveItem: () => dispatch(unarchiveItem({ appId, itemId: cardId })),\n  })),\n  withProps(({ logo }) => ({\n    logo: isArray(logo) ? logo[0] : logo,\n  })),\n  withState(\"cardRef\", \"setCardRef\", null),\n  withHandlers({\n    onSetCardRef:\n      ({ setCardRef }) =>\n      (ref) => {\n        setCardRef(ref);\n      },\n  }),\n)(Card);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { compose, withState, withHandlers, lifecycle } from \"recompose\";\nimport { DropTarget } from \"react-dnd\";\nimport { map, isEmpty, get } from \"lodash\";\n\nimport Card from \"./Card\";\n\nconst columnTitleTarget = {\n  hover(props) {\n    props.setIsOverColumnTitle(true);\n    props.setHoveredCardId(null);\n  },\n  drop(props) {\n    props.setIsOverColumnTitle(false);\n    return {\n      column: props.value,\n      fieldName: props.columnField.name,\n      insertAfterCardId: null,\n    };\n  },\n};\n\nconst ColumnTitle = compose(\n  DropTarget(\"card\", columnTitleTarget, (connect, monitor) => ({\n    connectDropTarget: connect.dropTarget(),\n    isOver: monitor.isOver(),\n  })),\n  withHandlers({\n    changeIsOver:\n      ({ setIsOverColumnTitle }) =>\n      () =>\n        setIsOverColumnTitle(false),\n  }),\n  lifecycle({\n    UNSAFE_componentWillReceiveProps(nextProps) {\n      if (nextProps.isOver !== this.props.isOver && !nextProps.isOver) {\n        this.props.changeIsOver(false);\n      }\n    },\n  }),\n)(({ title, connectDropTarget }) =>\n  connectDropTarget(<h5 className=\"title flex justify-center\">{title}</h5>),\n);\nColumnTitle.propTypes = {\n  title: PropTypes.string,\n};\n\nconst columnTarget = {\n  hover(props) {\n    props.setHoveredCardId(null);\n  },\n  drop(props) {\n    return {\n      column: props.value,\n      fieldName: props.columnField.name,\n      insertAfterCardId: props.hoveredCardId,\n    };\n  },\n};\n\nconst Column = compose(\n  DropTarget(\"card\", columnTarget, (connect, monitor) => ({\n    connectDropTarget: connect.dropTarget(),\n    isOver: monitor.isOver(),\n  })),\n  withState(\"currentCard\", \"setCurrentCard\", {}),\n  withState(\"isOverColumnTitle\", \"setIsOverColumnTitle\", false),\n)((props) => {\n  return !isEmpty(props.value)\n    ? props.connectDropTarget(\n        <div\n          className={`column flex flex-col gap-2 p-3 overflow-y-auto h-screen w-80 bg-gray-100`}\n        >\n          <ColumnTitle\n            title={props.label}\n            setIsOverColumnTitle={props.setIsOverColumnTitle}\n            columnField={props.columnField}\n            setHoveredCardId={props.setHoveredCardId}\n          />\n          <div className=\"cards\">\n            <div className=\"cards-container flex flex-col gap-2\">\n              {props.isOverColumnTitle ? (\n                <div\n                  className=\"new-position rounded bg-neutral\"\n                  style={{ height: props.cardHeight }}\n                />\n              ) : null}\n              {map(props.cards, (card) => (\n                <Card\n                  key={card.id}\n                  title={\n                    !isEmpty(props.cardTitleField)\n                      ? get(card, [\"values\", props.cardTitleField.name])\n                      : null\n                  }\n                  filesCount={\n                    !isEmpty(props.cardFileField)\n                      ? get(card, [\n                          \"values\",\n                          props.cardFileField.name,\n                          \"length\",\n                        ])\n                      : 0\n                  }\n                  memberships={\n                    !isEmpty(props.cardMembershipField)\n                      ? get(card, [\"values\", props.cardMembershipField.name])\n                      : []\n                  }\n                  description={\n                    !isEmpty(props.cardDescriptionField)\n                      ? get(card, [\"values\", props.cardDescriptionField.name])\n                      : \"\"\n                  }\n                  date={\n                    props.cardDateField\n                      ? {\n                          value: get(card, [\n                            \"values\",\n                            props.cardDateField.name,\n                          ]),\n                          format: props.cardDateField.format,\n                          label: props.cardDateField.label,\n                        }\n                      : null\n                  }\n                  tags={\n                    !isEmpty(props.cardTagField)\n                      ? get(card, [\"values\", props.cardTagField.name])\n                      : []\n                  }\n                  logo={\n                    !isEmpty(props.cardLogoField)\n                      ? get(card, [\"values\", props.cardLogoField.name])\n                      : null\n                  }\n                  setCard={() => props.setCurrentCard(card)}\n                  onMoveCard={props.onMoveCard}\n                  cardId={card.id}\n                  column={props.value}\n                  fieldName={props.columnField.name}\n                  setHoveredCardId={props.setHoveredCardId}\n                  setCardHeight={props.setCardHeight}\n                  cardHeight={props.cardHeight}\n                  appId={props.appId}\n                  isArchive={props.isArchive}\n                  setFilteredByTag={props.setFilteredByTag}\n                  setFilteredByMember={props.setFilteredByMember}\n                  archivedBy={\n                    !isEmpty(card.archived_by)\n                      ? card.archived_by.displayValue\n                      : null\n                  }\n                  archivedAt={\n                    !isEmpty(card.archived_at) ? card.archived_at : null\n                  }\n                  canMoveCard={\n                    get(card, \"can.update\") &&\n                    get(props.columnField, \"can.update\")\n                  }\n                />\n              ))}\n              {props.hasMoreItems ? (\n                <div className=\"more-items-link\" onClick={props.loadMoreItems}>\n                  {I18n.t(\"js.apps.wall.show_more_items\")}{\" \"}\n                  <i className=\"fa fa-chevron-down\" />\n                </div>\n              ) : null}\n              {props.totalArchivedItems > 0 ? (\n                <a href={`${props.appUrl}/items/archive`}>{`${I18n.t(\n                  \"js.apps.wall.archived_cards\",\n                )}: ${props.totalArchivedItems}`}</a>\n              ) : null}\n            </div>\n          </div>\n        </div>,\n      )\n    : null;\n});\nColumn.propTypes = {\n  cardTitleField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardDescriptionField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardLogoField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  columnField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  onMoveCard: PropTypes.func,\n  cardFileField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardMembershipField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardTagField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  hasMoreItems: PropTypes.bool,\n  cards: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.string,\n      attributes: PropTypes.shape({}),\n    }),\n  ),\n  connectDropTarget: PropTypes.func,\n  setCurrentCard: PropTypes.func,\n  parseMarkdown: PropTypes.func,\n  loadMoreItems: PropTypes.func,\n  setHoveredCardId: PropTypes.func.isRequired,\n  setCardHeight: PropTypes.func,\n  setFilteredByTag: PropTypes.func,\n  setFilteredByMember: PropTypes.func,\n  cardHeight: PropTypes.number,\n  label: PropTypes.string,\n  value: PropTypes.string,\n  hoveredCardId: PropTypes.string,\n  loadMoreUrl: PropTypes.string,\n  appId: PropTypes.string,\n  isLast: PropTypes.bool,\n  isArchive: PropTypes.bool,\n  cardDateField: PropTypes.shape([\n    {\n      format: PropTypes.string,\n      label: PropTypes.string,\n    },\n    PropTypes.string,\n  ]),\n  totalArchivedItems: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  appUrl: PropTypes.string,\n};\n\nexport default compose(withState(\"hoveredCardId\", \"setHoveredCardId\", null))(\n  Column,\n);\n","import React, { useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport GenericErrorBoundary from \"components/shared/GenericErrorBoundary\";\nimport { restoreVisibility, restoreStaticChat } from \"layout/togglebar\";\n\nfunction createPortalComponent(\n  rootId: string,\n  callback?: (el: HTMLElement) => void,\n) {\n  return function ({ children }) {\n    const elemRef = useRef<HTMLElement | null>(null);\n\n    useEffect(() => {\n      function callCallback() {\n        if (callback && elemRef.current) callback(elemRef.current);\n      }\n\n      document.addEventListener(\"turbo:render\", callCallback);\n      callCallback();\n\n      return () => {\n        document.removeEventListener(\"turbo:render\", callCallback);\n      };\n    }, [callback, elemRef]);\n\n    if (!elemRef.current) {\n      elemRef.current = document.getElementById(rootId);\n      while (elemRef.current?.firstChild)\n        elemRef.current.removeChild(elemRef.current.firstChild);\n    }\n\n    if (!elemRef.current) return null;\n\n    return createPortal(\n      <GenericErrorBoundary>{children || null}</GenericErrorBoundary>,\n      elemRef.current,\n    );\n  };\n}\n\nconst HeaderPortal = createPortalComponent(\"header-root\");\nconst WallViewFilterPortal = createPortalComponent(\"wallview-filter-root\");\n\nconst UserbarPortal = createPortalComponent(\"userbar-root\");\nconst ChatbarPortal = createPortalComponent(\"chatbar-root\", (el) => {\n  restoreVisibility(\"chatbar\", el);\n  restoreStaticChat();\n});\nconst ContentPortal = createPortalComponent(\"spa-root\");\nconst GroupNavigationPortal = createPortalComponent(\"group-navigation-root\");\nconst PageTitlePortal = createPortalComponent(\"legacy-page-title-root\");\n\nexport {\n  HeaderPortal,\n  UserbarPortal,\n  ChatbarPortal,\n  ContentPortal,\n  GroupNavigationPortal,\n  PageTitlePortal,\n  WallViewFilterPortal,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { useQueryParams } from \"../../../helpers/useQueryParams\";\nimport AssignedMember from \"./details/AssignedMember\";\nimport { WallViewFilterPortal } from \"../../layout/portals\";\n\nfunction HeaderButtons({ url, type }) {\n  const queryParams = useQueryParams();\n  return (\n    <>\n      {type == \"archive\" ? (\n        <div className=\"btn-toolbar\">\n          <a className=\"btn btn-light \" href={`${url}/items`}>\n            <i className=\"fa fa-arrow-left text-primary\" />\n          </a>\n        </div>\n      ) : (\n        <WallViewFilterPortal>\n          <a className=\"\" href={`${url}/items`}>\n            <div className=\"flex gap-1 items-center\">\n              <FontAwesomeIcon icon={regular(\"filter-circle-xmark\")} />\n\n              {\"tag\" in queryParams && (\n                <span className=\"tag\">\n                  <a className=\"hover:no-underline\">{queryParams.tag}</a>{\" \"}\n                </span>\n              )}\n\n              {\"assignee_id\" in queryParams && (\n                <AssignedMember\n                  key={queryParams.assignee_id}\n                  displayValue={queryParams.assignee_name}\n                  imageId={queryParams.image_id}\n                />\n              )}\n            </div>\n          </a>\n        </WallViewFilterPortal>\n      )}\n    </>\n  );\n}\n\nHeaderButtons.propTypes = {\n  url: PropTypes.string,\n  type: PropTypes.string,\n};\n\nexport default HeaderButtons;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\n\nfunction AppStage({ logoId, description }) {\n  return (\n    <div className=\"wall-view-stage intro flex flex-wrap sm:flex-nowrap gap-4 mb-4\">\n      {!isEmpty(logoId) ? (\n        <img\n          className=\"wall-view-app-logo\"\n          src={`/api/storage/images/${logoId}/get/200x200`}\n        />\n      ) : null}\n      <div\n        className=\"wall-view-stage-description\"\n        dangerouslySetInnerHTML={{\n          __html: Application.markdown(description),\n        }}\n      />\n      <div className=\"clearfix\" />\n    </div>\n  );\n}\n\nAppStage.propTypes = {\n  logoId: PropTypes.string,\n  description: PropTypes.string,\n};\n\nexport default AppStage;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, get } from \"lodash\";\n\nimport Card from \"./Card\";\n\nexport default function UnassignedItems({\n  cardProps,\n  items,\n  titlePropName,\n  canUpdateColumn,\n}) {\n  const [showItems, setShowItems] = useState(false);\n\n  function toggleShowItems() {\n    setShowItems(!showItems);\n  }\n\n  return (\n    <div className=\"alert alert-warning mt-4\">\n      <div\n        onClick={toggleShowItems}\n        className=\"unassigned-items-title hover:cursor-pointer\"\n      >\n        {items.length === 1\n          ? I18n.t(\"js.apps.wall.unassigned_item.hint\")\n          : I18n.t(\"js.apps.wall.unassigned_items.hint\", {\n              counter: items.length,\n            })}\n        <i\n          className={`show-unassigned-items-icon ml-2 ${\n            showItems\n              ? \"fa-regular fa-chevron-up\"\n              : \"fa-regular fa-chevron-down\"\n          }`}\n        />\n      </div>\n      {showItems ? (\n        <div className=\"unassigned-cards flex gap-2 flex-wrap mt-2\">\n          {map(items, (item) => (\n            <Card\n              key={item.id}\n              cardId={item.id}\n              title={item.values[titlePropName]}\n              isUnassigned={true}\n              {...cardProps}\n              canMoveCard={get(item, \"can.update\") && canUpdateColumn}\n            />\n          ))}\n        </div>\n      ) : null}\n    </div>\n  );\n}\nUnassignedItems.propTypes = {\n  toggleShowItems: PropTypes.func,\n  showItems: PropTypes.bool,\n  cardProps: PropTypes.shape({\n    isArchive: PropTypes.bool,\n    onMoveCard: PropTypes.func,\n    setCardHeight: PropTypes.func,\n    setFilteredByTag: PropTypes.func,\n    setFilteredByMember: PropTypes.func,\n  }),\n  items: PropTypes.array,\n  titlePropName: PropTypes.string,\n  canUpdateColumn: PropTypes.bool,\n};\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport { DragDropContext } from \"react-dnd\";\nimport HTML5Backend from \"react-dnd-html5-backend\";\nimport { compose, withProps, lifecycle, withState } from \"recompose\";\nimport { findIndex, map, compact, isEmpty, find, get } from \"lodash\";\n\nimport Column from \"./wallView/Column\";\nimport HeaderButtons from \"./wallView/HeaderButtons\";\nimport AppStage from \"./wallView/AppStage\";\nimport UnassignedItems from \"./wallView/UnassignedItems\";\nimport {\n  fetchApp,\n  updateItem,\n  fetchItems,\n  loadMoreItemsByColumn,\n  fetchItems as fetchItemsForTag,\n  fetchItems as fetchItemsForMember,\n} from \"actions/appCreator\";\nimport {\n  itemsSelector as itemsForWallSelector,\n  loadMoreUrlsSelector,\n  totalArchivedItemsSelector,\n} from \"selectors/appCreator\";\nimport store from \"store\";\nimport wrapProvider from \"helpers/components/wrapProvider\";\nimport useFullWidthLayout from \"hooks/useFullWidthLayout\";\n\nfunction ItemsWallView({\n  items,\n  app,\n  columnField,\n  cardTitleField,\n  cardDescriptionField,\n  cardDateField,\n  cardLogoField,\n  cardTagField,\n  columns,\n  onMoveCard,\n  cardFileField,\n  cardMembershipField,\n  layoutOptions,\n  loadMoreUrls,\n  loadMoreItems,\n  unassignedItems,\n  setCardHeight,\n  cardHeight,\n  isArchive,\n  appUrl,\n  totalArchivedItems,\n  setFilteredByTag,\n  setFilteredByMember,\n  showsFilteredItems,\n}) {\n  useFullWidthLayout();\n\n  return (\n    <div className=\"column-container\">\n      <div className=\"column-container-header\">\n        {isArchive || showsFilteredItems ? (\n          <HeaderButtons url={appUrl} type={isArchive ? \"archive\" : \"filter\"} />\n        ) : null}\n        {layoutOptions.stage ? (\n          <AppStage\n            logoId={app.logo ? app.logo.id : \"\"}\n            description={app.description}\n          />\n        ) : null}\n        {!isEmpty(unassignedItems) ? (\n          <UnassignedItems\n            cardProps={{\n              isArchive,\n              onMoveCard,\n              setCardHeight,\n              setFilteredByTag,\n              setFilteredByMember,\n            }}\n            titlePropName={cardTitleField.name}\n            items={unassignedItems}\n            canUpdateColumn={get(columnField, \"can.update\")}\n          />\n        ) : null}\n      </div>\n      {isEmpty(columns) ? (\n        <div className=\"alert alert-danger\">\n          {I18n.t(\"js.apps.wall.no_columns.hint\")}\n        </div>\n      ) : (\n        <div className=\"overflow-x-auto\">\n          <div className={`columns flex gap-2 mt-6 w-min`}>\n            {map(columns, (column, index) => {\n              return (\n                <Column\n                  key={index}\n                  isLast={columns.length - 1 === index}\n                  cardTitleField={cardTitleField}\n                  cardDescriptionField={cardDescriptionField}\n                  cardDateField={cardDateField}\n                  cardLogoField={cardLogoField}\n                  columnField={columnField}\n                  onMoveCard={onMoveCard}\n                  cardFileField={cardFileField}\n                  cardMembershipField={cardMembershipField}\n                  cardTagField={cardTagField}\n                  setCardHeight={setCardHeight}\n                  cardHeight={cardHeight}\n                  appId={app.id}\n                  appUrl={appUrl}\n                  isArchive={isArchive}\n                  setFilteredByTag={setFilteredByTag}\n                  setFilteredByMember={setFilteredByMember}\n                  canUpdateColumn={get(app, \"properties\")}\n                  hasMoreItems={!isEmpty(loadMoreUrls[column.value])}\n                  loadMoreItems={() =>\n                    loadMoreItems({ url: loadMoreUrls[column.value] })\n                  }\n                  totalArchivedItems={\n                    totalArchivedItems ? totalArchivedItems[column.value] : \"0\"\n                  }\n                  cards={compact(\n                    map(items, (item) =>\n                      get(item, [\"values\", columnField.name, 0]) ===\n                      column.value\n                        ? item\n                        : null,\n                    ),\n                  )}\n                  {...column}\n                />\n              );\n            })}\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n\nItemsWallView.propTypes = {\n  items: PropTypes.arrayOf(PropTypes.shape({})),\n  unassignedItems: PropTypes.arrayOf(PropTypes.shape({})),\n  columnField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardTitleField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardDescriptionField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardDateField: PropTypes.shape({\n    format: PropTypes.string,\n    label: PropTypes.string,\n  }),\n  cardLogoField: PropTypes.shape({\n    url: PropTypes.string,\n  }),\n  cardFileField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardMembershipField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  cardTagField: PropTypes.shape({\n    name: PropTypes.string,\n  }),\n  columns: PropTypes.arrayOf(\n    PropTypes.shape({\n      value: PropTypes.string,\n      label: PropTypes.string,\n    }),\n  ),\n  onMoveCard: PropTypes.func,\n  layoutOptions: PropTypes.shape({\n    stage: PropTypes.bool,\n  }),\n  parseMarkdown: PropTypes.func,\n  loadMoreItems: PropTypes.func,\n  showUnassignedItems: PropTypes.bool,\n  showsFilteredItems: PropTypes.bool,\n  toggleShowUnassignedItems: PropTypes.func,\n  setCardHeight: PropTypes.func,\n  setFilteredByTag: PropTypes.func,\n  setFilteredByMember: PropTypes.func,\n  resetTagFilter: PropTypes.func,\n  filteredByTag: PropTypes.string,\n  cardHeight: PropTypes.number,\n  app: PropTypes.shape({}),\n  isArchive: PropTypes.bool,\n  loadMoreUrls: PropTypes.objectOf(PropTypes.string),\n  appUrl: PropTypes.string,\n  totalArchivedItems: PropTypes.shape({}),\n};\n\nexport default compose(\n  wrapProvider(store),\n  connect(\n    (state) => ({\n      items: itemsForWallSelector(state),\n      loadMoreUrls: loadMoreUrlsSelector(state),\n      totalArchivedItems: totalArchivedItemsSelector(state),\n    }),\n    (dispatch, { app, isArchive }) => ({\n      onMoveCard: ({ cardId, fieldName, targetColumn, insertAfterCardId }) => {\n        dispatch(\n          updateItem({\n            appId: app.id,\n            itemId: cardId,\n            insertAfterCardId,\n            body: {\n              insert_after_id: insertAfterCardId,\n              values: { [fieldName]: [targetColumn] },\n            },\n            optimistic: true,\n          }),\n        );\n      },\n      initApp: () => {\n        dispatch({ type: fetchApp.SUCCESS, payload: app });\n      },\n      fetchItems: () => {\n        if (isArchive) {\n          dispatch(fetchItems({ appId: app.id, view: \"wall\", archived: true }));\n        } else {\n          dispatch(fetchItems({ appId: app.id, view: \"wall\" }));\n        }\n      },\n      fetchItemsForTag: ({ tag }) => {\n        if (isArchive) {\n          dispatch(\n            fetchItemsForTag({\n              appId: app.id,\n              view: \"wall\",\n              archived: true,\n              tag,\n            }),\n          );\n        } else {\n          dispatch(fetchItemsForTag({ appId: app.id, view: \"wall\", tag }));\n        }\n      },\n      fetchItemsForMember: ({ assignee_id }) => {\n        if (isArchive) {\n          dispatch(\n            fetchItemsForMember({\n              appId: app.id,\n              view: \"wall\",\n              archived: true,\n              assignee_id,\n            }),\n          );\n        } else {\n          dispatch(\n            fetchItemsForMember({ appId: app.id, view: \"wall\", assignee_id }),\n          );\n        }\n      },\n      loadMoreItems: ({ url }) => {\n        dispatch(loadMoreItemsByColumn({ url }));\n      },\n    }),\n  ),\n  withState(\"showsFilteredItems\", \"setShowsFilteredItems\", false),\n  lifecycle({\n    componentDidMount() {\n      this.props.initApp();\n      if (this.props.tag_filter) {\n        this.props.fetchItemsForTag({ tag: this.props.tag_filter });\n        this.props.setShowsFilteredItems(true);\n      } else if (this.props.member_filter) {\n        this.props.fetchItemsForMember({\n          assignee_id: this.props.member_filter,\n        });\n        this.props.setShowsFilteredItems(true);\n      } else {\n        this.props.fetchItems();\n      }\n    },\n  }),\n  withProps(({ app, items }) => {\n    const layoutOptions = get(app, [\n      \"collection_layout\",\n      \"options\",\n      get(app, [\"collection_layout\", \"layout\"]),\n    ]);\n\n    //@get('collection_layout').options?[@get('collection_layout').layout] || {}\n    const getField = ({ selector = \"type\", value }) =>\n      app.properties[\n        findIndex(app.properties, (p) => get(p, selector) === value)\n      ];\n\n    const cardDescriptionField =\n      app.properties[\n        findIndex(\n          app.properties,\n          (p) =>\n            p.type === \"text\" && p.name !== getField({ value: \"text\" }).name,\n        )\n      ];\n\n    const appColumns = get(\n      find(\n        app.properties,\n        (prop) => prop._id === layoutOptions.column_property,\n      ),\n      \"options\",\n    );\n\n    const unassignedItems = compact(\n      map(items, (item) =>\n        !get(item, [\"values\", layoutOptions.column_property, 0]) ? item : null,\n      ),\n    );\n\n    const props = {\n      columnField: getField({\n        selector: \"name\",\n        value: layoutOptions.column_property,\n      }),\n      cardTitleField: getField({ value: \"text\" }),\n      cardDescriptionField: cardDescriptionField,\n      cardDateField: getField({ value: \"date\" }),\n      cardLogoField: getField({ value: \"image\" }),\n      cardFileField: getField({ value: \"file\" }),\n      cardMembershipField: getField({ value: \"membership\" }),\n      cardTagField: getField({ value: \"tag\" }),\n      columns: appColumns,\n      layoutOptions,\n      unassignedItems,\n    };\n    return { ...props };\n  }),\n  withState(\"cardHeight\", \"setCardHeight\", 0),\n  DragDropContext(HTML5Backend),\n)(ItemsWallView);\n","import {\n  ItemDetailLayoutEditor,\n  ItemEditLayoutEditor,\n} from \"./ItemLayoutEditor\";\nimport IntegrationsEditor from \"./IntegrationsEditor\";\nimport ItemsWallView from \"./ItemsWallView\";\n\nexport default {\n  \"appCreator/ItemDetailLayoutEditor\": ItemDetailLayoutEditor,\n  \"appCreator/ItemEditLayoutEditor\": ItemEditLayoutEditor,\n  \"appCreator/IntegrationsEditor\": IntegrationsEditor,\n  \"appCreator/ItemsWallView\": ItemsWallView,\n};\n","import { get } from \"lodash\";\n\nexport const getNetworkProfileFields = (state) =>\n  get(state, [\"network\", \"profile_fields\"]);\n\nexport const networkIdSelector = (state) => get(state, [\"network\", \"id\"]);\n","import { get } from \"lodash\";\nimport { createSelector } from \"reselect\";\n\nconst widgetbarPath = [\"administration\", \"widgetbar\"];\nconst editWidgetbarPath = [...widgetbarPath, \"edit\"];\n\nexport const getWidgets = (state) =>\n  get(state, [...editWidgetbarPath, \"widgets\"]);\n\nexport const getWidgetbarGroupId = (state) =>\n  get(state, [...editWidgetbarPath, \"groupId\"]);\n\nexport const getWidgetbarSuccessfulSave = (state) =>\n  get(state, [...editWidgetbarPath, \"successfulSave\"]);\n\nexport const getWidgetbarErrors = (state) =>\n  get(state, [...widgetbarPath, \"errors\"]);\n\nexport const getWidgetbarLoadingState = (state) =>\n  get(state, [...widgetbarPath, \"fetchWidgetbar\", \"loading\"]);\n\nexport const getSelectedWidgetIndex = (state) =>\n  get(state, [...editWidgetbarPath, \"selectedWidgetIndex\"]);\n\nexport const getCalendars = (state) =>\n  get(state, [...editWidgetbarPath, \"calendars\"]);\n\nexport const getWidgetbarIdentifier = (state) =>\n  get(state, [...editWidgetbarPath, \"identifier\"]);\n\nexport const getSelectedWidget = createSelector(\n  [getWidgets, getSelectedWidgetIndex],\n  (widgets, index) => widgets[index],\n);\n\nexport const getWidgetbars = (state) =>\n  get(state, [...widgetbarPath, \"index\", \"widgetbars\"]);\n","// extracted by mini-css-extract-plugin\nexport default {\"ModuleselectField\":\"ZEsY5jodl3rKL2esTtW_\"};","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { filter, includes } from \"lodash\";\nimport Select from \"react-select\";\nimport { getNetworkProfileFields } from \"helpers/selectors/networkSelectors\";\nimport { getCalendars } from \"helpers/selectors/widgetbarSelectors\";\nimport { getOptions, scopeSelection } from \"helpers/widgets/widgets\";\nimport styles from \"./MultiselectField.module.css\";\nimport useTooltip from \"hooks/useTooltip\";\n\ninterface MultiselectFieldTypes {\n  name: string;\n  onChange?(...args: unknown[]): unknown;\n  value?: Array<string>;\n  type?: string;\n}\n\nexport default function MultiselectField({\n  name,\n  onChange,\n  value: rawValue,\n  type,\n}: MultiselectFieldTypes) {\n  const rawOptions = {\n    profile_fields: useSelector(getNetworkProfileFields),\n    additional_calendar_ids: useSelector(getCalendars),\n  };\n  const options = getOptions(name, { ...rawOptions, scope: scopeSelection() });\n  const value = filter(options, (option) => includes(rawValue, option.value));\n\n  let labelProps = {};\n\n  const tooltipRef = useTooltip<HTMLDivElement>();\n\n  if (type === \"appointments\" && name === \"scope\") {\n    labelProps = {\n      [\"data-bs-toggle\"]: \"tooltip\",\n      title: I18n.t(`js.administration.widgetbars.${name}.hint`),\n    };\n  }\n\n  return (\n    <div ref={tooltipRef} className={styles.ModuleselectField}>\n      <label htmlFor={`widget-${name}-input`} {...labelProps}>\n        {I18n.t(`js.administration.widgetbars.${name}.label`)}\n      </label>\n      <Select\n        isMulti\n        value={value}\n        options={options}\n        onChange={onChange}\n        placeholder={I18n.t(\n          `js.administration.widgetbars.multiselect.placeholder.${name}`,\n        )}\n        id={`widget-${name}-input`}\n      />\n    </div>\n  );\n}\n","import React from \"react\";\n\ninterface NumberFieldTypes {\n  name: string;\n  onChange?(...args: unknown[]): unknown;\n  value?: string;\n  hint?: string;\n}\n\nfunction NumberField({ name, onChange, value }: NumberFieldTypes) {\n  return (\n    <>\n      <label htmlFor={`widget-${name}-input`}>\n        {I18n.t(`js.administration.widgetbars.${name}.label`)}\n      </label>\n      <input\n        id={`widget-${name}-input`}\n        onChange={onChange}\n        type=\"number\"\n        min={0}\n        defaultValue={value}\n      />\n    </>\n  );\n}\n\nexport default NumberField;\n","import React from \"react\";\nimport map from \"lodash/map\";\nimport { propTypeSelections } from \"helpers/widgets/widgets\";\ninterface RadioFieldTypes {\n  name: string;\n  onChange?(...args: unknown[]): unknown;\n  value?: string;\n  hint?: string;\n}\n\nfunction RadioField({ name, onChange, value }: RadioFieldTypes) {\n  return (\n    <div>\n      <label>{I18n.t(`js.administration.widgetbars.${name}.label`)}</label>\n      {map(propTypeSelections[name], (selection, index) => (\n        <label key={index} className=\"radio\">\n          <input\n            value={selection}\n            type=\"radio\"\n            onChange={onChange}\n            checked={selection === value}\n          />\n          {I18n.t(`js.administration.widgetbars.selections.${selection}`)}\n        </label>\n      ))}\n    </div>\n  );\n}\n\nexport default RadioField;\n","import React from \"react\";\nimport map from \"lodash/map\";\nimport { propTypeSelections } from \"helpers/widgets/widgets\";\n\ninterface SelectFieldTypes {\n  name: string;\n  onChange?(...args: unknown[]): unknown;\n  value?: string;\n}\n\nfunction SelectField({ name, onChange, value }: SelectFieldTypes) {\n  return (\n    <div>\n      <label htmlFor={`widget-${name}-input`}>\n        {I18n.t(`js.administration.widgetbars.${name}.label`)}\n      </label>\n      <select\n        name={name}\n        onChange={onChange}\n        value={value}\n        id={`widget-${name}-input`}\n      >\n        {map(propTypeSelections[name], (option, index) => (\n          <option value={option} key={index}>\n            {I18n.t(`js.administration.widgetbars.selections.${option}`)}\n          </option>\n        ))}\n      </select>\n    </div>\n  );\n}\n\nexport default SelectField;\n","import React from \"react\";\nimport Hint from \"components/shared/fields/Hint\";\n\ninterface TextareaFieldTypes {\n  name: string;\n  onChange?(...args: unknown[]): unknown;\n  value?: string;\n  hint?: string;\n}\n\nfunction TextareaField({ name, onChange, value, hint }: TextareaFieldTypes) {\n  return (\n    <div>\n      <label htmlFor={`widget-${name}-input`}>\n        {I18n.t(`js.administration.widgetbars.${name}.label`)}\n      </label>\n      <textarea\n        id={`widget-${name}-input`}\n        value={value || \"\"}\n        rows={7}\n        onChange={onChange}\n      />\n      <Hint hint={hint} className=\"!mb-0\" />\n    </div>\n  );\n}\n\nexport default TextareaField;\n","import React from \"react\";\nimport Hint from \"components/shared/fields/Hint\";\n\ninterface TextFieldTypes {\n  name: string;\n  onChange?(...args: unknown[]): unknown;\n  value?: string;\n  hint?: string;\n}\n\nfunction TextField({ name, onChange, value, hint }: TextFieldTypes) {\n  return (\n    <div>\n      <label htmlFor={`widget-${name}-input`}>\n        {I18n.t(`js.administration.widgetbars.${name}.label`)}\n      </label>\n      <input\n        id={`widget-${name}-input`}\n        onChange={onChange}\n        type=\"text\"\n        value={value || \"\"}\n        height={5}\n      />\n      <Hint hint={hint} className=\"!mb-0\" />\n    </div>\n  );\n}\n\nexport default TextField;\n","import MultiselectField from \"components/administration/widgetbar/fields/MultiselectField\";\nimport NumberField from \"components/administration/widgetbar/fields/NumberField\";\nimport RadioField from \"components/administration/widgetbar/fields/RadioField\";\nimport SelectField from \"components/administration/widgetbar/fields/SelectField\";\nimport TextareaField from \"components/administration/widgetbar/fields/TextareaField\";\nimport TextField from \"components/administration/widgetbar/fields/TextField\";\nimport AdditionalCalendarsField from \"components/administration/widgetbar/fields/AdditionalCalendarField\";\nimport { changeValue } from \"actions/administration/widgetbar\";\nimport { getWidgetbarGroupId } from \"helpers/selectors/widgetbarSelectors\";\nimport { connect } from \"react-redux\";\nimport { compose, withHandlers } from \"recompose\";\nimport { keys, remove, map, includes, slice, last } from \"lodash\";\n\n// if scope includes the value 'all', then remove all other selections\n// if scope includes 'all' and it is the latest selected value, then this should be the only selection\n// if scope includes 'all' and an other value were selected, then remove 'all' out of the selection\nconst handleMultiselectLogic = (eventOrNewVal, valueChange, name) => {\n  if (includes(eventOrNewVal, \"all\")) {\n    if (last(eventOrNewVal) === \"all\") {\n      valueChange({\n        propertyKey: name,\n        data: [\"all\"],\n      });\n    } else {\n      valueChange({\n        propertyKey: name,\n        data: [...slice(eventOrNewVal, 1)],\n      });\n    }\n  } else {\n    valueChange({\n      propertyKey: name,\n      data: eventOrNewVal,\n    });\n  }\n};\n\nconst withOnChange = compose(\n  connect(\n    (state) => ({\n      groupId: getWidgetbarGroupId(state),\n    }),\n    (dispatch) => ({\n      valueChange: ({ propertyKey, data }) =>\n        dispatch(changeValue(propertyKey, data)),\n    }),\n  ),\n  withHandlers({\n    onChange:\n      ({ valueChange, name }) =>\n      (eventOrNewVal) => {\n        // MultiSelect field doesn't return an event\n        if (eventOrNewVal instanceof Array) {\n          handleMultiselectLogic(\n            map(eventOrNewVal, (hash) => hash.value),\n            valueChange,\n            name,\n          );\n        } else {\n          valueChange({\n            propertyKey: name,\n            data: eventOrNewVal.target.value,\n          });\n        }\n      },\n  }),\n);\n\nexport const PropTypeFields = {\n  headline: withOnChange(TextField),\n  content: withOnChange(TextareaField),\n  renderer: withOnChange(SelectField),\n  profile_fields: withOnChange(MultiselectField),\n  scope: withOnChange(MultiselectField),\n  count: withOnChange(NumberField),\n  show_age: withOnChange(RadioField),\n  sort: withOnChange(RadioField),\n  url: withOnChange(TextField),\n  position: withOnChange(NumberField),\n  additional_calendar_ids: withOnChange(AdditionalCalendarsField),\n};\n\nexport const getOptions = (name, possibleOptions) => {\n  const options = possibleOptions[name];\n\n  switch (name) {\n    case \"profile_fields\":\n      return options.map((o) => ({\n        value: o.name,\n        label: o.label,\n      }));\n    case \"additional_calendar_ids\":\n      return options.map((o) => ({\n        value: o.id,\n        label: o.name,\n      }));\n    case \"scope\":\n      return options.map((o) => ({\n        value: o,\n        label: I18n.t(`js.administration.widgetbars.selections.${o}`),\n      }));\n    default:\n      return [];\n  }\n};\n\nconst checkIfHintShouldShow = (widget, property) => {\n  const MembersHeadline =\n    /(newest|online)_members/.test(widget.type) && property === \"headline\";\n  const GroupInformationText =\n    widget.type === \"group_info\" && property === \"content\";\n\n  return MembersHeadline || GroupInformationText;\n};\n\nexport const generateHint = (widget, property, groupId) => {\n  if (checkIfHintShouldShow(widget, property)) {\n    if (widget.type == \"group_info\") {\n      return I18n.t(\n        `js.administration.widgetbars.hints.${widget.type}.${property}_group`,\n        { percent: \"%\" },\n      );\n    }\n\n    return I18n.t(\n      `js.administration.widgetbars.hints.${widget.type}.${property}_${\n        groupId ? \"group\" : \"network\"\n      }`,\n      { percent: \"%\" },\n    );\n  }\n  return null;\n};\n\nexport const getWidgetName = (slug) => {\n  const prefix = \"js.administration.widgetbars.names.\";\n\n  if (slug === \"as-:slug\") {\n    return I18n.t(prefix + \"default_network\");\n  } else {\n    return I18n.t(prefix + \"default_group\");\n  }\n};\n\nconst widgets = (type) => widgetConfig[type];\n\nexport const widgetTypes = (identifier) => {\n  let types = keys(widgetConfig);\n\n  if (scope(identifier) !== \"group\") {\n    remove(types, (widgetType) => widgetType === \"group_info\");\n  }\n\n  return types;\n};\n\nexport const scopeSelection = () => {\n  return [\"all\", \"personal\", \"additional_calendar_ids\", \"groups\"];\n};\n\n// Returns true if given identifier belongs to widgetbar in group\nexport const scope = (identifier) =>\n  /^g-/.test(identifier) ? \"group\" : \"network\";\n\nexport const propTypeSelections = {\n  renderer: [\"markdown\", \"html_sanitized\"],\n  show_age: [\"true\", \"false\"],\n  sort: [\"asc\", \"desc\"],\n};\n\nconst widgetConfig = {\n  admin_members: {\n    type: \"admin_members\",\n    properties: {\n      headline: \"\",\n      profile_fields: [],\n    },\n  },\n  appointments: {\n    type: \"appointments\",\n    properties: {\n      headline: \"\",\n      scope: [\"personal\"],\n      additional_calendar_ids: [],\n      count: 10,\n    },\n  },\n  birthday: {\n    type: \"birthday\",\n    properties: {\n      headline: \"\",\n      count: 5,\n      show_age: \"false\", // Backend requires boolean. Check submit function where the value type is changed\n      profile_fields: [],\n    },\n  },\n  group_info: {\n    type: \"group_info\",\n    properties: {\n      headline: \"\",\n      content: \"%{profile_image}\" + \"\" + \"## %{group_name}\",\n      renderer: \"markdown\",\n    },\n  },\n  newest_members: {\n    type: \"newest_members\",\n    properties: {\n      headline: \"\",\n      count: 5,\n      profile_fields: [],\n    },\n  },\n  online_members: {\n    type: \"online_members\",\n    properties: {\n      headline: \"\",\n      count: 5,\n      profile_fields: [],\n    },\n  },\n  rss: {\n    type: \"rss\",\n    properties: {\n      headline: \"\",\n      url: null,\n      count: 12,\n    },\n  },\n  speed_dial: {\n    type: \"speed_dial\",\n    properties: {\n      headline: \"\",\n      count: 15,\n      profile_fields: [],\n    },\n  },\n  text: {\n    type: \"text\",\n    properties: {\n      headline: \"\",\n      content: \"\",\n      renderer: \"markdown\",\n    },\n  },\n};\n\nexport default widgets;\n","import React from \"react\";\nimport { getSelectedWidget } from \"helpers/selectors/widgetbarSelectors\";\nimport { useSelector } from \"react-redux\";\nimport { includes } from \"lodash\";\nimport MultiselectField from \"components/administration/widgetbar/fields/MultiselectField\";\n\ninterface AdditionalCalendarsFieldTypes {\n  name: string;\n  onChange?(...args: unknown[]): unknown;\n  value?: Array<string>;\n  hint?: string;\n}\n\nexport default function AdditionalCalendarsField(\n  options: AdditionalCalendarsFieldTypes,\n) {\n  const widget = useSelector(getSelectedWidget) as {\n    properties: { scope: string };\n  };\n\n  if (\n    includes(widget.properties.scope, \"additional_calendar_ids\") ||\n    widget.properties.scope === \"additional_calendar_ids\"\n  ) {\n    return <MultiselectField {...options} />;\n  } else {\n    return null;\n  }\n}\n","import React from \"react\";\nimport { DragSource } from \"react-dnd\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ninterface WidgetTypes {\n  widgetType: string;\n  isDragging?: boolean;\n  isSelected?: boolean;\n  draggable?: boolean;\n\n  onClick?(...args: unknown[]): unknown;\n}\n\nexport function Widget({\n  isDragging,\n  widgetType,\n  onClick,\n  isSelected,\n  draggable,\n}: WidgetTypes) {\n  return (\n    <div\n      className=\"flex items-center break-all cursor-move border-2 rounded-md border-gray-900 p-1 hover:border-primary bg-white inline-block\"\n      style={{ opacity: isDragging || isSelected ? 1 : 0.65 }}\n      onClick={onClick}\n    >\n      {draggable ? (\n        <FontAwesomeIcon\n          className=\"text-primary mr-1 p-1 border-2 rounded-md border-primary\"\n          icon={solid(\"grip-dots\")}\n        />\n      ) : null}\n      <span>{I18n.t(`js.administration.widgetbars.${widgetType}.label`)}</span>\n    </div>\n  );\n}\n\nexport const DraggableWidget = DragSource(\n  \"widget\",\n  {\n    beginDrag({ widget }) {\n      return widget;\n    },\n  } as { beginDrag(arg: unknown): unknown },\n  (connect, monitor) => ({\n    connectDragSource: connect.dragSource(),\n    isDragging: monitor.isDragging(),\n  }),\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n)(({ connectDragSource, ...props }) =>\n  (connectDragSource as CallableFunction)(\n    Widget({ draggable: true, ...props }),\n  ),\n);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport map from \"lodash/map\";\nimport widgets, { widgetTypes } from \"helpers/widgets/widgets\";\nimport { DraggableWidget } from \"components/administration/widgetbar/Widget\";\nimport { getWidgetbarIdentifier } from \"helpers/selectors/widgetbarSelectors\";\n\ninterface WidgetTypesTypes {\n  identifier: string;\n}\n\nfunction WidgetTypes({ identifier }: WidgetTypesTypes) {\n  return (\n    <div className=\"border-box p-3\">\n      <div>\n        <h4>{I18n.t(\"js.administration.widgetbars.types.headline\")}</h4>\n      </div>\n      <div className=\"flex flex-col gap-2 mt-3\">\n        {map(widgetTypes(identifier), (widgetType) => (\n          <DraggableWidget\n            key={widgets(widgetType).type as never}\n            widgetType={widgets(widgetType).type as never}\n            widget={widgets(widgetType) as never}\n          />\n        ))}\n      </div>\n    </div>\n  );\n}\n\nexport default connect((state) => ({\n  identifier: getWidgetbarIdentifier(state),\n}))(WidgetTypes);\n","import React from \"react\";\nimport { compose, setDisplayName, toClass } from \"recompose\";\nimport { DropTarget } from \"react-dnd\";\nimport { connect } from \"react-redux\";\nimport { isEmpty, map } from \"lodash\";\nimport { DraggableWidget } from \"components/administration/widgetbar/Widget\";\nimport {\n  getWidgets,\n  getSelectedWidgetIndex,\n} from \"helpers/selectors/widgetbarSelectors\";\nimport {\n  addOrMoveWidget,\n  selectWidget,\n} from \"actions/administration/widgetbar\";\nimport { Widget } from \"components/administration/widgetbar/Widget\";\n\nconst layoutTarget = {\n  drop({ index, addOrMoveWidget }, monitor) {\n    addOrMoveWidget(monitor.getItem(), index);\n  },\n};\n\nconst WidgetbarDragNDrop = compose(\n  connect(null, (dispatch) => ({\n    selectWidget: (index) => dispatch(selectWidget(index)),\n    addOrMoveWidget: (widget, index) =>\n      dispatch(addOrMoveWidget(widget, index)),\n  })),\n  DropTarget(\"widget\", layoutTarget, (connect, monitor) => ({\n    connectDropTarget: connect.dropTarget(),\n    isOver: monitor.isOver({ shallow: true }),\n    widgetType: monitor.getItem() ? monitor.getItem().type : null,\n  })),\n  toClass,\n  setDisplayName(\"WidgetbarDragNDrop\"),\n)(({ connectDropTarget, isOver, index, children, selectWidget, widgetType }) =>\n  connectDropTarget(\n    <div onClick={() => selectWidget(index)}>\n      {widgetType && isOver ? (\n        <div style={{ opacity: 0.2 }}>\n          <Widget widgetType={widgetType} />\n        </div>\n      ) : null}\n      {children}\n    </div>,\n  ),\n);\n\nexport default compose(\n  connect((state) => ({\n    widgets: getWidgets(state),\n    selectedWidgetIndex: getSelectedWidgetIndex(state),\n  })),\n  setDisplayName(\"WidgetbarLayout\"),\n)(({ widgets, selectedWidgetIndex }) => (\n  <div className=\"border-box p-4\">\n    <div>\n      <h4>{I18n.t(\"js.administration.widgetbars.layout.headline\")}</h4>\n    </div>\n    <div className=\"widgetbar-layout flex flex-col gap-2 mt-3\">\n      {isEmpty(widgets) ? (\n        <WidgetbarDragNDrop index={0}>\n          {I18n.t(\"js.administration.widgetbars.empty_drop_target_hint\")}\n        </WidgetbarDragNDrop>\n      ) : null}\n      {map(widgets, (widget, index) => (\n        <WidgetbarDragNDrop index={index} key={index} widget={widget}>\n          <DraggableWidget\n            widgetType={widget.type}\n            widget={widget}\n            index={index}\n            isSelected={index === selectedWidgetIndex}\n          />\n        </WidgetbarDragNDrop>\n      ))}\n      <WidgetbarDragNDrop index={widgets.length}>\n        <div className=\"drag-n-drop-spacer\">&nbsp;</div>\n      </WidgetbarDragNDrop>\n    </div>\n  </div>\n));\n","import React from \"react\";\nimport { map, mapValues, isEmpty } from \"lodash\";\nimport widgets, { PropTypeFields, generateHint } from \"helpers/widgets/widgets\";\n\nexport interface WidgetPropertiesTypes {\n  widget: {\n    properties: Record<PropertyKey, unknown>;\n    type: string;\n  };\n\n  removeWidget?(...args: unknown[]): unknown;\n\n  groupId?: string;\n}\n\nexport default function WidgetProperties({\n  widget,\n  removeWidget,\n  groupId,\n}: WidgetPropertiesTypes) {\n  const defaultProperties = widgets(widget.type).properties;\n  const properties = mapValues(\n    defaultProperties,\n    (prop, key) => widget.properties[key] || prop,\n  );\n\n  return (\n    <div className=\"flex flex-col gap-2\">\n      <div className=\"control-group\">\n        <input\n          type=\"hidden\"\n          name=\"type\"\n          value={widget.type}\n          key=\"widget-type\"\n        />\n        <strong>\n          Typ: {I18n.t(`js.administration.widgetbars.${widget.type}.label`)}\n        </strong>\n      </div>\n      {map(properties, (value, property) => {\n        const Component = PropTypeFields[property];\n        const hint = generateHint(widget, property, groupId);\n\n        if (isEmpty(Component)) {\n          return;\n        }\n        return (\n          <div className=\"control-group\" key={`${widget.type}-${property}`}>\n            <Component\n              name={property}\n              hint={hint}\n              value={value}\n              type={widget.type}\n            />\n          </div>\n        );\n      })}\n\n      <button\n        type=\"button\"\n        onClick={removeWidget}\n        key=\"remove\"\n        className=\"btn btn-danger mt-4 self-end\"\n      >\n        {I18n.t(\"js.administration.widgetbars.remove\")}\n      </button>\n    </div>\n  );\n}\n","import type { WidgetPropertiesTypes } from \"./WidgetProperties\";\nimport React from \"react\";\nimport WidgetProperties from \"components/administration/widgetbar/WidgetProperties\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n  getSelectedWidget,\n  getWidgetbarGroupId,\n} from \"helpers/selectors/widgetbarSelectors\";\nimport { removeWidget } from \"actions/administration/widgetbar\";\n\nexport default function WidgetPropertiesLayout() {\n  const dispatch = useDispatch();\n  const widget = useSelector(\n    getSelectedWidget,\n  ) as WidgetPropertiesTypes[\"widget\"];\n  const groupId = useSelector(getWidgetbarGroupId) as string;\n\n  return (\n    <div className=\"col-span-2 md:col-span-1 lg:col-span-2 pl-4 pt-4\">\n      <h4>{I18n.t(\"js.administration.widgetbars.properties.headline\")}</h4>\n      {widget ? (\n        <WidgetProperties\n          widget={widget}\n          groupId={groupId}\n          removeWidget={() => dispatch(removeWidget())}\n        />\n      ) : null}\n    </div>\n  );\n}\n","import React from \"react\";\n\nfunction NotFound() {\n  return (\n    <div>\n      <h1 className=\"standalone\">{I18n.t(\"js.errors.error_while_loading\")}</h1>\n      <div className=\"row\">\n        <div className=\"span6\">\n          <h2>{I18n.t(\"js.errors.not_found.title\")}</h2>\n          <p>{I18n.t(\"js.errors.not_found.text\")}</p>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default NotFound;\n","import React from \"react\";\nimport { DragDropContext } from \"react-dnd\";\nimport HTML5Backend from \"react-dnd-html5-backend\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport { compose, withHandlers, lifecycle, toClass } from \"recompose\";\nimport { map } from \"lodash\";\n\nimport preventDefault from \"helpers/components/preventDefault\";\nimport WidgetTypes from \"components/administration/widgetbar/WidgetTypes\";\nimport WidgetbarLayout from \"components/administration/widgetbar/WidgetbarLayout\";\nimport WidgetPropertiesLayout from \"components/administration/widgetbar/WidgetPropertiesLayout\";\nimport NotFound from \"components/shared/errors/NotFound\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport {\n  fetchWidgetbar,\n  fetchCalendars,\n  updateWidgetbar,\n  setGroupId,\n  resetSuccessfulSave,\n  resetErrors,\n  setIdentifier,\n} from \"actions/administration/widgetbar\";\nimport {\n  getWidgets,\n  getWidgetbarLoadingState,\n  getWidgetbarSuccessfulSave,\n  getWidgetbarErrors,\n} from \"helpers/selectors/widgetbarSelectors\";\nimport classnames from \"classnames\";\n\nfunction WidgetbarForm({ onSubmit, loading, errors, groupId }) {\n  if (loading) {\n    return (\n      <div>\n        <i className=\"fa fa-spinner fa-spin\" />\n        {I18n.t(\"js.administration.widgetbars.loading\")}\n      </div>\n    );\n  } else if (errors[\"notFound\"]) {\n    return <NotFound />;\n  } else if (errors[\"fetchWidgetbar\"]) {\n    return <div>{I18n.t(\"js.administration.widgetbars.save_error\")}</div>;\n  } else {\n    return (\n      <form onSubmit={onSubmit} autoComplete=\"off\">\n        <div\n          className={classnames(\"btn-toolbar\", {\n            \"justify-end\": groupId,\n          })}\n        >\n          {groupId ? null : (\n            <div className=\"btn-group\">\n              <a className=\"btn btn-light\" href=\"/administration/widgetbars\">\n                <FontAwesomeIcon\n                  className=\"text-primary\"\n                  icon={solid(\"arrow-left\")}\n                />\n              </a>\n            </div>\n          )}\n          <button type=\"submit\" className=\"btn btn-primary\">\n            {I18n.t(\"js.save\")}\n          </button>\n        </div>\n        <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 mt-4\">\n          <WidgetTypes />\n          <WidgetbarLayout />\n          <WidgetPropertiesLayout />\n        </div>\n      </form>\n    );\n  }\n}\n\nWidgetbarForm.propTypes = {\n  onSubmit: PropTypes.func,\n  loading: PropTypes.bool,\n  errors: PropTypes.object,\n};\n\nexport default compose(\n  connect(\n    (state) => ({\n      widgets: getWidgets(state),\n      loading: getWidgetbarLoadingState(state),\n      saveSuccessful: getWidgetbarSuccessfulSave(state),\n      errors: getWidgetbarErrors(state),\n    }),\n    (dispatch, { groupId, identifier }) => ({\n      fetchWidgetbar: () =>\n        dispatch(\n          fetchWidgetbar({\n            groupId,\n            identifier,\n          }),\n        ),\n      fetchCalendars: () =>\n        dispatch(\n          fetchCalendars({\n            groupId,\n            identifier,\n          }),\n        ),\n      setGroupId: () => dispatch(setGroupId({ groupId })),\n      setIdentifier: () => dispatch(setIdentifier(identifier)),\n      submit: (data) => dispatch(updateWidgetbar(data)),\n      resetSuccessfulSave: () => dispatch(resetSuccessfulSave()),\n      resetErrors: () => dispatch(resetErrors()),\n    }),\n  ),\n  withHandlers({\n    onSubmit: ({ submit, widgets, groupId, identifier }) =>\n      preventDefault(() => {\n        submit({\n          groupId,\n          identifier,\n          body: {\n            widgetbar: {\n              widgets: map(widgets, (w) => {\n                // backend need the string as a boolean\n                if (w.properties.show_age) {\n                  return {\n                    ...w,\n                    properties: {\n                      ...w.properties,\n                      show_age: w.properties.show_age === \"true\",\n                    },\n                  };\n                } else if (w.properties.count) {\n                  return {\n                    ...w,\n                    properties: {\n                      ...w.properties,\n                      count: parseInt(w.properties.count, 10),\n                    },\n                  };\n                }\n                return w;\n              }),\n            },\n          },\n        });\n      }),\n  }),\n  lifecycle({\n    componentDidMount() {\n      this.props.fetchWidgetbar();\n      this.props.setIdentifier();\n      this.props.fetchCalendars();\n      this.props.setGroupId();\n    },\n    UNSAFE_componentWillReceiveProps(nextProps) {\n      if (nextProps.saveSuccessful) {\n        toastr.success(I18n.t(\"js.administration.widgetbars.save_success\"));\n        this.props.resetSuccessfulSave();\n      } else if (nextProps.errors.updateWidgetbar) {\n        toastr.error(I18n.t(\"js.administration.widgetbars.save_error\"));\n        this.props.resetErrors();\n      } else if (nextProps.errors.fetchWidgetbar) {\n        toastr.error(I18n.t(\"js.administration.widgetbars.load_error\"));\n        if (!nextProps.errors.notFound) {\n          this.props.resetErrors();\n        }\n      }\n    },\n  }),\n  DragDropContext(HTML5Backend),\n  toClass,\n)(WidgetbarForm);\n","import React from \"react\";\nimport { Provider } from \"react-redux\";\nimport store from \"store\";\nimport WidgetbarForm from \"components/administration/widgetbar/WidgetbarForm\";\n\nfunction WidgetbarEdit(props: any) {\n  return (\n    <Provider store={store}>\n      <div className=\"edit-widgetbar\">\n        <WidgetbarForm {...props} />\n      </div>\n    </Provider>\n  );\n}\n\nexport default WidgetbarEdit;\n","import { useDispatch, useSelector } from \"react-redux\";\nimport React, { useEffect } from \"react\";\nimport map from \"lodash/map\";\nimport { getWidgetbars } from \"helpers/selectors/widgetbarSelectors\";\nimport { fetchWidgetbars } from \"actions/administration/widgetbar\";\nimport { getWidgetName } from \"helpers/widgets/widgets\";\n\ninterface WidgetbarSelectionTypes {\n  groupId?: string;\n}\n\nexport default function WidgetbarSelection({\n  groupId,\n}: WidgetbarSelectionTypes) {\n  const widgetbars = useSelector(getWidgetbars) as Array<{\n    slug: string;\n    widgets: Array<unknown>;\n  }>;\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch(fetchWidgetbars({ groupId }));\n  }, []);\n\n  return (\n    <table className=\"tixxt-table\">\n      <thead>\n        <tr>\n          <th>{I18n.t(\"js.administration.widgetbars.table.name\")}</th>\n          <th>{I18n.t(\"js.administration.widgetbars.table.widget_count\")}</th>\n        </tr>\n      </thead>\n      <tbody>\n        {map(widgetbars, (widgetbar) => (\n          <tr key={widgetbar.slug}>\n            <td>\n              <a\n                href={`${\n                  groupId ? `/groups/${groupId}` : \"\"\n                }/administration/widgetbars/${widgetbar.slug}/edit`}\n              >\n                {getWidgetName(widgetbar.slug)}\n              </a>\n            </td>\n            <td>{widgetbar.widgets.length}</td>\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  );\n}\n","import React from \"react\";\nimport { Provider } from \"react-redux\";\nimport store from \"store\";\nimport WidgetbarSelection from \"components/administration/widgetbar/WidgetbarSelection\";\nimport InfoText from \"components/shared/InfoText\";\n\nfunction WidgetbarIndex() {\n  return (\n    <Provider store={store}>\n      <div className=\"edit-widgetbar\">\n        <InfoText translation=\"js.administration.widgetbars.info_md\" />\n        <WidgetbarSelection />\n      </div>\n    </Provider>\n  );\n}\n\nexport default WidgetbarIndex;\n","import { useQuery, useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nexport function useLegalTexts() {\n  return useQuery(\"legalTexts\", () => fetchApi(\"/administration/legal_texts\"));\n}\n\nexport function useLegalText(id) {\n  return useQuery([\"legalText\", id], () =>\n    fetchApi(`/administration/legal_texts/${id}`),\n  );\n}\n\nexport function useCreateLegalText(options) {\n  return useMutation(\n    (body) => fetchApi(`/administration/legal_texts`, { method: \"POST\", body }),\n    options,\n  );\n}\n\nexport function useUpdateLegalText(options) {\n  return useMutation(\n    ({ id, ...body }) =>\n      fetchApi(`/administration/legal_texts/${id}`, { method: \"PUT\", body }),\n    options,\n  );\n}\n\nexport function useDeleteLegalText(options) {\n  return useMutation(\n    (id) => fetchApi(`/administration/legal_texts/${id}`, { method: \"DELETE\" }),\n    options,\n  );\n}\n","import React from \"react\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport { get, isEmpty, map } from \"lodash\";\nimport moment from \"moment-timezone\";\nimport { useDeleteLegalText, useLegalTexts } from \"./api\";\nimport InfoText from \"components/shared/InfoText\";\n\ninterface LegalTextRowTypes {\n  legalText: {\n    id?: string;\n    name?: string;\n    handle?: string;\n    update_at?: string;\n  };\n\n  onDeleteLegalText(...args: unknown[]): unknown;\n}\n\nfunction LegalTextRow({ legalText, onDeleteLegalText }: LegalTextRowTypes) {\n  return (\n    <tr>\n      <td>{get(legalText, \"name\")}</td>\n      <td>\n        <a\n          href={`/legal/${get(legalText, \"handle\")}`}\n          target=\"_blank\"\n          rel=\"noreferrer\"\n        >\n          /{get(legalText, \"handle\")}\n        </a>\n      </td>\n      <td>\n        {moment(get(legalText, \"updated_at\")).format(\n          I18n.t(\"plugins.Locale.Formats.valid_datetime\"),\n        )}\n      </td>\n      <td className=\"with-context-menu\">\n        <div className=\"context-menu\">\n          <span className=\"dropdown pull-right\">\n            <a\n              className=\"dropdown-toggle\"\n              data-bs-toggle=\"dropdown\"\n              href=\"#\"\n              style={{ fontSize: \"1.3em\" }}\n            >\n              <i className=\"fa fa-ellipsis-h\" />\n            </a>\n            <ul className=\"dropdown-menu context-menu left\">\n              {get(legalText, \"read_only\") ? null : (\n                <li>\n                  <a\n                    href={`/administration/legal_texts/${get(\n                      legalText,\n                      \"id\",\n                    )}/edit`}\n                  >\n                    <i className=\"fa fa-pencil mr-1\" />\n                    {I18n.t(\"js.administration.legal_texts.edit.button\")}\n                  </a>\n                </li>\n              )}\n              <li>\n                <a href={`/administration/legal_texts/${get(legalText, \"id\")}`}>\n                  <i className=\"fa fa-code-fork mr-1\" />\n                  {I18n.t(\"js.administration.legal_texts.versions\")}\n                </a>\n              </li>\n              <li>\n                <a\n                  href=\"#\"\n                  onClick={(e) => {\n                    e.preventDefault();\n\n                    if (confirm(I18n.t(\"js.delete_confirmation\"))) {\n                      onDeleteLegalText(get(legalText, \"id\"));\n                    }\n                  }}\n                >\n                  <i className=\"fa-regular fa-trash mr-1\" />\n                  {I18n.t(\"js.administration.legal_texts.delete.button\")}\n                </a>\n              </li>\n            </ul>\n          </span>\n        </div>\n      </td>\n    </tr>\n  );\n}\n\nfunction LegalTextIndex() {\n  const {\n    isLoading: loading,\n    data: legalTexts,\n    refetch: refetchLegalTexts,\n  } = useLegalTexts();\n\n  const { mutate: deleteLegalText } = useDeleteLegalText({\n    onSuccess: () => {\n      toastr.success(I18n.t(\"js.delete_successful\"));\n      refetchLegalTexts();\n    },\n  });\n\n  return (\n    <>\n      <PageTitle title={I18n.t(\"js.administration.legal_text.title\")} />\n      <div className=\"btn-toolbar justify-end mb-10\">\n        <a className=\"btn btn-primary\" href=\"/administration/legal_texts/new\">\n          {I18n.t(\"js.administration.legal_texts.new.title\")}\n        </a>\n      </div>\n      {loading ? (\n        <div>\n          <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n        </div>\n      ) : (\n        <>\n          <InfoText translation=\"js.administration.legal_texts.info_md\" />\n          <table className=\"tixxt-table table-hover\">\n            <thead>\n              <tr>\n                <th>{I18n.t(\"js.administration.legal_texts.name\")}</th>\n                <th>{I18n.t(\"js.administration.legal_texts.link\")}</th>\n                <th>{I18n.t(\"js.administration.legal_texts.last_updated\")}</th>\n                <th>&nbsp;</th>\n              </tr>\n            </thead>\n            <tbody>\n              {isEmpty(legalTexts) ? (\n                <tr>\n                  <td colSpan={4} align=\"center\">\n                    {I18n.t(\"js.administration.legal_texts.no_entries\")}\n                  </td>\n                </tr>\n              ) : (\n                map(legalTexts, (legalText, index) => (\n                  <LegalTextRow\n                    key={index}\n                    legalText={legalText}\n                    onDeleteLegalText={deleteLegalText}\n                  />\n                ))\n              )}\n            </tbody>\n          </table>\n        </>\n      )}\n    </>\n  );\n}\n\nexport default LegalTextIndex;\n","import { useQuery, useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nexport function fetchImprint() {\n  return fetchApi(\"/administration/imprint/edit\");\n}\nexport function useImprint() {\n  return useQuery(\"imprint\", fetchImprint);\n}\n\nexport function updateImprint({ ...body }) {\n  return fetchApi(`/administration/imprint/`, { method: \"PUT\", body });\n}\nexport function useUpdateImprint(options) {\n  return useMutation(updateImprint, options);\n}\n","import React from \"react\";\nimport MarkdownEditor from \"./index\";\nimport styles from \"../../appCreator/properties/edit/editFields.module.css\";\nimport FieldError from \"../../appCreator/items/form/FieldError\";\n\ninterface MarkdownEditorAdapterTypes {\n  input: {\n    onChange(...args: unknown[]): unknown;\n    onFocus(...args: unknown[]): unknown;\n    onBlur(...args: unknown[]): unknown;\n    value: string;\n    name: string;\n  };\n  meta: { error: string; initial: string };\n}\n\nfunction MarkdownEditorAdapter({ input, meta }: MarkdownEditorAdapterTypes) {\n  return (\n    <div className={`${styles.Text} property-${input.name}`}>\n      <MarkdownEditor\n        {...input}\n        key={meta.initial} // Recreate MarkdownEditor component if the initialValue has changed\n        content={input.value}\n        onChange={input.onChange}\n        onFocus={input.onFocus}\n        onBlur={input.onBlur}\n      />\n      {meta.error && <FieldError error={meta.error} />}\n    </div>\n  );\n}\n\nexport default MarkdownEditorAdapter;\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\nimport { useUpdateImprint, useImprint } from \"./api\";\nimport PageTitle from \"../../layout/PageTitle\";\nimport MarkdownEditorAdapter from \"../../shared/markdownEditor/MarkdownEditorAdapter\";\nimport ControlGroup from \"../../shared/fields/ControlGroup\";\nimport { Field } from \"redux-form\";\nimport ReduxForm from \"../../shared/reduxForm\";\nimport InfoText from \"components/shared/InfoText\";\n\nfunction ImprintEdit() {\n  const { isLoading: loading, data: imprints } = useImprint();\n  const { mutate: updateImprint } = useUpdateImprint({\n    onSuccess: () => {\n      toastr.success(I18n.t(\"js.saving_successful\"));\n    },\n  });\n\n  return (\n    <>\n      <PageTitle title={I18n.t(\"js.administration.imprints.edit.title\")} />\n      {loading || isEmpty(imprints) ? (\n        <div>\n          <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n        </div>\n      ) : (\n        <>\n          <ReduxForm\n            form=\"editImprints\"\n            className={\"form-horizontal\"}\n            initialValues={imprints}\n            onSubmit={(values) => updateImprint({ imprint: values })}\n            onSubmitFail={() => toastr.error(I18n.t(\"js.saving_failure\"))}\n            allowSaveWithoutChange={false}\n          >\n            <ControlGroup\n              name=\"text\"\n              label={I18n.t(\"js.administration.imprints.web_imprint.label\")}\n              className=\"text-property\"\n            >\n              <Field\n                component={MarkdownEditorAdapter}\n                name=\"imprint_attributes.content\"\n              />\n            </ControlGroup>\n\n            <ControlGroup\n              name=\"text\"\n              label={I18n.t(\"js.administration.imprints.mail_imprint.label\")}\n              className=\"text-property space-y-4\"\n            >\n              <Field component={MarkdownEditorAdapter} name=\"mail_imprint\" />\n              {imprints.show_newsletter_info ? (\n                <InfoText\n                  translation={\n                    \"js.administration.imprints.edit.newsletter_info\"\n                  }\n                ></InfoText>\n              ) : null}\n            </ControlGroup>\n          </ReduxForm>\n        </>\n      )}\n    </>\n  );\n}\n\nexport default ImprintEdit;\n","import type { ChangeEventHandler, MouseEventHandler } from \"react\";\nimport React from \"react\";\nimport useTooltip from \"../../hooks/useTooltip\";\nimport Spectrum from \"../shared/Spectrum\";\nimport { mostReadable } from \"@ctrl/tinycolor\";\n\ntype Role = {\n  id?: string;\n  name?: string;\n  slug?: string;\n  plural_name?: string;\n  color?: string;\n  display_type?: string;\n};\ninterface RoleTypes extends Role {\n  isEditing?: boolean;\n  handleEdit(...args: unknown[]): unknown;\n  handleDestroy(...args: unknown[]): unknown;\n}\n\nfunction Role({\n  id,\n  name,\n  slug,\n  plural_name,\n  color,\n  display_type,\n  isEditing,\n  handleEdit,\n  handleDestroy,\n}: RoleTypes) {\n  const textColor = mostReadable(color || \"#FFFFFF\", [\"white\", \"black\"], {\n    includeFallbackColors: false,\n  })?.toHexString();\n\n  return (\n    <tr>\n      <td>{slug}</td>\n      <td>{name}</td>\n      <td>{plural_name}</td>\n      <td>\n        <span\n          className=\"label\"\n          style={{ backgroundColor: color, color: textColor }}\n        >\n          {color || \"-\"}\n        </span>\n      </td>\n      <td>\n        {I18n.t(\n          `js.administration.membership_roles.display_type.${display_type}`,\n        )}\n      </td>\n      <td>\n        <div className=\"btn-group\">\n          <button\n            className=\"btn\"\n            onClick={handleEdit(id) as MouseEventHandler}\n            disabled={isEditing}\n          >\n            <i className=\"fa fa-pencil\" />\n          </button>\n          <button\n            className=\"btn btn-danger\"\n            onClick={handleDestroy(id) as MouseEventHandler}\n          >\n            <i className=\"fa fa-trash\" />\n          </button>\n        </div>\n      </td>\n    </tr>\n  );\n}\n\ninterface EditRoleTypes extends Role {\n  handleChange(...args: unknown[]): (...args: unknown[]) => unknown;\n  handleCancelEdit(...args: unknown[]): unknown;\n}\n\nfunction EditRole({\n  name,\n  plural_name,\n  color,\n  display_type,\n  handleChange,\n  handleCancelEdit,\n}: EditRoleTypes) {\n  return (\n    <tr>\n      <td>\n        <input\n          type=\"text\"\n          value={I18n.t(\"js.administration.membership_roles.slug.generation\")}\n          required\n          disabled\n        />\n      </td>\n      <td>\n        <input\n          type=\"text\"\n          onChange={handleChange(\"name\") as ChangeEventHandler}\n          value={name || \"\"}\n          required\n          autoFocus\n        />\n      </td>\n      <td>\n        <input\n          type=\"text\"\n          onChange={handleChange(\"plural_name\") as ChangeEventHandler}\n          value={plural_name || \"\"}\n          required\n        />\n      </td>\n      <td>\n        <Spectrum onChange={handleChange(\"color\")} value={color || \"#000000\"} />\n      </td>\n      <td>\n        <select\n          onChange={handleChange(\"display_type\") as ChangeEventHandler}\n          value={display_type}\n        >\n          <option value=\"default\">\n            {I18n.t(\"js.administration.membership_roles.display_type.default\")}\n          </option>\n          <option value=\"grouped\">\n            {I18n.t(\"js.administration.membership_roles.display_type.grouped\")}\n          </option>\n          <option value=\"hidden\">\n            {I18n.t(\"js.administration.membership_roles.display_type.hidden\")}\n          </option>\n        </select>\n      </td>\n      <td>\n        <div className=\"btn-group\">\n          <button className=\"btn\" onClick={handleCancelEdit}>\n            <i className=\"fa fa-times\" />\n          </button>\n          <button className=\"btn btn-success\" type=\"submit\">\n            <i className=\"fa fa-save\" />\n          </button>\n        </div>\n      </td>\n    </tr>\n  );\n}\n\ninterface MembershipRolesManagerTypes {\n  roles: Array<Role>;\n  editingId?: string;\n  isEditing: boolean;\n  contextUrl?: string;\n  handleNew(...args: unknown[]): unknown;\n  handleEdit(...args: unknown[]): unknown;\n  handleDestroy(...args: unknown[]): unknown;\n  handleChange(...args: unknown[]): (...args: unknown[]) => unknown;\n  handleCancelEdit(...args: unknown[]): unknown;\n  handleSubmit(...args: unknown[]): unknown;\n}\n\nfunction MembershipRolesManager({\n  roles,\n  editingId,\n  isEditing,\n  contextUrl,\n  handleNew,\n  handleEdit,\n  handleDestroy,\n  handleChange,\n  handleCancelEdit,\n  handleSubmit,\n}: MembershipRolesManagerTypes) {\n  const tooltipRef = useTooltip<HTMLDivElement>();\n\n  return (\n    <div ref={tooltipRef}>\n      <div className=\"btn-toolbar\">\n        <div className=\"btn-group\">\n          <a\n            className=\"btn\"\n            title={I18n.t(\"js.back\")}\n            href={`${contextUrl}/administration/members`}\n          >\n            <i className=\"fa fa-caret-left\" /> <i className=\"fa fa-bars\" />\n          </a>\n        </div>\n\n        <div className=\"btn-group pull-right\">\n          <button\n            className=\"btn btn-primary\"\n            onClick={handleNew}\n            disabled={isEditing}\n          >\n            <i className=\"fa fa-plus\" />{\" \"}\n            {I18n.t(\"js.administration.membership_roles.add\")}\n          </button>\n        </div>\n      </div>\n\n      <form onSubmit={handleSubmit}>\n        <table className=\"table membership-roles\">\n          <thead>\n            <tr>\n              <th className=\"text-left\">\n                {I18n.t(\"js.administration.membership_roles.slug.label\")}\n              </th>\n              <th className=\"text-left\">\n                {I18n.t(\"js.administration.membership_roles.name.label\")}\n              </th>\n              <th className=\"text-left\">\n                {I18n.t(\"js.administration.membership_roles.plural_name.label\")}\n              </th>\n              <th className=\"text-left\">\n                {I18n.t(\"js.administration.membership_roles.color.label\")}\n              </th>\n              <th\n                className=\"text-left\"\n                data-bs-toggle=\"tooltip\"\n                title={I18n.t(\n                  \"js.administration.membership_roles.display_type.info\",\n                )}\n              >\n                {I18n.t(\n                  \"js.administration.membership_roles.display_type.label\",\n                )}\n                &nbsp;\n              </th>\n              <th className=\"text-left w-[1%]\" />\n            </tr>\n          </thead>\n\n          <tbody>\n            {roles.map((role) => {\n              return role.id == editingId ? (\n                <EditRole\n                  key={role.id || \"newRole\"}\n                  handleChange={handleChange}\n                  handleCancelEdit={handleCancelEdit}\n                  {...role}\n                />\n              ) : (\n                <Role\n                  key={role.id}\n                  handleEdit={handleEdit}\n                  handleDestroy={handleDestroy}\n                  isEditing={isEditing}\n                  {...role}\n                />\n              );\n            })}\n          </tbody>\n        </table>\n      </form>\n    </div>\n  );\n}\n\nexport default MembershipRolesManager;\n","import WidgetbarEdit from \"components/administration/WidgetbarEdit\";\nimport WidgetbarIndex from \"components/administration/WidgetbarIndex\";\nimport LegalTextIndex from \"components/administration/legalTexts/LegalTextIndex\";\nimport ImprintEdit from \"components/administration/imprints/ImprintEdit\";\nimport MembershipRolesManager from \"components/administration/MembershipRolesManager\";\n\nexport default {\n  \"administration/MembershipRolesManager\": MembershipRolesManager,\n  \"administration/WidgetbarEdit\": WidgetbarEdit,\n  \"administration/WidgetbarIndex\": WidgetbarIndex,\n  \"administration/legal_texts\": LegalTextIndex,\n  \"administration/imprint/edit\": ImprintEdit,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { get, map, isNil } from \"lodash\";\nimport moment from \"moment\";\nimport classnames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\n// Helper to format a given momentDate with the localised time format\nconst formatTime = (momentDate) =>\n  momentDate.format(I18n.t(\"js.time.formats.short_time\"));\n\nfunction FormattedTime({ start, end, allDay, day }) {\n  if (allDay || day.isBetween(start, end, \"day\", \"()\")) {\n    // allDay appointment or day is between start/end, check by day and exclude start/end days\n    return null;\n  }\n\n  if (start.isSame(day, \"day\") && end.isSame(day, \"day\")) {\n    // start and end on this day\n    return (\n      <span className=\"time\">{`${formatTime(start)}-${formatTime(end)}`}</span>\n    );\n  } else if (start.isSame(day, \"day\")) {\n    // start on this day\n    return <span className=\"time\">{formatTime(start)}</span>;\n  } else if (end.isSame(day, \"day\")) {\n    // end on this day\n    return <span className=\"time\">{`>${formatTime(end)}`}</span>;\n  }\n\n  // default return, when the appointment doesn't match a criteria above\n  return null;\n}\n\nfunction AppointmentLine({\n  name,\n  date,\n  html_url,\n  day,\n  markers,\n  canceled,\n  has_meeting,\n  className,\n}) {\n  const start = moment(get(date, \"start\"));\n  const end = isNil(get(date, \"end\")) ? moment(null) : moment(get(date, \"end\"));\n  const allDay = get(date, \"all_day\");\n\n  return (\n    <div\n      className={classnames(\n        \"h-5 flex gap-1\",\n        { \"bg-gray-100\": allDay },\n        className,\n      )}\n      title={name}\n    >\n      <div className={\"markers flex\"}>\n        {map(markers, (markerColor, index) => (\n          <span\n            key={index}\n            className=\"w-1\"\n            style={{ backgroundColor: `#${markerColor}` }}\n          />\n        ))}\n      </div>\n      <a href={html_url} className={\"text-sm truncate grow min-w-0\"}>\n        <FormattedTime start={start} end={end} allDay={allDay} day={day} />{\" \"}\n        <span\n          className={classnames(\"truncate\", {\n            \"line-through\": canceled,\n          })}\n        >\n          {name}\n        </span>\n      </a>\n      {has_meeting ? (\n        <FontAwesomeIcon\n          icon={regular(\"comments\")}\n          className={\"fa-sm text-muted\"}\n        />\n      ) : null}\n    </div>\n  );\n}\n\nAppointmentLine.propTypes = {\n  id: PropTypes.string,\n  name: PropTypes.string,\n  canceled: PropTypes.bool,\n  date: PropTypes.shape({\n    start: PropTypes.string,\n    end: PropTypes.string,\n    all_day: PropTypes.bool,\n    time_zone: PropTypes.string,\n  }),\n  markers: PropTypes.arrayOf(PropTypes.string),\n  day: PropTypes.object,\n  has_meeting: PropTypes.bool,\n};\n\nexport default AppointmentLine;\n","import React, { useLayoutEffect, useRef, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, get, find, compact, isEqual } from \"lodash\";\nimport moment from \"moment\";\nimport classNames from \"classnames\";\n\nimport \"../appointments.module.css\";\nimport AppointmentLine from \"./AppointmentLine\";\nimport useHover from \"../../shared/hooks/useHover\";\n\nfunction CalendarSheetCell({\n  day,\n  appointments,\n  isFirst,\n  weekNum,\n  notActualMonth,\n  calendars,\n  className,\n  maxHeight,\n  columnNumber,\n  lastRow,\n}) {\n  const momentDay = moment(day, \"YYYY-MM-DD\");\n  const divRef = useRef(null);\n  const appointmentHeight = 21; // h-5 + gap-px = 21px\n  const headerHeight = 24; // h-5 + gap-1 = 24px\n  let visibleAppointmentCount = Math.max(\n    4, // minimum appointment count\n    Math.floor((maxHeight - headerHeight - 8) / appointmentHeight),\n  );\n  const height = visibleAppointmentCount * appointmentHeight + headerHeight;\n  let hiddenAppointmentCount = 0;\n  if (appointments.length > visibleAppointmentCount) {\n    visibleAppointmentCount -= 1; // \"x more\" covers one line\n    hiddenAppointmentCount = appointments.length - visibleAppointmentCount;\n  }\n\n  const hovered = useHover(divRef);\n\n  const [initialDimensions, setInitialDimensions] = useState();\n  useLayoutEffect(() => {\n    if (!divRef.current) return;\n    const newInitialDimensions = {\n      width: divRef.current.clientWidth - 8, // subtract padding\n      height: divRef.current.clientHeight - 8, // subtract padding\n    };\n    if (isEqual(initialDimensions, newInitialDimensions)) return;\n\n    setInitialDimensions(newInitialDimensions);\n  }, [divRef.current, maxHeight, window.innerWidth]);\n\n  const style = divRef.current\n    ? appointments.length > 0 && hovered && initialDimensions\n      ? {\n          width: initialDimensions.width * 2.25, // 2.25 width expansion on hover, neighboring cells are partly visible\n          height: Math.max(\n            initialDimensions.height,\n            appointments.length * appointmentHeight + headerHeight,\n          ),\n        }\n      : initialDimensions\n    : null;\n\n  const bg = momentDay.isSame(moment(), \"day\")\n    ? \"bg-today\"\n    : notActualMonth\n      ? \"bg-gray-50\"\n      : \"bg-white\";\n\n  return (\n    <div\n      ref={divRef}\n      className={classNames(\n        \"CalendarSheetCell group relative flex flex-col p-1 border-neutral box-content overflow-hidden hover:overflow-visible\",\n        bg,\n        className,\n      )}\n      style={{ height }}\n      onDoubleClick={() =>\n        Backbone.history.navigate(`/appointments/new?date=${day}`, {\n          trigger: true,\n        })\n      }\n    >\n      {style ? (\n        <>\n          <div\n            className={classNames(\n              \"absolute top-0 flex flex-col gap-1 p-1 overflow-hidden box-content\",\n              \"group-hover:z-10 group-hover:shadow-lg group-hover:border group-hover:border-t-0 group-hover:border-neutral group-hover:rounded\",\n              // \"group-hover:p-2 group-hover:-translate-y-[5px]\",\n              columnNumber === 0\n                ? \"left-0 group-hover:-left-px\"\n                : columnNumber === 6\n                  ? \"right-0 group-hover:-right-px\"\n                  : \"left-0 group-hover:left-1/2 group-hover:-translate-x-1/2\",\n              lastRow ? \"group-hover:-bottom-px group-hover:top-auto\" : null,\n              divRef.current ? \"group-hover:transition-dimensions\" : null,\n              hovered ? bg : null,\n              notActualMonth && !hovered ? \"opacity-50\" : null,\n            )}\n            style={style}\n          >\n            <div className=\"flex shrink-0 justify-between items-center relative truncate flex-nowrap h-5 gap-1\">\n              <span className={\"text-sm font-medium\"}>\n                {isFirst || momentDay.format(\"DD\") === \"01\"\n                  ? ` ${momentDay.format(\"DD. MMM\")}`\n                  : momentDay.format(\"DD\")}{\" \"}\n              </span>\n              <div className=\"hidden group-hover:inline grow text-muted truncate cursor-default text-sm\">\n                {I18n.t(\n                  \"js.calendars.overview.sheet_cell_line.double_click_to_add\",\n                )}\n              </div>\n              {weekNum ? (\n                <span className=\"badge bg-gray-400 text-white text-[10px] px-1\">\n                  {weekNum}\n                </span>\n              ) : null}\n            </div>\n            <div className=\"appointmentsList shrink-0 flex flex-col gap-px\">\n              {map(appointments, (appointment, index) => {\n                const markers = map(get(appointment, \"calendar_ids\"), (calId) =>\n                  get(\n                    find(\n                      calendars,\n                      (calendar) => get(calendar, \"id\") === calId,\n                    ),\n                    \"color\",\n                  ),\n                );\n\n                return (\n                  <AppointmentLine\n                    key={index}\n                    {...appointment}\n                    day={momentDay}\n                    markers={compact(markers)}\n                    className={\n                      index >= visibleAppointmentCount\n                        ? \"hidden group-hover:flex\"\n                        : \"\"\n                    }\n                  />\n                );\n              })}\n            </div>\n          </div>\n          {hiddenAppointmentCount > 0 ? (\n            <span className=\"group-hover:hidden absolute inset-x-0 bottom-0 text-sm text-muted px-2 pb-1\">\n              {hiddenAppointmentCount}{\" \"}\n              {I18n.t(\"js.calendars.overview.sheet_cell_line.more\")}\n            </span>\n          ) : null}\n        </>\n      ) : null}\n    </div>\n  );\n}\n\nCalendarSheetCell.propTypes = {\n  day: PropTypes.string,\n  appointments: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.string,\n      name: PropTypes.string,\n      status: PropTypes.string,\n      date: PropTypes.shape({\n        start: PropTypes.string,\n        end: PropTypes.string,\n        all_day: PropTypes.bool,\n        time_zone: PropTypes.string,\n      }),\n      calendar_ids: PropTypes.arrayOf(PropTypes.string),\n    }),\n  ),\n  isFirst: PropTypes.bool,\n  weekNum: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\n  notActualMonth: PropTypes.bool,\n  calendars: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.string,\n      color: PropTypes.string,\n    }),\n  ),\n};\n\nexport default CalendarSheetCell;\n","import { useState, useEffect } from \"react\";\n\n// Hook to set ref of a DOM element and return true if is hovered\n// @example\n// function HoveredDiv()  {\n//   const divRef = useRef();\n//   const isHovered = useHover(divRef);\n//   return <div ref={divRef}>{isHovered ? \"Hovered\" : \"Not hovered\"}</div>;\n// };\nexport default function useHover(ref) {\n  const [hovered, setHovered] = useState(false);\n  useEffect(() => {\n    if (!ref.current) return;\n\n    function handleHover(e) {\n      setHovered(e.type === \"mouseenter\");\n    }\n\n    ref.current.addEventListener(\"mouseenter\", handleHover);\n    ref.current.addEventListener(\"mouseleave\", handleHover);\n    return () => {\n      ref.current?.removeEventListener(\"mouseenter\", handleHover);\n      ref.current?.removeEventListener(\"mouseleave\", handleHover);\n    };\n  }, [ref.current]);\n\n  return hovered;\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, size, get, range, at, keys, find, concat, drop } from \"lodash\";\nimport moment from \"moment\";\nimport CalendarSheetCell from \"./calendarSheet/CalendarSheetCell\";\nimport FullSizeContent from \"../shared/FullSizeContent\";\nimport useFullWidthLayout from \"hooks/useFullWidthLayout\";\n\nfunction HeaderCell({ day }) {\n  return <div className=\"text-sm px-1 text-muted\">{day}</div>;\n}\n\nHeaderCell.propTypes = {\n  day: PropTypes.string,\n};\n\nfunction CalendarSheet({ appointmentsByDate, calendars }) {\n  useFullWidthLayout();\n\n  const days = moment.weekdays();\n  const weekCount = Math.ceil(size(appointmentsByDate) / 7);\n  const dates = keys(appointmentsByDate);\n\n  const startOfMonth = find(dates, (date) => !!date.match(/-01$/));\n  const endOfMonth = moment(startOfMonth).endOf(\"month\").format(\"YYYY-MM-DD\");\n\n  const rowStyle = {\n    gridTemplateRows: `repeat(${weekCount}, 1fr)`,\n  };\n\n  return (\n    <FullSizeContent className={`CalendarSheet flex flex-col gap-1`}>\n      {({ height }) => {\n        const headerCellHeight = 24; // h-5 + gap-1 = 24px\n        const maxCellHeight = (height - headerCellHeight) / weekCount;\n\n        return (\n          <>\n            <div className=\"grid grid-cols-7 h-5\">\n              {map(concat(drop(days), days[0]), (day) => (\n                <HeaderCell day={day} key={day} />\n              ))}\n            </div>\n            <div className=\"min-h-0 grid grid-cols-7\" style={rowStyle}>\n              {map(range(0, weekCount), (i) => {\n                const days = at(dates, range(7 * i, 7 * (i + 1)));\n                const weekNum = moment(days[0], \"YYYY-MM-DD\").week();\n\n                return map(days, (day, j) => (\n                  <CalendarSheetCell\n                    key={day}\n                    day={day}\n                    appointments={get(appointmentsByDate, day)}\n                    isFirst={i === 0 && j === 0}\n                    weekNum={j === 0 && weekNum}\n                    notActualMonth={day < startOfMonth || day > endOfMonth}\n                    calendars={calendars}\n                    className={\n                      \"border-r border-b \" +\n                      (i === 0 ? \"border-t \" : \"\") +\n                      (j === 0 ? \"border-l \" : \"\") +\n                      (i === 0\n                        ? j === 0\n                          ? \"rounded-tl \"\n                          : j === 6\n                            ? \"rounded-tr\"\n                            : \"\"\n                        : i === weekCount - 1\n                          ? j === 0\n                            ? \"rounded-bl\"\n                            : j === 6\n                              ? \"rounded-br\"\n                              : \"\"\n                          : \"\")\n                    }\n                    maxHeight={maxCellHeight}\n                    columnNumber={j}\n                    lastRow={i === weekCount - 1}\n                  />\n                ));\n              })}\n            </div>\n          </>\n        );\n      }}\n    </FullSizeContent>\n  );\n}\n\nCalendarSheet.propTypes = {\n  appointmentsByDate: PropTypes.shape({\n    [PropTypes.any]: CalendarSheetCell.propTypes.appointments,\n  }),\n  calendars: CalendarSheetCell.propTypes.calendars,\n};\n\nexport default CalendarSheet;\n","import React from \"react\";\nimport CustomConfigurator from \"../../CustomConfigurator\";\n\nfunction ExternalIdInput({ onChangeExternalId }: Props) {\n  return (\n    <>\n      <label>Rundschreibennummer</label>\n      <input\n        type={\"text\"}\n        onChange={(e) => {\n          onChangeExternalId(e.target.value);\n        }}\n      />\n    </>\n  );\n}\n\ntype Props = {\n  externalId?: string;\n  onChangeExternalId: (value: string) => void;\n};\n\nCustomConfigurator.setDefault(\n  [\"rundschreiben\", \"ExternalIdInput\"],\n  ExternalIdInput,\n);\n\nfunction ExternalIdComponent(props) {\n  const ExternalIdInput = CustomConfigurator.get([\n    \"rundschreiben\",\n    \"ExternalIdInput\",\n  ]);\n\n  return (\n    <>\n      <ExternalIdInput {...props} />\n    </>\n  );\n}\n\nexport default ExternalIdComponent;\n","import { TinyColor } from \"@ctrl/tinycolor\";\nimport { ColorObject, DerivedTheme, Theme } from \"./types\";\nimport { CSSProperties } from \"react\";\nimport { map } from \"lodash\";\n\n/*\n  The logic of this function is duplicated in ruby\n  Dont forget to update it as well: app/services/theme_service/theme_to_css.rb\n */\nexport function lightThemeToCss(theme: Theme) {\n  const { bannerType, logoType } = theme;\n  const cssContent: string[] = [];\n\n  cssContent.push(LOGO_RULES[logoType]());\n  cssContent.push(BANNER_RULES[bannerType](theme));\n\n  return cssContent.join(\"\\n\");\n}\n\n/*\n  The logic of this function is duplicated in ruby\n  Dont forget to update it as well: app/services/theme_service/theme_to_css.rb\n */\nexport default function themeToCss(theme: DerivedTheme) {\n  const { derivedColors, logoType, bannerType } = theme;\n  const cssContent: string[] = [];\n\n  cssContent.push(\":root {\");\n\n  for (const variable in derivedColors) {\n    const colorObj = derivedColors[variable];\n\n    cssContent.push(\n      map(\n        colorObjToCSSProperties(variable, colorObj),\n        (value, variable) => `${variable}: ${value};`,\n      ).join(\" \"),\n    );\n  }\n\n  cssContent.push(`}`);\n\n  cssContent.push(LOGO_RULES[logoType]());\n  cssContent.push(BANNER_RULES[bannerType](theme));\n\n  return cssContent.join(\"\\n\");\n}\n\nexport function colorObjToCSSProperties(\n  variable: string,\n  colorObj: ColorObject | undefined,\n): CSSProperties {\n  if (!colorObj) return {};\n\n  const result = {};\n  const { color, abstract, tailwind } = colorObj;\n\n  if (!abstract) {\n    result[`--${variable}`] = color;\n  }\n  if (tailwind) {\n    const { r, g, b } = new TinyColor(color).toRgb();\n    result[`--tailwind-${variable}`] = `${r} ${g} ${b}`;\n  }\n\n  return result;\n}\n\nconst LOGO_RULES = {\n  default() {\n    // This is exported to the defaultTheme\n    return `:root {\n      --header-logo-height: 60px;\n      --header-logo-display: grid;\n      --header-home-icon-display: none;\n      --header-small-search-display: none;\n      --header-small-grid: 'burger logo user-central';\n      --navigation-offset: 60px;\n    }`;\n  },\n  extended() {\n    return `:root {\n      --header-logo-height: 80px;\n      --header-logo-display: grid;\n      --header-home-icon-display: none;\n      --header-small-search-display: none;\n      --header-small-grid: 'burger logo user-central';\n      --navigation-offset: 60px;\n    }`;\n  },\n  hidden() {\n    return `:root {\n      --header-logo-height: 0px;\n      --header-logo-display: none;\n      --header-home-icon-display: grid;\n      --header-small-search-display: flex;\n      --header-small-grid: 'burger home-icon search user-central';\n      --navigation-offset: 60px;\n    }`;\n  },\n};\n\nconst BANNER_RULES = {\n  hidden() {\n    // This is exported to the defaultTheme\n    return `:root {\n      --header-banner-height: 0;\n      --header-banner-position: unset;\n      --header-banner-background: transparent; \n    }`;\n  },\n  color({ colors, derivedColors }: DerivedTheme) {\n    const col =\n      colors[\"banner-background\"] || derivedColors?.[\"banner-background\"];\n    return `:root {\n      --header-banner-height: 20px;\n      --header-banner-position: fixed;\n      --header-banner-background: ${col?.color || \"transparent\"};\n      --navigation-offset: 80px;\n    }`;\n  },\n  image({ override, bannerImage, bannerUrl, logoType }: Theme) {\n    let url = override\n      ? bannerImage\n        ? `/api/storage/assets/${bannerImage.id}/preview`\n        : null\n      : bannerUrl;\n    url = url ? `url(\"${url}\")` : \"none\";\n\n    return `:root {\n      --header-banner-height: 120px;\n      --header-banner-position: unset;\n      --header-banner-background: transparent ${url} 0 0 no-repeat;\n      ${logoType == \"extended\" ? \"--header-logo-height: 120px;\" : \"\"}\n    }`;\n  },\n};\n","import React, { CSSProperties, useState } from \"react\";\nimport { at, isEmpty, map, reject, some, sum, assign } from \"lodash\";\n\nimport { useGroupsAndCategories } from \"../../hooks/userbar\";\nimport { Group, GroupCategory } from \"../../@types\";\nimport { UserbarSection } from \"../layout/Userbar\";\nimport { closeUserbar } from \"../../layout/togglebar\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport {\n  DerivedTheme,\n  Theme,\n} from \"components/administration/designManager/types\";\nimport { colorObjToCSSProperties } from \"components/administration/designManager/themeToCss\";\n\nfunction persistOpenState(id: string, open: boolean) {\n  localStorage.setItem(`GroupCategorySections/${id}/open`, open.toString());\n}\n\nfunction loadOpenState(id: string) {\n  const item = localStorage.getItem(`GroupCategorySections/${id}/open`);\n  return item === null ? null : item === \"true\";\n}\n\ntype Props = {\n  children: SectionProps[\"children\"];\n  unreadCountByGroupSlug?: { [slug: string]: number | undefined };\n};\n\nexport default function GroupCategorySections({\n  children,\n  unreadCountByGroupSlug,\n}: Props) {\n  const { groupCategories, groupsByCategoryId } = useGroupsAndCategories();\n\n  return (\n    <>\n      {map(groupCategories, (groupCategory: GroupCategory) => {\n        const groups = groupsByCategoryId[groupCategory.id];\n\n        // Hide hidden group categories (sub-organisations) without membership\n        if (groupCategory.access == \"hidden\" && isEmpty(groups)) return null;\n\n        const unreadCount = sum(\n          at(unreadCountByGroupSlug, map(groups, \"slug\")),\n        );\n        return (\n          <GroupCategorySection\n            key={groupCategory.id}\n            id={groupCategory.id}\n            name={groupCategory.plural_name}\n            slug={groupCategory.slug}\n            groups={groups}\n            can={groupCategory.can}\n            unreadCount={unreadCount}\n            mainGroupHidden={groupCategory.main_group_hidden}\n            mainGroupSlug={groupCategory.main_group_slug}\n            theme={groupCategory.active_theme}\n          >\n            {children}\n          </GroupCategorySection>\n        );\n      })}\n    </>\n  );\n}\n\ntype SectionProps = {\n  id: string;\n  name: string;\n  slug: string;\n  groups: Group[];\n  can: {\n    create: boolean;\n    administrate: boolean;\n  };\n  children: (\n    group: Group,\n    sectionStatus: { collapsed: boolean },\n  ) => React.ReactNode;\n  unreadCount?: number;\n  mainGroupHidden: boolean;\n  mainGroupSlug: string;\n  theme?: Theme;\n};\n\nfunction GroupCategorySection({\n  id,\n  name,\n  slug,\n  groups,\n  can,\n  children,\n  unreadCount,\n  mainGroupHidden,\n  mainGroupSlug,\n  theme,\n}: SectionProps) {\n  const open = loadOpenState(id);\n  const [isOpen, setIsOpen] = useState(open === null ? !isEmpty(groups) : open);\n\n  groups = reject(groups, \"archived\");\n\n  if (mainGroupHidden) {\n    groups = reject(groups, (group) => {\n      return group.slug === mainGroupSlug;\n    });\n  }\n\n  let content;\n  if (isEmpty(groups)) {\n    content = (\n      <div className=\"text-center userbar-link\">\n        <div className=\"opacity-60 userbar-link-hint\">\n          {I18n.t(\"js.activitystreams.userbar.group.empty\")}\n        </div>\n        <a\n          className=\"opacity-80\"\n          href={`/directory/${slug}`}\n          onClick={closeUserbar}\n        >\n          {I18n.t(\"js.activitystreams.userbar.group.join\", { name: name })}\n        </a>\n      </div>\n    );\n  } else {\n    content = (\n      <>\n        {map(groups, (group: Group) => children(group, { collapsed: !open }))}\n        <li className=\"userbar-link section-content__hide flex border-t pt-1\">\n          <a\n            className=\"flex-1 opacity-80 px-2 text-center hover:no-underline\"\n            href={`/directory/${slug}`}\n            onClick={closeUserbar}\n          >\n            {I18n.t(\"js.activitystreams.userbar.group.other\", { name: name })}\n          </a>\n        </li>\n      </>\n    );\n  }\n\n  const addGroupLink = can.create ? (\n    <a\n      className=\"userbar-section--add-group text-lg px-2 -mr-2 font-semibold\"\n      href={`/groups/new/${slug}`}\n      onClick={closeUserbar}\n    >\n      <FontAwesomeIcon icon={solid(\"plus\")} className={\"fa-xs\"} />\n    </a>\n  ) : null;\n\n  return (\n    <UserbarSection\n      title={name}\n      collapsible\n      isOpen={isOpen}\n      setIsOpen={(open: boolean) => {\n        setIsOpen(open);\n        persistOpenState(id, open);\n      }}\n      hasFavorites={some(groups, {\n        favorited: true,\n      })}\n      unreadCount={unreadCount}\n      additionalTitleElement={addGroupLink}\n      style={theme ? userbarVariables(theme) : undefined}\n    >\n      {content}\n    </UserbarSection>\n  );\n}\n\nexport function userbarVariables(theme: DerivedTheme): CSSProperties {\n  const names = [\n    \"userbar-accent\",\n    \"userbar-background\",\n    \"userbar-link-text\",\n    \"userbar-section-background\",\n    \"userbar-section__title-text\",\n    \"userbar-link--active-background\",\n    \"userbar-link--active-text\",\n    \"userbar-link--hover-background\",\n    \"userbar-link--hover-text\",\n  ];\n\n  const result: CSSProperties = assign(\n    {} as CSSProperties,\n    ...map(names, (variable) =>\n      colorObjToCSSProperties(\n        variable,\n        theme.colors?.[variable] || theme.derivedColors?.[variable],\n      ),\n    ),\n  );\n\n  return result;\n}\n","import { useSelector } from \"react-redux\";\nimport { Group, GroupCategory } from \"../@types\";\nimport {\n  groupCategoriesSelector,\n  myGroupsByCategoryIdSelector,\n} from \"../selectors/environment\";\n\nexport function useGroupsAndCategories() {\n  const groupCategories: GroupCategory[] = useSelector(groupCategoriesSelector);\n  const groupsByCategoryId: { [key: string]: Group[] } = useSelector(\n    myGroupsByCategoryIdSelector,\n  );\n\n  return { groupCategories, groupsByCategoryId };\n}\n","import classNames from \"classnames\";\nimport React, { CSSProperties, useEffect, useMemo, useRef } from \"react\";\nimport { useLocation } from \"helpers/tixxt-router\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular, solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport UnreadBadge from \"components/shared/UnreadBadge\";\nimport { escapeRegExp } from \"lodash\";\nimport { closeUserbar } from \"layout/togglebar\";\nimport { useMaxHeight } from \"hooks/useMaxHeight\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../@types\";\nimport { userbarVariables } from \"components/shared/GroupCategorySections\";\n\ntype UserbarContentProps = {\n  children: React.ReactNode;\n  id?: string;\n};\n\ntype SectionProps = {\n  children?: React.ReactNode;\n  extraChildren?: React.ReactNode; // to be shown after <ul>\n  title?: string;\n  unreadCount?: number;\n  className?: string;\n  collapsible?: boolean;\n  isOpen?: boolean;\n  setIsOpen?: (open: boolean) => void;\n  hasFavorites?: boolean;\n  style?: CSSProperties;\n  additionalTitleElement?: React.ReactNode;\n};\n\nexport function ContextNavigation({\n  style = \"\",\n  children,\n}: {\n  children: React.ReactNode;\n  style?: string;\n}) {\n  const userbarRef = useRef<HTMLDivElement>(null);\n\n  // Scroll to selected Group to avoid userbar jump to top when navigating in group context\n  useEffect(() => {\n    if (location.pathname.startsWith(\"/groups/\")) {\n      const activeItem = userbarRef.current?.querySelector(\n        \".userbar-link--active\",\n      );\n\n      if (activeItem && userbarRef.current) {\n        activeItem.scrollIntoView({\n          behavior: \"auto\",\n          block: \"center\",\n        });\n      }\n    }\n  }, [location.pathname]);\n\n  return (\n    <div\n      ref={userbarRef}\n      className={`userbar__context-navigation flex flex-col px-3 divide-y ${style}`}\n    >\n      {children}\n    </div>\n  );\n}\n\nexport function UserbarContent({ children, id }: UserbarContentProps) {\n  let style = useMaxHeight();\n  const groupCategoryTheme = useSelector(\n    (state: State) => state.groupCategoryTheme,\n  );\n\n  style = groupCategoryTheme\n    ? {\n        ...style,\n        ...userbarVariables(groupCategoryTheme),\n      }\n    : style;\n\n  return (\n    <div className={\"userbar__content\"} id={id} style={style}>\n      {children}\n    </div>\n  );\n}\n\nconst titleClasses =\n  \"flex p-1 font-semibold uppercase items-center min-w-0 grow\";\nconst titleTextClasses = \"flex-1 text-left\";\n\nexport function UserbarSection({\n  children,\n  extraChildren,\n  title,\n  unreadCount,\n  className,\n  collapsible,\n  isOpen = true,\n  setIsOpen,\n  hasFavorites,\n  style,\n  additionalTitleElement,\n}: SectionProps) {\n  return (\n    <div\n      className={classNames(\n        \"userbar-section\",\n        {\n          \"userbar-section--closed\": !isOpen,\n        },\n        \"flex flex-col first:pt-0 py-3 space-y-2\",\n        className,\n      )}\n      style={style}\n    >\n      <div className=\"userbar-section__title flex items-center justify-between\">\n        {title &&\n          (collapsible ? (\n            <button\n              className={titleClasses}\n              onClick={() => {\n                setIsOpen && setIsOpen(!isOpen);\n              }}\n            >\n              <FontAwesomeIcon\n                className=\"userbar-section__indicator fa-xs\"\n                icon={regular(\"chevron-right\")}\n              />\n              <span\n                className={`${titleTextClasses} truncate hover:overflow-visible hover:whitespace-normal hover:break-words userbar-section-hyphen`}\n              >\n                {title}\n              </span>\n              <UnreadBadge count={unreadCount} className=\"ml-1\" />\n            </button>\n          ) : (\n            <span\n              className={`${titleClasses} ${titleTextClasses}`}\n              style={{ wordBreak: \"break-word\" }}\n            >\n              {title}\n            </span>\n          ))}\n        {additionalTitleElement ? additionalTitleElement : null}\n      </div>\n      {children ? (\n        <ul\n          className={classNames(\"userbar-section__content\", {\n            \"section-content__hide\": !hasFavorites,\n          })}\n        >\n          {children}\n        </ul>\n      ) : null}\n      {extraChildren}\n    </div>\n  );\n}\n\ntype GroupFavoriteIconProps = {\n  favorited: boolean;\n  collapsed: boolean;\n};\n\nexport function FavoriteGroupIcon({\n  favorited,\n  collapsed,\n}: GroupFavoriteIconProps) {\n  return (\n    <>\n      {favorited && (\n        <FontAwesomeIcon\n          icon={solid(\"star\")}\n          className={classNames(\"transition relative text-favorite/10\", {\n            \"text-favorite/50\": !collapsed,\n          })}\n        />\n      )}\n    </>\n  );\n}\n\ntype UserbarLinkProps = {\n  children: React.ReactNode;\n  to: string;\n  active?: boolean;\n  unreads?: number;\n  target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n  showWhileClosed?: boolean;\n  className?: string;\n  prefixMatch?: boolean;\n  title?: string;\n  favorited?: boolean;\n  collapsed?: boolean;\n};\n\nexport function UserbarLink({\n  children,\n  to,\n  unreads,\n  active,\n  showWhileClosed,\n  className,\n  prefixMatch,\n  title,\n  favorited = false,\n  collapsed = false,\n  ...extraProps\n}: UserbarLinkProps) {\n  const location = useLocation();\n  const regex = useMemo(\n    () => (prefixMatch ? new RegExp(`^${escapeRegExp(to)}(/|$|\\\\?)`) : null),\n    [prefixMatch, to],\n  );\n\n  if (active === undefined || active === null) {\n    if (regex) active = !!location.pathname.match(regex);\n    else active = to === location.pathname + location.search;\n  }\n\n  function handleClick(e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) {\n    if (window.isApp) {\n      e.preventDefault();\n      window.Turbo?.visit(to, { action: \"replace\" });\n    }\n\n    closeUserbar();\n  }\n\n  return (\n    <>\n      <li\n        title={title}\n        className={classNames(\n          \"userbar-link\",\n          className,\n          {\n            \"userbar-link--active\": active,\n            \"userbar-link--unreads\": unreads,\n            \"section-content__hide\": !showWhileClosed,\n          },\n          \"flex items-baseline\",\n        )}\n      >\n        <a\n          href={to}\n          className={\n            \"flex-1 py-1 px-2 justify-between flex items-baseline hover:no-underline\"\n          }\n          onClick={handleClick}\n          {...extraProps}\n        >\n          {children}\n          <div className={\"whitespace-nowrap\"}>\n            <FavoriteGroupIcon favorited={favorited} collapsed={collapsed} />\n            <UnreadBadge count={unreads} className={classNames(className)} />\n          </div>\n        </a>\n      </li>\n    </>\n  );\n}\n","import React, { useEffect } from \"react\";\nimport classNames from \"classnames\";\nimport useTooltip from \"../../hooks/useTooltip\";\nimport { throttle } from \"lodash\";\nimport Tooltip from \"bootstrap/js/dist/tooltip\";\nimport UnreadBadge from \"components/shared/UnreadBadge\";\nimport { closeUserbar } from \"../../layout/togglebar\";\n\nfunction ModuleSwitcher({\n  children,\n  className,\n}: {\n  children: React.ReactNode;\n  className?: string;\n}) {\n  return (\n    <ul className={classNames(className, \"module-switcher\")}>{children}</ul>\n  );\n}\n\nfunction toggleTooltips(tooltipRef: React.RefObject<HTMLElement>) {\n  if (!tooltipRef.current) return;\n\n  const titleElem = tooltipRef.current?.getElementsByClassName(\n    \"module-switcher-module__title\",\n  )[0];\n  if (!titleElem) return;\n\n  if (window.getComputedStyle(titleElem).display === \"none\") {\n    Tooltip.getInstance(tooltipRef.current)?.enable();\n  } else {\n    Tooltip.getInstance(tooltipRef.current)?.disable();\n  }\n}\n\nfunction useTooltipsIfTitlesAreHidden() {\n  const tooltipRef = useTooltip<HTMLLIElement>();\n\n  useEffect(() => {\n    const throttledToggleTooltips = throttle(\n      () => toggleTooltips(tooltipRef),\n      500,\n    );\n    window.addEventListener(\"resize\", throttledToggleTooltips);\n    throttledToggleTooltips();\n\n    return () => window.removeEventListener(\"resize\", throttledToggleTooltips);\n  }, [tooltipRef.current]);\n\n  return tooltipRef;\n}\n\nfunction Module({\n  title,\n  icon,\n  active,\n  url,\n  notifications,\n  className,\n}: {\n  title: string;\n  icon: React.ReactNode;\n  active?: boolean;\n  url: string;\n  className?: string;\n  notifications?: number;\n}) {\n  const tooltipRef = useTooltipsIfTitlesAreHidden();\n\n  return (\n    <li\n      className={className}\n      data-bs-toggle=\"tooltip\"\n      title={title}\n      data-bs-placement=\"right\"\n      ref={tooltipRef}\n    >\n      <a\n        title={title}\n        href={url}\n        className={classNames(\"module-switcher__module relative\", {\n          \"module-switcher__module--active\": active,\n        })}\n        onClick={closeUserbar}\n      >\n        <UnreadBadge count={notifications} className=\"absolute right-1 top-1\" />\n        <span className=\"module-switcher-module__icon\">{icon}</span>\n        <span className=\"module-switcher-module__title truncate\">{title}</span>\n      </a>\n    </li>\n  );\n}\n\nModuleSwitcher.Module = Module;\nexport default ModuleSwitcher;\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { light, duotone } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport ModuleSwitcher from \"./ModuleSwitcher\";\nimport { map } from \"lodash\";\nimport { useSelector } from \"react-redux\";\nimport { useFeaturesUnreads } from \"api/unreads\";\nimport { useLocation } from \"helpers/tixxt-router\";\nimport { State } from \"../../@types\";\n\ntype ModuleConfigLookup = {\n  [moduleName: string]:\n    | {\n        title: string;\n        icon: (opts: { duo: boolean; active: boolean }) => React.ReactNode;\n        slug: string;\n        url: string;\n      }\n    | undefined;\n};\nexport const MODULE_LOOKUP: ModuleConfigLookup = {\n  get Activitystreams() {\n    return {\n      title: I18n.t(\"js.activitystreams.module_name\"),\n      icon: ({ duo, active }) => (\n        <FontAwesomeIcon\n          // icon={duo ? duotone(\"signal-stream\") : light(\"signal-stream\")}\n          icon={duo ? duotone(\"earth-europe\") : light(\"earth-europe\")}\n          className={active ? \"fa-swap-opacity\" : \"\"}\n        />\n      ),\n      slug: \"activities\",\n      url: \"/activitystreams/all\",\n    };\n  },\n  get Messages() {\n    return {\n      title: I18n.t(\"js.messages.module_name\"),\n      icon: ({ duo }) => (\n        <FontAwesomeIcon\n          // icon={duo ? duotone(\"envelope\") : light(\"envelope\")}\n          // icon={duo ? duotone(\"inbox-full\") : light(\"inbox-full\")}\n          icon={duo ? duotone(\"inbox\") : light(\"inbox\")}\n        />\n      ),\n      slug: \"messages\",\n      url: \"/messages\",\n    };\n  },\n  get Calendars() {\n    return {\n      title: I18n.t(\"js.calendars.module_name\"),\n      icon: ({ duo }) => (\n        <FontAwesomeIcon\n          // icon={duo ? duotone(\"calendar-range\") : light(\"calendar-range\")}\n          icon={duo ? duotone(\"calendar-day\") : light(\"calendar-day\")}\n        />\n      ),\n      slug: \"appointments\",\n      url: \"/appointments\",\n    };\n  },\n  get Tasks() {\n    return {\n      title: I18n.t(\"js.tasks.module_name\"),\n      icon: ({ duo }) => (\n        <FontAwesomeIcon\n          icon={duo ? duotone(\"circle-check\") : light(\"circle-check\")}\n          // icon={duo ? duotone(\"square-check\") : light(\"square-check\")}\n          // icon={duo ? duotone(\"list-check\") : light(\"list-check\")}\n        />\n      ),\n      slug: \"tasks\",\n      url: \"/tasks/my\",\n    };\n  },\n  get Files() {\n    return {\n      title: I18n.t(\"js.files.module_name\"),\n      icon: ({ duo }) => (\n        <FontAwesomeIcon\n          // icon={duo ? duotone(\"folder\") : light(\"folder\")}\n          // icon={duo ? duotone(\"folder-tree\") : light(\"folder-tree\")}\n          // icon={duo ? duotone(\"cabinet-filing\") : light(\"cabinet-filing\")}\n          // icon={duo ? duotone(\"briefcase\") : light(\"briefcase\")}\n          icon={duo ? duotone(\"folder-open\") : light(\"folder-open\")}\n        />\n      ),\n      slug: \"files\",\n      url: \"/files\",\n    };\n  },\n  get Directory() {\n    return {\n      title: \"Kontakte\",\n      icon: ({ active }) => (\n        <FontAwesomeIcon\n          icon={light(\"user\")}\n          className={active ? \"fa-swap-opacity\" : \"\"}\n        />\n      ),\n      slug: \"directory\",\n      url: \"/directory\",\n    };\n  },\n  get More() {\n    return {\n      title: \"Mehr\",\n      icon: ({ active }) => (\n        <FontAwesomeIcon\n          icon={light(\"ellipsis\")}\n          className={active ? \"fa-swap-opacity\" : \"\"}\n        />\n      ),\n      slug: \"more\",\n      url: \"/more\",\n    };\n  },\n};\n\ntype Props = {\n  activeModule?:\n    | \"activities\"\n    | \"messages\"\n    | \"appointments\"\n    | \"tasks\"\n    | \"files\"\n    | \"directory\"\n    | \"more\"\n    | \"info\";\n};\n\nexport default function TixxtModuleSwitcher({ activeModule }: Props) {\n  const location = useLocation();\n  const theme = useSelector((state: State) => state.theme);\n  const duo = theme?.userbarIconType == \"duotone\";\n  const currentNetwork = useSelector(\n    (state: { network: { availableModules: string[] } }) => state.network,\n  );\n  const { data: unreads } = useFeaturesUnreads();\n\n  return (\n    <ModuleSwitcher className=\"userbar__module-switcher\">\n      {map(currentNetwork.availableModules, (moduleName, index) => {\n        const module = MODULE_LOOKUP[moduleName];\n        const notifications = unreads?.[moduleName];\n\n        return (\n          module && (\n            <ModuleSwitcher.Module\n              key={index}\n              {...module}\n              icon={module?.icon?.({\n                duo,\n                active: module.slug === activeModule,\n              })}\n              active={module.slug === activeModule}\n              notifications={notifications}\n            />\n          )\n        );\n      })}\n\n      {location.pathname.indexOf(\"/administration/designs\") === 0 ||\n      theme?.override ? (\n        <ModuleSwitcher.Module\n          title={\"Design\"}\n          url={\"/administration/designs\"}\n          active={location.pathname.indexOf(\"/administration/designs\") === 0}\n          icon={\n            duo ? (\n              <FontAwesomeIcon icon={duotone(\"brush\")} />\n            ) : (\n              <FontAwesomeIcon icon={light(\"brush\")} />\n            )\n          }\n        />\n      ) : null}\n\n      <ModuleSwitcher.Module\n        className=\"module-switcher__footer\"\n        key=\"info\"\n        title=\"Info\"\n        url=\"/imprint\"\n        active={activeModule === \"info\"}\n        icon={\n          <FontAwesomeIcon\n            icon={duo ? duotone(\"circle-info\") : light(\"circle-info\")}\n            className={activeModule === \"info\" ? \"fa-swap-opacity\" : \"\"}\n          />\n        }\n      />\n    </ModuleSwitcher>\n  );\n}\n","import React from \"react\";\n\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\nimport { map } from \"lodash\";\n\nexport default function InfoUserbar() {\n  const legalTexts = Preload.current_network.legal_texts;\n  const additionalLinks = Preload.current_network.additional_links;\n\n  return (\n    <>\n      {!window.isApp && <TixxtModuleSwitcher activeModule={\"info\"} />}\n      <ContextNavigation>\n        <UserbarSection title={I18n.t(\"js.userbar.content_section.title\")}>\n          <UserbarLink to=\"/imprint\">\n            {I18n.t(\"js.layouts.userbar.imprint.title\")}\n          </UserbarLink>\n          {map(legalTexts, (legalText) => (\n            <UserbarLink key={legalText.path} to={legalText.path}>\n              {legalText.name}\n            </UserbarLink>\n          ))}\n          {map(additionalLinks, (link) => (\n            <UserbarLink key={link.href} to={link.href} target=\"_blank\">\n              {link.text}\n            </UserbarLink>\n          ))}\n          {Preload.current_member &&\n            Preload.current_network.config.abuse_reports?.enabled && (\n              <UserbarLink to=\"/report/new\">\n                {I18n.t(\"report.report_content\")}\n              </UserbarLink>\n            )}\n        </UserbarSection>\n      </ContextNavigation>\n    </>\n  );\n}\n","import { useFeaturesUnreads } from \"api/unreads\";\nimport { mapValues, keyBy } from \"lodash\";\n\nconst useOpenJoinRequestsCount = () => {\n  const { data: featuresUnreads } = useFeaturesUnreads();\n  const openJoinRequestCount = mapValues(\n    keyBy(featuresUnreads?.GroupJoinRequests, \"group_slug\"),\n    (item) => item?.open_join_requests || 0,\n  );\n  return openJoinRequestCount;\n};\n\nexport default useOpenJoinRequestsCount;\n","import React from \"react\";\nimport { groupBy, map, mapValues, partition, sum, find, compact } from \"lodash\";\nimport { useSelector } from \"react-redux\";\nimport { matchPath, useLocation } from \"helpers/tixxt-router\";\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\nimport GroupCategorySections from \"../shared/GroupCategorySections\";\nimport { useActivitiesUnreads } from \"api/unreads\";\nimport indexBy from \"helpers/indexBy\";\nimport { State } from \"../../@types\";\nimport InfoUserbar from \"components/info/Userbar\";\nimport useOpenJoinRequestsCount from \"components/shared/hooks/useOpenJoinRequests\";\n\nexport default function ActivitystreamsUserbar() {\n  let networkStreams;\n  networkStreams = useSelector((state: State) => state.network.activitystreams);\n\n  if (Preload.current_member && Preload.current_member.is_external) {\n    networkStreams = [find(networkStreams, { slug: \"all\" })];\n  }\n  const { data: unreads } = useActivitiesUnreads();\n\n  const [groupUnreads, networkUnreads] = partition(unreads, \"group_slug\");\n  const networkUnreadsByStreamSlug = indexBy(\n    networkUnreads,\n    \"activitystream_slug\",\n  );\n\n  const unreadCountByGroupSlug = mapValues(\n    groupBy(groupUnreads, \"group_slug\"),\n    (values) => sum(map(values, \"unreads\")),\n  );\n\n  const location = useLocation();\n\n  const openJoinRequestCount = useOpenJoinRequestsCount();\n\n  const getUserbarLinkTitle = (groupSlug) => {\n    return compact([\n      unreadCountByGroupSlug[groupSlug]\n        ? `${I18n.t(\"js.activitystreams.module_name\")}: ${\n            unreadCountByGroupSlug[groupSlug]\n          }`\n        : null,\n      openJoinRequestCount[groupSlug]\n        ? `${I18n.t(\"js.administration.join_requests.label\")}: ${\n            openJoinRequestCount[groupSlug]\n          }`\n        : null,\n    ]).join(\" , \");\n  };\n\n  const unreadSumBySlug = mapValues(\n    unreadCountByGroupSlug,\n    (value, key) => value + (openJoinRequestCount[key] || 0),\n  );\n\n  if (!Tixxt.currentMember) return <InfoUserbar />;\n  return (\n    <>\n      <TixxtModuleSwitcher activeModule={\"activities\"} />\n      <ContextNavigation>\n        <UserbarSection title={I18n.t(\"js.userbar.content_section.title\")}>\n          {map(networkStreams, ({ slug, name }) => (\n            <UserbarLink\n              key={slug}\n              to={`/activitystreams/${slug}`}\n              unreads={networkUnreadsByStreamSlug[slug]?.sum}\n            >\n              {name}\n            </UserbarLink>\n          ))}\n        </UserbarSection>\n        <GroupCategorySections unreadCountByGroupSlug={unreadSumBySlug}>\n          {({ slug: groupSlug, name, favorited }, { collapsed }) => (\n            <UserbarLink\n              key={groupSlug}\n              className=\"relative\"\n              to={`/groups/${groupSlug}/activitystreams/all`}\n              active={matchPath(`/groups/${groupSlug}*`, location.pathname)}\n              showWhileClosed={favorited}\n              title={getUserbarLinkTitle(groupSlug)}\n              unreads={\n                unreadCountByGroupSlug[groupSlug] +\n                (openJoinRequestCount[groupSlug] || 0)\n              }\n              favorited={favorited}\n              collapsed={collapsed}\n            >\n              {name}\n            </UserbarLink>\n          )}\n        </GroupCategorySections>\n      </ContextNavigation>\n    </>\n  );\n}\n","import React from \"react\";\nimport TixxtModuleSwitcher from \"../layout/TixxtModuleSwitcher\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\n\nexport default function MessagesUserbar() {\n  return (\n    <>\n      <TixxtModuleSwitcher activeModule={\"messages\"} />\n      <ContextNavigation>\n        <UserbarSection title={I18n.t(\"js.userbar.content_section.title\")}>\n          <UserbarLink to=\"/messages\">\n            {I18n.t(\"js.messages.index.title\")}\n          </UserbarLink>\n          <UserbarLink to=\"/messages/sent\">\n            {I18n.t(\"js.messages.sent.title\")}\n          </UserbarLink>\n        </UserbarSection>\n      </ContextNavigation>\n    </>\n  );\n}\n","import React from \"react\";\n\nimport { compact } from \"lodash\";\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\nimport GroupCategorySections from \"../shared/GroupCategorySections\";\nimport { useFeaturesUnreads } from \"../../api/unreads\";\nimport UnreadBadge from \"components/shared/UnreadBadge\";\nimport useOpenJoinRequestsCount from \"components/shared/hooks/useOpenJoinRequests\";\n\nexport default function AppointmentsUserbar() {\n  const { data: unreads } = useFeaturesUnreads();\n\n  const unreadCount = unreads ? unreads?.Calendars : 0;\n  const openJoinRequestCount = useOpenJoinRequestsCount();\n\n  const getUserbarLinkTitle = (groupSlug) => {\n    return compact([\n      openJoinRequestCount[groupSlug]\n        ? `${I18n.t(\"js.administration.join_requests.label\")}: ${\n            openJoinRequestCount[groupSlug]\n          }`\n        : null,\n    ]).join(\" , \");\n  };\n\n  return (\n    <>\n      <TixxtModuleSwitcher activeModule={\"appointments\"} />\n      <ContextNavigation>\n        <UserbarSection title={I18n.t(\"js.userbar.content_section.title\")}>\n          <UserbarLink to=\"/appointments\">\n            {I18n.t(\"js.calendars.all_appointments\")}\n          </UserbarLink>\n          <UserbarLink to=\"/appointments/participating\">\n            {I18n.t(\"js.calendars.participating_appointments\")}\n          </UserbarLink>\n          <UserbarLink to=\"/appointments/invites\">\n            <div>\n              {I18n.t(\"js.calendars.invites.title\")}\n              <UnreadBadge count={unreadCount} className=\"ml-1\" />\n            </div>\n          </UserbarLink>\n        </UserbarSection>\n        <GroupCategorySections unreadCountByGroupSlug={openJoinRequestCount}>\n          {({ slug, name, favorited }, { collapsed }) => (\n            <UserbarLink\n              key={slug}\n              className=\"relative\"\n              to={`/groups/${slug}/calendars`}\n              showWhileClosed={favorited}\n              title={getUserbarLinkTitle(slug)}\n              unreads={openJoinRequestCount[slug] || 0}\n              favorited={favorited}\n              collapsed={collapsed}\n            >\n              {name}\n            </UserbarLink>\n          )}\n        </GroupCategorySections>\n      </ContextNavigation>\n    </>\n  );\n}\n","import React from \"react\";\nimport { compact } from \"lodash\";\n\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\nimport GroupCategorySections from \"../shared/GroupCategorySections\";\nimport useOpenJoinRequestsCount from \"components/shared/hooks/useOpenJoinRequests\";\n\nexport default function TasksUserbar() {\n  const openJoinRequestCount = useOpenJoinRequestsCount();\n\n  const getUserbarLinkTitle = (groupSlug) => {\n    return compact([\n      openJoinRequestCount[groupSlug]\n        ? `${I18n.t(\"js.administration.join_requests.label\")}: ${\n            openJoinRequestCount[groupSlug]\n          }`\n        : null,\n    ]).join(\" , \");\n  };\n  return (\n    <>\n      <TixxtModuleSwitcher activeModule={\"tasks\"} />\n      <ContextNavigation>\n        <UserbarSection title={I18n.t(\"js.userbar.content_section.title\")}>\n          <UserbarLink to=\"/tasks/my\">\n            {I18n.t(\"js.tasks.my_tasks\")}\n          </UserbarLink>\n          <UserbarLink to=\"/tasks/assigned\">\n            {\"  Anderen zugewiesen\"}\n          </UserbarLink>\n          <UserbarLink to=\"/tasks/declined\">{\"  Abgelehnt\"}</UserbarLink>\n          <UserbarLink to=\"/tasks/starred\">{\"  Markiert\"}</UserbarLink>\n          <UserbarLink to=\"/tasks/archive\">{\"  Archiv\"}</UserbarLink>\n          <UserbarLink to=\"/tasks/notes\">{\"  Notizen\"}</UserbarLink>\n        </UserbarSection>\n        <GroupCategorySections unreadCountByGroupSlug={openJoinRequestCount}>\n          {({ slug, name, favorited }, { collapsed }) => (\n            <UserbarLink\n              className=\"relative\"\n              key={slug}\n              to={`/groups/${slug}/tasks`}\n              showWhileClosed={favorited}\n              title={getUserbarLinkTitle(slug)}\n              unreads={openJoinRequestCount[slug] || 0}\n              favorited={favorited}\n              collapsed={collapsed}\n            >\n              {name}\n            </UserbarLink>\n          )}\n        </GroupCategorySections>\n      </ContextNavigation>\n    </>\n  );\n}\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\n\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\nimport GroupCategorySections from \"../shared/GroupCategorySections\";\nimport { networkNameSelector } from \"../../selectors/environment\";\nimport { useFoldersUnreads } from \"../../api/unreads\";\nimport { filter, find, mapValues, compact } from \"lodash\";\nimport indexBy from \"../../helpers/indexBy\";\nimport useOpenJoinRequestsCount from \"components/shared/hooks/useOpenJoinRequests\";\n\nexport default function FilesUserbar() {\n  const networkName = useSelector(networkNameSelector);\n  const { data: unreads } = useFoldersUnreads();\n  const networkUnreadCount = find(unreads, { group_slug: null })?.sum;\n  // Lookup for unread counts of groups\n  const unreadCountByGroupSlug: { [slug: string]: number } = mapValues(\n    indexBy(\n      filter(unreads, ({ group_slug }) => group_slug),\n      \"group_slug\",\n    ),\n    \"sum\",\n  );\n\n  const openJoinRequestCount = useOpenJoinRequestsCount();\n\n  const getUserbarLinkTitle = (groupSlug) => {\n    return compact([\n      unreadCountByGroupSlug[groupSlug]\n        ? `${I18n.t(\"js.files.module_name\")}: ${\n            unreadCountByGroupSlug[groupSlug]\n          }`\n        : null,\n      openJoinRequestCount[groupSlug]\n        ? `${I18n.t(\"js.administration.join_requests.label\")}: ${\n            openJoinRequestCount[groupSlug]\n          }`\n        : null,\n    ]).join(\" , \");\n  };\n\n  const unreadSumBySlug = mapValues(\n    unreadCountByGroupSlug,\n    (value, key) => value + (openJoinRequestCount[key] || 0),\n  );\n\n  return (\n    <>\n      <TixxtModuleSwitcher activeModule={\"files\"} />\n      <ContextNavigation>\n        <UserbarSection title={I18n.t(\"js.userbar.content_section.title\")}>\n          <UserbarLink to={`/files`} unreads={networkUnreadCount}>\n            {networkName}\n          </UserbarLink>\n        </UserbarSection>\n        <GroupCategorySections unreadCountByGroupSlug={unreadSumBySlug}>\n          {({ slug, name, favorited }, { collapsed }) => (\n            <UserbarLink\n              className=\"relative\"\n              key={slug}\n              to={`/groups/${slug}/files`}\n              title={getUserbarLinkTitle(slug)}\n              unreads={\n                unreadCountByGroupSlug[slug] + (openJoinRequestCount[slug] || 0)\n              }\n              showWhileClosed={favorited}\n              favorited={favorited}\n              collapsed={collapsed}\n            >\n              {name}\n            </UserbarLink>\n          )}\n        </GroupCategorySections>\n      </ContextNavigation>\n    </>\n  );\n}\n","import React from \"react\";\n\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\n\nimport { map, some } from \"lodash\";\nimport { useAdministrationUserbarLinks } from \"./api\";\nimport { useParams, matchPath } from \"helpers/tixxt-router\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../@types\";\nimport {\n  groupCategorySelector,\n  groupSelector,\n  networkSelector,\n} from \"selectors/environment\";\nimport { userbarVariables } from \"components/shared/GroupCategorySections\";\n\nexport default function AdministrationUserbar() {\n  const { groupSlug, groupCategorySlug } = useParams();\n  const group = useSelector((state: State) => groupSelector(state, groupSlug));\n  const groupCategory = useSelector((state: State) =>\n    groupCategorySelector(state, groupCategorySlug),\n  );\n  const network = useSelector(networkSelector);\n  const {\n    data: sections,\n    status,\n    refetch,\n  } = useAdministrationUserbarLinks({\n    groupSlug,\n    groupCategorySlug,\n  });\n  const groupCategoryTheme = useSelector(\n    (state: State) => state.groupCategoryTheme,\n  );\n\n  const style = groupCategory\n    ? userbarVariables(groupCategoryTheme)\n    : undefined;\n\n  const title = group\n    ? group.name\n    : groupCategory\n      ? groupCategory.name\n      : network.name;\n\n  let elements;\n  switch (status) {\n    case \"error\":\n      elements = (\n        <UserbarSection\n          title={title}\n          extraChildren={\n            <div className={\"alert alert-danger\"} role=\"alert\">\n              {I18n.t(\"js.generic_error\")}\n              <br />\n              <a\n                href=\"#\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  refetch();\n                }}\n              >\n                {I18n.t(\"js.generic_try_again\")}\n              </a>\n            </div>\n          }\n          style={style}\n        />\n      );\n      break;\n\n    case \"loading\":\n      elements = (\n        <UserbarSection title={title} className={\"animate-pulse\"} style={style}>\n          <UserbarLink\n            key={0}\n            to={`/groups/${groupSlug}/administration`}\n            active={false}\n          >\n            {I18n.t(\"js.loading\")}\n          </UserbarLink>\n        </UserbarSection>\n      );\n      break;\n    case \"success\":\n      elements = map(sections, (section, index) => (\n        <React.Fragment key={index}>\n          {section.image ? (\n            <img src={section.image.src} aria-hidden={true} alt={\"\"} />\n          ) : null}\n          <UserbarSection title={section.title} style={style}>\n            {map(section.links, (link, index) => (\n              <UserbarLink\n                key={index}\n                to={link.path}\n                unreads={link.unreads}\n                target={link.target}\n                prefixMatch={!link.exact}\n                active={\n                  link.alternative_paths\n                    ? some(link.alternative_paths, (path) =>\n                        matchPath(path, location.pathname),\n                      ) || undefined\n                    : undefined\n                }\n              >\n                {link.label}\n              </UserbarLink>\n            ))}\n          </UserbarSection>\n        </React.Fragment>\n      ));\n  }\n\n  return (\n    <>\n      <TixxtModuleSwitcher />\n      <ContextNavigation>{elements}</ContextNavigation>\n    </>\n  );\n}\n","import { useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { stringify } from \"query-string\";\n\ntype AdministrationUserbarResponse = {\n  title: string;\n  links: {\n    label: string;\n    path: string;\n    unreads?: number;\n    target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n    exact?: boolean;\n    alternative_paths?: string[];\n  }[];\n  image?: {\n    src: string;\n  };\n}[];\n\nexport function useAdministrationUserbarLinks({\n  groupSlug,\n  groupCategorySlug,\n}: { groupSlug?: string; groupCategorySlug?: string } = {}) {\n  const params = groupSlug\n    ? { context_type: \"group\", context_id: groupSlug }\n    : groupCategorySlug\n      ? { context_type: \"group_category\", context_id: groupCategorySlug }\n      : { context_type: \"network\" };\n\n  return useQuery<AdministrationUserbarResponse>(\n    [\"userbars\", \"administration\", params],\n    () => fetchApi(`/api/v1/userbars/administration?${stringify(params)}`),\n    { refetchOnWindowFocus: false },\n  );\n}\n\n// Membership Api calls\nexport interface Membership {\n  id: string;\n}\n\nexport function useMembershipProfile(membershipId: string | undefined) {\n  return useQuery<Membership>(`/api/v1/profiles/${membershipId}`, {\n    enabled: !!membershipId,\n  });\n}\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\nimport GroupCategorySections from \"../shared/GroupCategorySections\";\nimport { networkNameSelector } from \"selectors/environment\";\nimport { useSearchParams } from \"helpers/tixxt-router\";\nimport { stringify } from \"query-string\";\n\nexport default function SearchUserbar() {\n  const networkName = useSelector(networkNameSelector);\n  const [searchParams] = useSearchParams();\n  const query = stringify(Object.fromEntries(searchParams.entries()));\n  const pathAndQuery = query.length > 0 ? `/search?${query}` : \"/search\";\n\n  return (\n    <>\n      <TixxtModuleSwitcher />\n      <ContextNavigation>\n        <UserbarSection>\n          <UserbarLink to={pathAndQuery}>{networkName}</UserbarLink>\n        </UserbarSection>\n        <GroupCategorySections>\n          {({ slug, name, favorited }) => (\n            <UserbarLink\n              key={slug}\n              to={`/groups/${slug}${pathAndQuery}`}\n              showWhileClosed={favorited}\n            >\n              {name}\n            </UserbarLink>\n          )}\n        </GroupCategorySections>\n      </ContextNavigation>\n    </>\n  );\n}\n","import React from \"react\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport classNames from \"classnames\";\nimport { useMembership } from \"../../api/memberships\";\n\nexport default function MembershipsUserbar() {\n  let { membershipId } = useParams();\n  membershipId = (membershipId || Preload.current_member?.id) as\n    | string\n    | undefined;\n  const { data: membership } = useMembership(membershipId);\n\n  return (\n    <>\n      <TixxtModuleSwitcher activeModule={\"directory\"} />\n      <ContextNavigation>\n        {membership && (\n          <img\n            src={membership.images.large}\n            className=\"w-full mt-4 rounded\"\n            aria-hidden\n          />\n        )}\n        <UserbarSection className=\"border-none\">\n          <UserbarLink to={`/members/${membershipId}`}>\n            {I18n.t(\"js.memberships.userbar.informations\")}\n          </UserbarLink>\n          <UserbarLink to={`/members/${membershipId}/activities`}>\n            {I18n.t(\"js.memberships.userbar.activities\")}\n          </UserbarLink>\n          <UserbarLink to={`/members/${membershipId}/likes`}>\n            {I18n.t(\"js.memberships.userbar.interesting\")}\n          </UserbarLink>\n        </UserbarSection>\n        {membership && (\n          <UserbarSection\n            title={I18n.t(\"js.memberships.userbar.my_account\")}\n            className={classNames({\n              hidden: Preload.current_member?.id !== membershipId,\n            })}\n          >\n            <UserbarLink\n              to={`/users/edit`}\n              className={classNames({\n                hidden: !membership?.can.update_registration,\n              })}\n            >\n              {I18n.t(\"js.memberships.userbar.edit_registration\")}\n            </UserbarLink>\n            <UserbarLink\n              to={`/members/${membership.id}/edit`}\n              className={classNames({\n                hidden: !membership?.can.update_profile,\n              })}\n            >\n              {I18n.t(\"js.memberships.userbar.edit_profile\")}\n            </UserbarLink>\n            <UserbarLink\n              to={`/members/${membership.id}/ignored`}\n              className={classNames({\n                hidden: !membership?.can.update_profile,\n              })}\n            >\n              {I18n.t(\"js.memberships.userbar.ignored_members\")}\n            </UserbarLink>\n          </UserbarSection>\n        )}\n      </ContextNavigation>\n    </>\n  );\n}\n","import { useQuery } from \"react-query\";\nimport { State } from \"../@types\";\nimport queryClient from \"helpers/queryClient\";\n\nif (Preload.current_member?.id) {\n  queryClient.setQueryData(\n    `/members/${Preload.current_member.id}`,\n    () => Preload.current_member,\n  );\n}\n\nexport function useMembership(id: string | undefined) {\n  return useQuery<State[\"currentMember\"]>(`/members/${id}`, {\n    staleTime: Infinity,\n    enabled: !!id,\n  });\n}\n","import React from \"react\";\nimport {\n  ContextNavigation,\n  UserbarLink,\n  UserbarSection,\n} from \"components/layout/Userbar\";\n\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport { useSelector } from \"react-redux\";\nimport { networkNameSelector } from \"selectors/environment\";\nimport { useSearchParams } from \"helpers/tixxt-router\";\nimport GroupCategorySections from \"components/shared/GroupCategorySections\";\n\nexport default function DirectoryUserbar({ map }: { map?: boolean }) {\n  const networkName = useSelector(networkNameSelector);\n  const [searchParams] = useSearchParams();\n  const query = searchParams.toString();\n  const path = map ? \"/map\" : \"/members\";\n  const pathAndQuery = query.length > 0 ? `${path}?${query}` : path;\n\n  return (\n    <>\n      <TixxtModuleSwitcher activeModule={undefined} />\n      <ContextNavigation>\n        <UserbarSection>\n          <UserbarLink to={pathAndQuery}>{networkName}</UserbarLink>\n        </UserbarSection>\n        <GroupCategorySections>\n          {({ slug, name, favorited }, { collapsed }) => (\n            <UserbarLink\n              key={slug}\n              className=\"relative\"\n              to={`/groups/${slug}${pathAndQuery}`}\n              showWhileClosed={favorited}\n              favorited={favorited}\n              collapsed={collapsed}\n            >\n              {name}\n            </UserbarLink>\n          )}\n        </GroupCategorySections>\n      </ContextNavigation>\n    </>\n  );\n}\n","import React, { useEffect } from \"react\";\nimport InfoUserbar from \"components/info/Userbar\";\n\nexport default function PagesUserbar() {\n  useEffect(() => {\n    document.body.classList.add(\"tixxt--network-page\");\n    return () => document.body.classList.remove(\"tixxt--network-page\");\n  }, []);\n\n  return <InfoUserbar />;\n}\n","import React, { useEffect } from \"react\";\nimport InfoUserbar from \"components/info/Userbar\";\n\nexport default function AppCreatorUserbar() {\n  useEffect(() => {\n    document.body.classList.add(\"tixxt--network-app\");\n    return () => document.body.classList.remove(\"tixxt--network-app\");\n  }, []);\n\n  return <InfoUserbar />;\n}\n","import React, { useMemo } from \"react\";\nimport { RouteObject, useRoutes } from \"helpers/tixxt-router\";\nimport { flatMap } from \"lodash\";\n\nimport { UserbarContent } from \"components/layout/Userbar\";\nimport ActivitystreamsUserbar from \"components/activitystreams/Userbar\";\nimport MessagesUserbar from \"components/messages/Userbar\";\nimport AppointmentsUserbar from \"components/appointments/Userbar\";\nimport TasksUserbar from \"components/tasks/Userbar\";\nimport FilesUserbar from \"components/files/Userbar\";\nimport AdministrationUserbar from \"components/administration/Userbar\";\nimport InfoUserbar from \"components/info/Userbar\";\nimport SearchUserbar from \"components/globalSearch/Userbar\";\nimport MembershipsUserbar from \"components/memberships/Userbar\";\nimport DirectoryUserbar from \"components/directory/Userbar\";\nimport PagesUserbar from \"components/pages/Userbar\";\nimport AppCreatorUserbar from \"components/appCreator/Userbar\";\n\n/*\nExpands the given rootPath into routes for network and group context as well as all subpaths (via wildcard)\n */\nfunction expandRootPaths(\n  rootPaths: string[],\n  routeObject: Omit<RouteObject, \"path\">,\n): RouteObject[] {\n  return flatMap(rootPaths, (rootPath) => [\n    { ...routeObject, path: rootPath + \"/*\" },\n    { ...routeObject, path: \"/groups/:groupSlug\" + rootPath + \"/*\" },\n  ]);\n}\n\nfunction moduleRoutes(): RouteObject[] {\n  return [\n    ...expandRootPaths(\n      [\"/activitystreams\", \"/activities\", \"/invites\", \"/notifications\"],\n      { element: <ActivitystreamsUserbar /> },\n    ),\n    ...expandRootPaths([\"/messages\"], { element: <MessagesUserbar /> }),\n    ...expandRootPaths([\"/appointments\", \"/calendars\"], {\n      element: <AppointmentsUserbar />,\n    }),\n    ...expandRootPaths([\"/tasks\"], { element: <TasksUserbar /> }),\n    ...expandRootPaths([\"/files\"], { element: <FilesUserbar /> }),\n  ];\n}\n\nfunction extraRoutes(): RouteObject[] {\n  return [\n    { path: \"/info\", element: <InfoUserbar /> },\n    { path: \"/imprint\", element: <InfoUserbar /> },\n    { path: \"/search\", element: <SearchUserbar /> },\n    { path: \"/groups/:groupSlug/search\", element: <SearchUserbar /> },\n    { path: \"/administration/*\", element: <AdministrationUserbar /> },\n    {\n      path: \"/groups/:groupSlug/administration/*\",\n      element: <AdministrationUserbar />,\n    },\n    {\n      path: \"/group-categories/:groupCategorySlug/administration/*\",\n      element: <AdministrationUserbar />,\n    },\n    {\n      path: \"/groups/:groupSlug/invites/sent\",\n      element: <AdministrationUserbar />,\n    },\n    {\n      path: \"/groups/:groupSlug/membership_invites/new\",\n      element: <DirectoryUserbar />,\n    },\n    { path: \"/groups/:groupSlug/edit\", element: <AdministrationUserbar /> },\n    { path: \"/invites/sent\", element: <AdministrationUserbar /> },\n    { path: \"/invites/new\", element: <AdministrationUserbar /> },\n    { path: \"/groups/:groupSlug/members\", element: <DirectoryUserbar /> },\n    { path: \"/directory/:sectionSlug\", element: <DirectoryUserbar /> },\n    { path: \"/members\", element: <DirectoryUserbar /> },\n    { path: \"/map\", element: <DirectoryUserbar map /> },\n    { path: \"/map/members\", element: <DirectoryUserbar map /> },\n    { path: \"/groups/:groupSlug/map\", element: <DirectoryUserbar map /> },\n    { path: \"/groups/:groupSlug\", element: <ActivitystreamsUserbar /> },\n    { path: \"/pages/:pageSlug\", element: <PagesUserbar /> },\n    { path: \"/pages/:pageSlug/*\", element: <PagesUserbar /> },\n    { path: \"/apps/:appSlug\", element: <AppCreatorUserbar /> },\n    { path: \"/apps/:appSlug/*\", element: <AppCreatorUserbar /> },\n    {\n      path: \"/groups/:groupSlug/pages/:pageSlug\",\n      element: <DirectoryUserbar />,\n    },\n    { path: \"/members/:membershipId\", element: <MembershipsUserbar /> },\n    { path: \"/members/:membershipId/*\", element: <MembershipsUserbar /> },\n    { path: \"/users/edit\", element: <MembershipsUserbar /> },\n    { path: \"/users/sign_in\", element: null },\n    { path: \"/users/password/new\", element: null },\n    { path: \"/*\", element: <InfoUserbar /> },\n  ];\n}\n\n/*\nThis component is nothing more than routes, some of which are conditional, to the individual Userbars\n */\nexport default function TixxtUserbar() {\n  const routes = useMemo(() => [...moduleRoutes(), ...extraRoutes()], []);\n  const element = useRoutes(routes);\n\n  return <UserbarContent id=\"userbar\">{element}</UserbarContent>;\n}\n","import React, { Suspense } from \"react\";\n\nconst ChatBar = React.lazy(() => import(\"../chat/ChatBar\"));\n\nexport default function TixxtUserbar() {\n  return (\n    <Suspense fallback={\"Loading...\"}>\n      <ChatBar />\n    </Suspense>\n  );\n}\n","import React from \"react\";\nimport { useParams, useRoutes } from \"helpers/tixxt-router\";\nimport GroupNavigation from \"components/layout/GroupNavigation\";\nimport { GroupNavigationPortal } from \"components/layout/portals\";\n\n/* This is used together with the backbone marionette frontend */\nexport default function TixxtGroupNavigation() {\n  const params = useParams();\n  const groupSlug = params.group_slug || params.groupSlug || params.group_id;\n\n  if (groupSlug) return <GroupNavigation groupSlug={groupSlug} />;\n\n  return null;\n}\n\n/* This is used to render the group navigation on backend rendered pages */\nexport function StaticTixxtGroupNavigation() {\n  const elem = useRoutes([\n    { path: \"/groups/:groupSlug\", element: <TixxtGroupNavigation /> },\n    { path: \"/groups/:groupSlug/*\", element: <TixxtGroupNavigation /> },\n  ]);\n\n  if (!elem || Preload.current_group?.externally_visible) return null;\n\n  return <GroupNavigationPortal>{elem}</GroupNavigationPortal>;\n}\n","import { useParams, useRoutes } from \"helpers/tixxt-router\";\nimport React from \"react\";\nimport { ContextPageTitle } from \"components/layout/PageTitle\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../@types\";\nimport store from \"../../store\";\nimport { setTitle } from \"reducers/app\";\nimport { PageTitlePortal } from \"components/layout/portals\";\n\n/* This is used by Backbone to set a different title */\nwindow.setTixxtPageTitle = function setTixxtPageTitle(title: string): void {\n  document\n    .getElementById(\"static-page-title\")\n    ?.classList.toggle(\"!hidden\", !!title);\n  if ((store.getState() as State).app.title !== title)\n    store.dispatch(setTitle(title));\n};\n\n/* This is used together with the backbone marionette frontend */\nexport default function TixxtPageTitle() {\n  const title = useSelector((state: State) => state.app.title);\n  const params = useParams();\n  const groupSlug = params.group_slug || params.groupSlug || params.group_id;\n\n  if (!title && !groupSlug) return null;\n\n  return <ContextPageTitle title={title} groupSlug={groupSlug} />;\n}\n\n/* This is used to render the group title on backend rendered pages */\nexport function StaticTixxtPageTitle() {\n  const elem = useRoutes([\n    { path: \"/groups/:groupSlug\", element: <TixxtPageTitle /> },\n    { path: \"/groups/:groupSlug/pages/:pageSlug\", element: <TixxtPageTitle /> },\n    { path: \"/groups/:groupSlug/*\", element: <TixxtPageTitle /> },\n    { path: \"/apps/*\", element: <TixxtPageTitle /> },\n  ]);\n\n  if (!elem) return null;\n\n  return <PageTitlePortal>{elem}</PageTitlePortal>;\n}\n","export const useRecurringAppointment = (\n  appointmentId: string | null | undefined,\n): boolean => {\n  return !!appointmentId?.match(/^(r-)[0-9a-f]{24}-.*/);\n};\n","import React, { useEffect, useState } from \"react\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport TixxtPageTitle from \"components/layout/TixxtPageTitle\";\nimport { useRecurringAppointment } from \"../../hooks/useRecurringAppointment\";\n\ntype AppointmentTitleData = {\n  id: string;\n  name: string;\n  type: \"appointment\" | \"recurring_appointment\" | \"virtual_appointment\";\n};\n\nexport function AppointmentPageTitle() {\n  const { appointmentId } = useParams();\n  const [appointment, setAppointment] = useState<AppointmentTitleData>();\n\n  useEffect(() => {\n    const appointments = Tixxt.Calendars.Appointment.all();\n    const assignAppointment = (model, data: AppointmentTitleData) => {\n      if (data.id == appointmentId) setAppointment(data);\n    };\n    appointments.on(\"sync change add reset\", assignAppointment);\n    return () => appointments.off(\"sync change add reset\", assignAppointment);\n  }, [appointmentId]);\n\n  const isRecurring =\n    useRecurringAppointment(appointmentId) ||\n    appointment?.type == \"recurring_appointment\" ||\n    appointment?.type == \"virtual_appointment\";\n\n  if (!isRecurring) return <TixxtPageTitle />;\n\n  return (\n    <PageTitle title={appointment?.name || I18n.t(\"js.loading\")}>\n      <FontAwesomeIcon\n        icon={regular(\"arrows-repeat\")}\n        title={I18n.t(\"js.recurring_appointment.icon.title\")}\n      />\n    </PageTitle>\n  );\n}\n","import React, { useEffect } from \"react\";\nimport {\n  RouteObject,\n  useParams,\n  useRoutes,\n  useSearchParams,\n} from \"helpers/tixxt-router\";\nimport { at, defer, flatMap } from \"lodash\";\nimport invariant from \"invariant\";\nimport TixxtGroupNavigation from \"components/layout/TixxtGroupNavigation\";\nimport TixxtPageTitle from \"components/layout/TixxtPageTitle\";\nimport documentReady from \"helpers/documentReady\";\nimport { AppointmentPageTitle } from \"components/appointments/AppointmentPageTitle\";\n\ntype Props = {\n  feature: string;\n  action: string;\n  paramKeys: string[];\n};\n\nfunction toggleBackbone(show: boolean) {\n  document.getElementById(\"backbone-root\")?.classList.toggle(\"hidden\", !show);\n}\n\nexport default function BackboneFeature({ feature, action, paramKeys }: Props) {\n  const params = useParams();\n  const actionArguments = at(params, paramKeys);\n\n  const [searchParams] = useSearchParams();\n  const query = {};\n  searchParams.forEach((k, v) => (query[v] = k));\n\n  useEffect(() => {\n    toggleBackbone(true);\n    return function () {\n      toggleBackbone(false);\n    };\n  }, []);\n\n  useEffect(() => {\n    return function () {\n      Tixxt.stopFeature();\n    };\n  }, [feature]);\n\n  useEffect(() => {\n    documentReady(() =>\n      defer(() => {\n        Tixxt.startFeature(feature, action, [...actionArguments, query]);\n      }),\n    );\n  }, [feature, action, params, query]);\n\n  const elem = useRoutes([\n    { path: \"/appointments/:appointmentId\", element: <AppointmentPageTitle /> },\n    { path: \"/groups/:groupSlug/*\", element: <TixxtPageTitle /> },\n    { path: \"*\", element: <TixxtPageTitle /> },\n  ]);\n\n  return (\n    <>\n      {elem}\n      <TixxtGroupNavigation />\n    </>\n  );\n}\n\nconst paramRegex = /:(\\w+)/g;\n\nexport function convertRoutes({ feature, featureRoutes }): RouteObject[] {\n  function route(\n    path: string,\n    action: string,\n    omittedParamKeys: string[] = [],\n  ) {\n    const paramKeys = Array.from(\n      path.matchAll(paramRegex),\n      ([, capture]) => capture,\n    );\n    return {\n      path,\n      element: (\n        <BackboneFeature\n          feature={feature}\n          action={action}\n          paramKeys={omittedParamKeys.concat(paramKeys)}\n        />\n      ),\n    };\n  }\n\n  return flatMap(featureRoutes, (action, path) => {\n    // path with optional group slug\n    if (path.startsWith(\"(groups/:group_slug/)\")) {\n      const networkPath = path.replace(\"(groups/:group_slug/)\", \"\");\n      const groupPath = path.replace(\n        \"(groups/:group_slug/)\",\n        \"/groups/:group_slug/\",\n      );\n      return [\n        route(\"/\" + networkPath, action, [\"group_slug\"]),\n        route(groupPath, action),\n      ];\n    }\n\n    invariant(\n      path.indexOf(\"(\") == -1,\n      `path for convertRoutes must not contain other optional segments, got \"${path}\"`,\n    );\n\n    // regular path\n    return [route(\"/\" + path, action)];\n  });\n}\n","import { convertRoutes } from \"components/tixxt/BackboneFeature\";\nimport { RouteObject } from \"helpers/tixxt-router\";\n\nconst activitystreamsRoutes: RouteObject[] = convertRoutes({\n  feature: \"Activitystreams\",\n  featureRoutes: {\n    \"(groups/:group_slug/)activitystreams\": \"showStream\",\n    \"(groups/:group_slug/)activitystreams/:stream_slug\": \"showStream\",\n    \"(groups/:group_slug/)activitystreams/:stream_slug/:filter\":\n      \"showSubstream\",\n    rundschreiben: \"showRundschreibenEditor\",\n    \"activities/:id\": \"showActivity\",\n    \"activities/:activity_id/replies/:comment_id\": \"showActivity\",\n    \"activities/:activity_id/answers/:comment_id\": \"showActivity\",\n    notifications: \"showNotifications\",\n  },\n});\n\nexport default activitystreamsRoutes;\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular, solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport DropDown, { DropDownItem } from \"components/shared/DropDown\";\nimport { ViewType } from \"components/appointments/useAppointmentView\";\nimport moment from \"moment\";\nimport { groupBy, includes, isEmpty, map, sortBy } from \"lodash\";\nimport { Calendar } from \"../../@types/appointments\";\nimport Datepicker from \"helpers/Datepicker\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../@types\";\n\ntype AppointmentToolbarArgs = {\n  isLoading: boolean;\n  view: ViewType;\n  setViewType: (viewType: ViewType) => void;\n  date: string;\n  setDate: (date: string) => void;\n  calendars?: Calendar[];\n  toggleExcludedCalendarIds: (calendarId: string) => void;\n  excludedCalendarIds: string[];\n  scrollToToday: () => void;\n  canCreate?: boolean;\n};\n\nexport default function AppointmentToolbar({\n  isLoading,\n  view,\n  setViewType,\n  date,\n  setDate,\n  calendars,\n  toggleExcludedCalendarIds,\n  excludedCalendarIds,\n  canCreate = false,\n  scrollToToday,\n}: AppointmentToolbarArgs) {\n  const datePickerRef = useRef<HTMLInputElement>(null);\n\n  const { groupSlug } = useParams();\n  const group = useSelector((state: State) =>\n    groupSlug ? state.groups.bySlug?.[groupSlug] : null,\n  );\n  const calendarId = !isEmpty(group)\n    ? calendars?.find(\n        (cal) =>\n          cal.type === \"group\" &&\n          cal.parent_id === group?.id &&\n          cal.can.create_appointments,\n      )?.id\n    : undefined;\n\n  useEffect(() => {\n    const datepicker = new Datepicker(datePickerRef.current, {\n      pickLevel: 1,\n    });\n\n    datepicker.element.addEventListener(\"changeDate\", (event) =>\n      setDate(moment(event.detail.date).format()),\n    );\n\n    return () => datepicker.destroy();\n  }, [date, datePickerRef]);\n\n  return (\n    <div className=\"btn-toolbar mb-10\">\n      <div className=\"btn-group order-1\">\n        <button\n          className={classNames(\"btn btn-light btn-sm\", {\n            active: moment(date).isSame(moment(), \"day\"),\n          })}\n          onClick={() => {\n            setDate(moment().format());\n            scrollToToday();\n          }}\n          title={I18n.t(\"js.calendars.overview.today\")}\n        >\n          <FontAwesomeIcon icon={regular(\"share\")} className=\"mr-1\" />\n          {I18n.t(\"js.calendars.overview.today\")}\n        </button>\n      </div>\n      <div className=\"order-3 w-full text-center sm:order-2 sm:w-auto\">\n        <button\n          className=\"btn\"\n          onClick={() => setDate(moment(date).subtract(1, \"month\").format())}\n          title={I18n.t(\"js.calendars.overview.last_month\")}\n        >\n          <FontAwesomeIcon icon={solid(\"caret-left\")} />\n        </button>\n        <button\n          className=\"btn btn-light datepicker-button relative\"\n          title={I18n.t(\"js.calendars.overview.current_month\")}\n          onClick={() => datePickerRef.current?.focus()}\n        >\n          {isLoading ? (\n            <FontAwesomeIcon icon={regular(\"spinner\")} className=\"fa-spin\" />\n          ) : (\n            <FontAwesomeIcon icon={regular(\"calendar-day\")} className=\"mr-1\" />\n          )}\n          {moment(date).format(\"MMMM YYYY\")}\n          <input\n            ref={datePickerRef}\n            className=\"sr-only datepicker-input left-0 top-[38px]\"\n            value={moment(date).format(\n              I18n.t(\"js.plugins.Locale.Formats.valid_date\"),\n            )}\n            readOnly\n          />\n        </button>\n        <button\n          className=\"btn\"\n          onClick={() => setDate(moment(date).add(1, \"month\").format())}\n          title={I18n.t(\"js.calendars.overview.next_month\")}\n        >\n          <FontAwesomeIcon icon={solid(\"caret-right\")} />\n        </button>\n      </div>\n      <div className=\"order-2 sm:order-3\">\n        <button\n          className={classNames(\"btn btn-light btn-sm\", {\n            active: !isEmpty(excludedCalendarIds),\n          })}\n          data-bs-toggle=\"dropdown\"\n          title={I18n.t(\"js.calendars.overview.filter_calendars\")}\n          disabled={!calendars || calendars.length === 0}\n        >\n          <FontAwesomeIcon icon={regular(\"filter\")} />\n        </button>\n        <CalendarFilterDropdown\n          calendars={calendars || []}\n          excludedCalendarIds={excludedCalendarIds}\n          toggleExcludedCalendarIds={toggleExcludedCalendarIds}\n        />\n        <div className=\"btn btn-group\">\n          <button\n            className={classNames(\"btn btn-light btn-sm\", {\n              active: view === \"sheet\",\n            })}\n            onClick={() => setViewType(\"sheet\")}\n            title={I18n.t(\"js.calendars.overview.view.calendar_sheet\")}\n          >\n            <FontAwesomeIcon icon={regular(\"table-cells\")} />\n          </button>\n          <button\n            className={classNames(\"btn btn-light btn-sm\", {\n              active: view === \"list\",\n            })}\n            onClick={() => setViewType(\"list\")}\n            title={I18n.t(\"js.calendars.overview.view.list\")}\n          >\n            <FontAwesomeIcon icon={regular(\"list\")} />\n          </button>\n        </div>\n        <div className=\"btn-group\">\n          {canCreate && (\n            <a\n              className=\"btn btn-primary\"\n              href={`/appointments/new${\n                calendarId ? \"?calendar_id=\" + calendarId : \"\"\n              }`}\n            >\n              {I18n.t(\"js.calendars.overview.headline.add_appointment\")}\n            </a>\n          )}\n          <button\n            className=\"btn btn-light dropdown-toggle\"\n            data-bs-toggle=\"dropdown\"\n          >\n            <FontAwesomeIcon icon={regular(\"ellipsis-h\")} />\n          </button>\n          <DropDown className=\"dropdown-menu context-menu\">\n            <DropDownItem\n              url=\"/calendars/manage\"\n              icon={regular(\"cogs\")}\n              text={I18n.t(\"js.calendars.overview.headline.manage_calendars\")}\n            />\n            <DropDownItem\n              url=\"/calendars/subscribe\"\n              icon={regular(\"calendar-day\")}\n              text={I18n.t(\"js.calendars.overview.headline.calendar_subscribe\")}\n            />\n          </DropDown>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction CalendarFilterDropdown({\n  calendars,\n  excludedCalendarIds,\n  toggleExcludedCalendarIds,\n}: {\n  calendars: Calendar[];\n  excludedCalendarIds: string[];\n  toggleExcludedCalendarIds: (calendarId: string) => void;\n}) {\n  const typeLabels = {\n    network: I18n.t(\"js.calendars.types.network\"),\n    personal: I18n.t(\"js.calendars.types.personal\"),\n  };\n\n  const sortedGroupedCalendars = useMemo(() => {\n    const grouped = groupBy(calendars, \"type\");\n    return [\n      ...(!isEmpty(grouped[\"network\"] || [])\n        ? [\n            {\n              type: \"network\",\n              calendars: sortBy(grouped[\"network\"], \"name\"),\n            },\n          ]\n        : []),\n      ...(!isEmpty(grouped[\"personal\"] || [])\n        ? [\n            {\n              type: \"personal\",\n              calendars: sortBy(grouped[\"personal\"], \"name\"),\n            },\n          ]\n        : []),\n      ...Object.entries(groupBy(grouped[\"group\"] || [], \"category_name\")).map(\n        ([categoryName, categoryCalendars]) => ({\n          type: categoryName,\n          calendars: sortBy(categoryCalendars, \"name\"),\n        }),\n      ),\n    ];\n  }, [calendars]);\n\n  return (\n    <DropDown className=\"calendar-filter dropdown-menu\" alignment=\"start\">\n      <DropDownItem\n        icon={\n          !isEmpty(excludedCalendarIds) ? regular(\"circle\") : solid(\"circle\")\n        }\n        iconClassName=\"text-muted\"\n        text={I18n.t(\n          !isEmpty(excludedCalendarIds)\n            ? \"js.calendars.overview.filter.include_all\"\n            : \"js.calendars.overview.filter.exclude_all\",\n        )}\n        onSelect={(e) => {\n          e.preventDefault();\n          toggleExcludedCalendarIds(\"all\");\n        }}\n      />\n      {map(sortedGroupedCalendars, ({ type, calendars }) => (\n        <React.Fragment key={type}>\n          <li className=\"dropdown-header\">{typeLabels[type] || type}</li>\n\n          {map(calendars, (calendar) => (\n            <DropDownItem\n              key={calendar.id}\n              icon={\n                includes(excludedCalendarIds, calendar.id)\n                  ? regular(\"circle\")\n                  : solid(\"circle\")\n              }\n              iconStyle={{ color: `#${calendar.color}` }}\n              text={calendar.name}\n              onSelect={(e) => {\n                e.preventDefault();\n                toggleExcludedCalendarIds(calendar.id);\n              }}\n            />\n          ))}\n        </React.Fragment>\n      ))}\n    </DropDown>\n  );\n}\n","import moment, { Moment } from \"moment\";\nimport { filter, flatten, isEmpty, reduce } from \"lodash\";\nimport { Appointment, AppointmentDate } from \"../../@types/appointments\";\n\nconst DATE_FORMAT = \"YYYY-MM-DD\";\n\nexport function weeksInRange(rangeStart, rangeEnd) {\n  const currentDate = moment(rangeStart);\n  const weeks: string[][] = [];\n  const days: string[] = [];\n\n  while (currentDate <= rangeEnd) {\n    days.push(currentDate.format(DATE_FORMAT));\n    currentDate.add(1, \"days\");\n  }\n\n  let week: string[] = [];\n  let i = moment(days[0]).weekday();\n\n  for (const day of days) {\n    week.push(day);\n\n    if ((i + 1) % 7 === 0) {\n      weeks.push(week);\n      week = [];\n    }\n\n    i++;\n  }\n\n  if (week.length > 0) {\n    weeks.push(week);\n  }\n  return weeks;\n}\n\nexport function datesInRange(date: string): string[] {\n  const rangeStart = moment(date).startOf(\"month\").startOf(\"isoWeek\");\n  const rangeEnd = moment(date).endOf(\"month\").endOf(\"isoWeek\");\n\n  return flatten(weeksInRange(rangeStart, rangeEnd));\n}\n\nexport function appointmentsInDateRange(\n  appointments: Appointment[],\n  date: string,\n) {\n  return filter(appointments, (appointment) => {\n    let isInRange = false;\n\n    if (appointment.date.end) {\n      isInRange = moment(date).isBetween(\n        moment(appointment.date.start).startOf(\"day\"),\n        moment(appointment.date.end).endOf(\"day\"),\n        null,\n        \"[]\",\n      );\n    } else {\n      isInRange = moment(date).isSame(moment(appointment.date.start), \"day\");\n    }\n\n    return isInRange;\n  });\n}\n\nexport function collectAppointmentsByDate(\n  appointments: Appointment[],\n  date: string,\n) {\n  const range = datesInRange(date);\n\n  return reduce(\n    range,\n    (result, date) => {\n      result[date] = appointmentsInDateRange(appointments, date);\n      return result;\n    },\n    {},\n  );\n}\n\nexport function weeksInMonth(date: string) {\n  const rangeStart = moment(date).startOf(\"month\");\n  const rangeEnd = moment(date).endOf(\"month\");\n\n  return weeksInRange(rangeStart, rangeEnd);\n}\n\nconst msToDayFactor = 1000 * 60 * 60 * 24; // ms to second to minute to day\n\nexport function dateStamp(date: Moment) {\n  const offsetMinutes = date.utcOffset() || date.zone() * -1;\n\n  if (date) {\n    return Math.floor(\n      date.valueOf() / msToDayFactor + offsetMinutes / (60 * 24),\n    );\n  } else {\n    return 0;\n  }\n}\n\nexport function dateStampsRange(appointmentDate: AppointmentDate) {\n  const start = dateStamp(moment(appointmentDate.start));\n  let end = start;\n\n  if (!isEmpty(appointmentDate.end)) {\n    end = dateStamp(moment(appointmentDate.end));\n  }\n\n  return [start, end];\n}\n\nexport function spansDate(date: Moment, appointmentDate: AppointmentDate) {\n  const stamp = dateStamp(date);\n  const range = dateStampsRange(appointmentDate);\n\n  return range[0] < stamp && range[1] > stamp;\n}\n\nexport function spansMultipleDays(appointmentDate: AppointmentDate) {\n  const range = dateStampsRange(appointmentDate);\n  return range[0] != range[1];\n}\n","import React from \"react\";\nimport classNames from \"classnames\";\n\nconst AllDayTag = ({ position }: { position?: \"start\" | \"end\" }) => (\n  <div\n    className={classNames(\"text-sm bg-primary/25 p-0.5\", {\n      \"pl-[12px]\": position === \"start\",\n      \"pr-[12px]\": position === \"end\",\n    })}\n  >\n    {I18n.t(\"js.calendars.date_range.all_day\")}\n  </div>\n);\n\nconst LeftArrow = () => (\n  <div className=\"h-0 w-0 border-t-transparent border-b-transparent border-r-[12px] border-b-[12px] border-t-[12px] border-r-primary/25\" />\n);\n\nconst RightArrow = () => (\n  <div className=\"h-0 w-0 border-t-transparent border-b-transparent border-l-[12px] border-b-[12px] border-t-[12px] border-l-primary/25\" />\n);\n\nAllDayTag.LeftArrow = LeftArrow;\nAllDayTag.RightArrow = RightArrow;\n\nexport default AllDayTag;\n","import React, { RefObject } from \"react\";\nimport AllDayTag from \"components/appointments/appointmentsList/AllDayTag\";\nimport { Appointment, Calendar } from \"../../../@types/appointments\";\nimport moment, { Moment } from \"moment\";\nimport { spansDate, spansMultipleDays } from \"components/appointments/helpers\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport classNames from \"classnames\";\nimport { find, isEmpty, map } from \"lodash\";\n\ntype AppointmentItemArgs = {\n  appointment: Appointment;\n  date: Moment;\n  calendars?: Calendar[];\n};\n\nfunction TimeTag({ date, appointment }: AppointmentItemArgs) {\n  if (!spansMultipleDays(appointment.date)) {\n    return (\n      <div className=\"flex flex-row justify-center items-center\">\n        {appointment.date.all_day ? (\n          <div className=\"flex flex-row text-sm\">\n            {I18n.t(\"js.calendars.date_range.all_day\")}\n          </div>\n        ) : (\n          <div className=\"flex flex-row text-sm\">\n            {moment(appointment.date.start).format(\"HH:mm\")}\n            {!isEmpty(appointment.date.end) && (\n              <div className=\"text-sm\">\n                {\" - \"}\n                {moment(appointment.date.end).format(\"HH:mm\")}\n              </div>\n            )}\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  if (spansDate(date, appointment.date)) {\n    return (\n      <div className=\"flex flex-row\">\n        <AllDayTag.LeftArrow />\n        <AllDayTag />\n        <AllDayTag.RightArrow />\n      </div>\n    );\n  } else if (date.isSame(moment(appointment.date.start), \"day\")) {\n    return appointment.date.all_day ? (\n      <div className=\"flex flex-row\">\n        <AllDayTag position=\"start\" />\n        <AllDayTag.RightArrow />\n      </div>\n    ) : (\n      <>\n        <div className=\"text-sm pr-1\">\n          {moment(appointment.date.start).format(\"HH:mm\")}\n        </div>\n        <div className=\"text-sm\">\n          <FontAwesomeIcon icon={regular(\"angle-right\")} />\n        </div>\n      </>\n    );\n  } else {\n    return appointment.date.all_day ? (\n      <div className=\"flex flex-row\">\n        <AllDayTag.LeftArrow />\n        <AllDayTag position=\"end\" />\n      </div>\n    ) : (\n      <>\n        <div className=\"text-sm\">\n          <FontAwesomeIcon icon={regular(\"angle-left\")} />\n        </div>\n        <div className=\"text-sm pl-1\">\n          {moment(appointment.date.end).format(\"HH:mm\")}\n        </div>\n      </>\n    );\n  }\n}\n\nexport default function AppointmentItem({\n  appointment,\n  date,\n  calendars,\n  todayRef,\n}: AppointmentItemArgs & { todayRef: RefObject<HTMLDivElement> }) {\n  return (\n    <div\n      className=\"grid gap-2 grid-cols-[1.2fr,2fr] md:grid-cols-[0.5fr,2fr] mb-2 last:mb-0\"\n      ref={\n        moment().isSame(moment(appointment.date.start), \"day\") ? todayRef : null\n      }\n    >\n      <div className=\"flex flex-row justify-center items-center\">\n        <TimeTag date={date} appointment={appointment} />\n      </div>\n      <div className=\"name flex flex-row\">\n        {map(appointment.calendar_ids, (calendar_id: string) => {\n          const calendar = find(\n            calendars,\n            (calendar) => calendar.id === calendar_id,\n          );\n\n          return (\n            calendar && (\n              <div\n                key={calendar_id}\n                className=\"calendar h-full w-1\"\n                style={{ backgroundColor: `#${calendar?.color}` }}\n              ></div>\n            )\n          );\n        })}\n        <span\n          className={classNames(\"ml-1\", {\n            \"line-through\": appointment.canceled,\n          })}\n        >\n          {appointment.has_meeting && (\n            <FontAwesomeIcon icon={regular(\"comments\")} />\n          )}\n          <a href={appointment.html_url}>{appointment.name}</a>\n          <span className=\"text-sm text-gray-600 ml-1\">\n            {appointment.location.name}\n          </span>\n        </span>\n      </div>\n    </div>\n  );\n}\n","import React, { RefObject } from \"react\";\nimport { Appointment, Calendar } from \"../../../@types/appointments\";\nimport { map } from \"lodash\";\nimport classNames from \"classnames\";\nimport moment from \"moment\";\nimport AppointmentItem from \"components/appointments/appointmentsList/AppointmentItem\";\n\ntype CalendarDayArgs = {\n  appointments: Appointment[];\n  day: string;\n  calendars?: Calendar[];\n  todayRef: RefObject<HTMLDivElement>;\n};\n\nexport default function CalendarDay({\n  appointments,\n  day,\n  calendars,\n  todayRef,\n}: CalendarDayArgs) {\n  const today = moment();\n  const date = moment(day);\n\n  return (\n    <div\n      className={classNames(\n        \"cal-day grid grid-cols-[1fr] md:grid-cols-[100px,1fr] gap-2 p-1.5 md:p-2 border-t border-box-border-color -mt-px\",\n        {\n          \"past-month past-day\": today.isAfter(date, \"month\"),\n          \"past-day\": today.isAfter(date, \"day\"),\n          \"today bg-primary/10 border-primary/50 border-x rounded border-y -mx-px -mb-0.5\":\n            today.isSame(date, \"day\"),\n          future: today.isBefore(date),\n        },\n      )}\n    >\n      <div className=\"date\">\n        {date.format(I18n.t(\"js.plugins.Locale.Formats.day_in_month\"))}\n      </div>\n      <ul>\n        {map(appointments, (appointment) => {\n          return (\n            <AppointmentItem\n              key={appointment.id}\n              appointment={appointment}\n              date={date}\n              calendars={calendars}\n              todayRef={todayRef}\n            />\n          );\n        })}\n      </ul>\n    </div>\n  );\n}\n","import React, { RefObject } from \"react\";\nimport moment from \"moment/moment\";\nimport { isEmpty, map, some } from \"lodash\";\nimport { Appointment, Calendar } from \"../../../@types/appointments\";\nimport CalendarDay from \"components/appointments/appointmentsList/CalendarDay\";\n\ntype CalendarWeekArgs = {\n  week: string[];\n  appointmentsByDate: { [date: string]: Appointment[] };\n  calendars?: Calendar[];\n  todayRef: RefObject<HTMLDivElement>;\n};\n\nexport default function CalendarWeek({\n  week,\n  appointmentsByDate,\n  calendars,\n  todayRef,\n}: CalendarWeekArgs) {\n  const weekNumber = moment(week[0]).startOf(\"week\").add(3, \"days\").format(\"w\");\n  const isEmptyWeek = !some(appointmentsByDate, (appointments, date) => {\n    return (\n      moment(week[0]).startOf(\"week\").isoWeek() ===\n        moment(date).startOf(\"week\").isoWeek() && !isEmpty(appointments)\n    );\n  });\n\n  return (\n    <div>\n      <h2 className={`cal-week week-${weekNumber} p-2 font-medium text-sm`}>\n        {I18n.t(\"calendars.overview.calendarweek\", { weekNumber })}\n      </h2>\n      <div className=\"calendar-week border-box mb-4\">\n        {isEmptyWeek ? (\n          <div className=\"p-2 grid grid-cols-[100px,1fr] gap-2 p-2\">\n            <div />\n            <div className=\"no-appointments\">\n              {I18n.t(\"calendars.month_list.empty_week\")}\n            </div>\n          </div>\n        ) : (\n          map(week, (day) => {\n            return (\n              !isEmpty(appointmentsByDate[day]) && (\n                <CalendarDay\n                  key={day}\n                  appointments={appointmentsByDate[day]}\n                  day={day}\n                  calendars={calendars}\n                  todayRef={todayRef}\n                />\n              )\n            );\n          })\n        )}\n      </div>\n    </div>\n  );\n}\n","import React, { RefObject } from \"react\";\nimport { Appointment, Calendar } from \"../../../@types/appointments\";\nimport { weeksInMonth } from \"components/appointments/helpers\";\nimport { map } from \"lodash\";\nimport CalendarWeek from \"components/appointments/appointmentsList/CalendarWeek\";\n\ntype AppointmentsListArgs = {\n  appointmentsByDate: { [date: string]: Appointment[] };\n  date: string;\n  calendars?: Calendar[];\n  todayRef: RefObject<HTMLDivElement>;\n};\n\nexport default function AppointmentsList({\n  appointmentsByDate,\n  date,\n  calendars,\n  todayRef,\n}: AppointmentsListArgs) {\n  const weeks = weeksInMonth(date);\n\n  return (\n    <div className=\"appointments-list-view\">\n      {map(weeks, (week, index) => (\n        <CalendarWeek\n          key={index}\n          week={week}\n          appointmentsByDate={appointmentsByDate}\n          calendars={calendars}\n          todayRef={todayRef}\n        />\n      ))}\n    </div>\n  );\n}\n","import { useState } from \"react\";\nimport useWindowEvent from \"components/shared/hooks/useWindowEvent\";\n\nconst MEDIUM_BREAKPOINT = 768;\nfunction isSmall() {\n  return window.innerWidth < MEDIUM_BREAKPOINT;\n}\n\nexport type ViewType = \"sheet\" | \"list\" | string;\n\nexport default function useAppointmentView() {\n  const [persistedView, setPersistedView] = useState(\n    sessionStorage.getItem(\"appointmentsViewType\") || \"sheet\",\n  );\n  const [view, setView] = useState<ViewType>(\n    isSmall() ? \"list\" : persistedView,\n  );\n\n  function updateView(view: ViewType) {\n    if (isSmall()) {\n      setView(\"list\");\n    } else {\n      setView(view);\n    }\n  }\n\n  function maybeForceListView() {\n    updateView(persistedView);\n  }\n\n  function setViewType(view: ViewType) {\n    sessionStorage.setItem(\"appointmentsViewType\", view);\n    setPersistedView(view);\n    updateView(view);\n  }\n\n  useWindowEvent(\"resize\", maybeForceListView);\n\n  return { view, setViewType };\n}\n","import React, { useMemo, useRef, useState } from \"react\";\nimport { filter, includes, intersection, isEmpty, map, orderBy } from \"lodash\";\nimport moment from \"moment\";\n\nimport { ContextPageTitle } from \"components/layout/PageTitle\";\nimport AppointmentToolbar from \"components/appointments/AppointmentToolbar\";\nimport CalendarSheet from \"./CalendarSheet.js\";\nimport { useAppointments, useCalendars } from \"components/appointments/api\";\nimport { collectAppointmentsByDate } from \"components/appointments/helpers\";\nimport AppointmentsList from \"components/appointments/appointmentsList\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport GroupNavigation from \"components/layout/GroupNavigation\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../@types\";\nimport { Appointment } from \"../../@types/appointments\";\nimport useAppointmentView from \"components/appointments/useAppointmentView\";\n\nexport default function AppointmentsPage({\n  participating = false,\n}: {\n  participating?: boolean;\n}) {\n  const { view, setViewType } = useAppointmentView();\n  const { groupSlug } = useParams();\n  const group = useSelector((state: State) =>\n    groupSlug ? state.groups.bySlug?.[groupSlug] : null,\n  );\n  const network = useSelector((state: State) => state.network);\n\n  const [date, setDate] = useState(\n    sessionStorage.getItem(\"appointmentsDate\") || moment().format(),\n  );\n  const [excludedCalendarIds, setExcludedCalendarIds] = useState<string[]>([]);\n\n  const { isLoading, data: appointments } = useAppointments({\n    date,\n    view,\n    participating,\n  });\n  const todayRef = useRef<HTMLDivElement>(null);\n  const scrollToToday = () => {\n    setTimeout(() => {\n      if (todayRef.current) {\n        todayRef.current.scrollIntoView({\n          behavior: \"smooth\",\n          block: \"center\",\n        });\n      }\n    }, 100);\n  };\n  const { data: calendars } = useCalendars();\n  const contextCalendars = !isEmpty(group)\n    ? filter(calendars, (cal) => cal.parent_id === group?.id)\n    : calendars;\n\n  function filterAppointments() {\n    let contextAppointments: Appointment[] | undefined;\n\n    if (groupSlug) {\n      contextAppointments = filter(appointments, (appointment: Appointment) => {\n        const groupAppointmentsCalendarIds = intersection(\n          map(contextCalendars, \"id\"),\n          appointment.calendar_ids,\n        );\n\n        return (\n          groupAppointmentsCalendarIds >\n          intersection(groupAppointmentsCalendarIds, excludedCalendarIds)\n        );\n      });\n    } else {\n      contextAppointments = filter(appointments, (appointment) =>\n        appointment.calendar_ids\n          ? appointment.calendar_ids.length >\n            intersection(excludedCalendarIds, appointment.calendar_ids).length\n          : false,\n      );\n    }\n\n    return orderBy(contextAppointments, \"date.start\", \"asc\");\n  }\n\n  const filteredAppointments = useMemo(filterAppointments, [\n    appointments,\n    groupSlug,\n    excludedCalendarIds,\n    calendars,\n    contextCalendars,\n  ]);\n\n  function onSetDate(date: string) {\n    sessionStorage.setItem(\"appointmentsDate\", date);\n    setDate(date);\n  }\n\n  let appointmentsByDate = {};\n\n  if (filteredAppointments) {\n    appointmentsByDate = collectAppointmentsByDate(filteredAppointments, date);\n  }\n\n  function toggleExcludedCalendarIds(calendarId: string) {\n    if (calendarId === \"all\") {\n      if (isEmpty(excludedCalendarIds)) {\n        setExcludedCalendarIds(map(calendars, \"id\"));\n      } else {\n        setExcludedCalendarIds([]);\n      }\n    } else {\n      if (includes(excludedCalendarIds, calendarId)) {\n        setExcludedCalendarIds(\n          filter(excludedCalendarIds, (calId: string) => calId !== calendarId),\n        );\n      } else {\n        setExcludedCalendarIds([...excludedCalendarIds, calendarId]);\n      }\n    }\n  }\n\n  return (\n    <>\n      <ContextPageTitle\n        groupSlug={groupSlug}\n        title={\n          participating\n            ? I18n.t(\"calendars.participating_appointments\")\n            : I18n.t(\"calendars.all_appointments\")\n        }\n      />\n      {groupSlug && <GroupNavigation groupSlug={groupSlug} />}\n      <h2 className=\"tixxt__subtitle\">\n        {I18n.t(\"js.calendars.appointments.subtitle\")}\n      </h2>\n      <AppointmentToolbar\n        isLoading={isLoading}\n        view={view}\n        setViewType={setViewType}\n        date={date}\n        setDate={onSetDate}\n        calendars={contextCalendars}\n        excludedCalendarIds={excludedCalendarIds}\n        toggleExcludedCalendarIds={toggleExcludedCalendarIds}\n        scrollToToday={scrollToToday}\n        canCreate={\n          groupSlug\n            ? group?.can.create_appointments\n            : network.can.create_appointments\n        }\n      />\n      {view === \"sheet\" ? (\n        <CalendarSheet\n          appointmentsByDate={appointmentsByDate}\n          calendars={calendars}\n        />\n      ) : (\n        <AppointmentsList\n          appointmentsByDate={appointmentsByDate}\n          date={date}\n          todayRef={todayRef}\n          calendars={calendars}\n        />\n      )}\n    </>\n  );\n}\n","import { Calendar } from \"../../../@types/appointments\";\nimport { filter, forEach, groupBy, keyBy } from \"lodash\";\n\nexport function isShared(cal: Calendar | undefined) {\n  return (\n    cal?.type === \"personal\" && cal?.parent_id !== Preload.current_member?.id\n  );\n}\n\nexport function canAddCalendar(type: string) {\n  switch (type) {\n    case \"personal\":\n      return !!Preload.current_member?.can.create_personal_calendars;\n    case \"network\":\n      return !!Preload.current_network?.can.create_calendars;\n    default:\n      return false;\n  }\n}\n\nexport function groupCalendarsByType(calendars: Calendar[] | undefined) {\n  const groupedCalendars: { [key: string]: Calendar[] } = {\n    personal: [],\n    network: [],\n    shared: [],\n  };\n\n  forEach(\n    groupBy(\n      filter(calendars, (cal) => cal.type !== \"group\" && !isShared(cal)),\n      \"type\",\n    ),\n    (cals, key) => (groupedCalendars[key] = cals),\n  );\n\n  groupedCalendars.shared = filter(calendars, (cal) => isShared(cal));\n\n  return groupedCalendars;\n}\n\nexport function groupCalendarsByGroup(calendars: Calendar[] | undefined) {\n  const groupsById = keyBy(Preload.my_groups, \"id\");\n  const groupsWithCalendars = {};\n\n  forEach(\n    groupBy(\n      filter(calendars, (cal) => cal.type === \"group\"),\n      \"parent_id\",\n    ),\n    (calendars, group_id) =>\n      (groupsWithCalendars[group_id] = { ...groupsById[group_id], calendars }),\n  );\n\n  return groupsWithCalendars;\n}\n","import { Calendar } from \"../../../@types/appointments\";\nimport React, { ReactNode } from \"react\";\nimport { isShared } from \"components/appointments/calendars/helpers\";\nimport { isEmpty, map } from \"lodash\";\n\nexport default function CalendarListItem({\n  calendar,\n  actions,\n}: {\n  calendar?: Calendar;\n  actions?: (calendar: Calendar | undefined) => ReactNode[];\n}) {\n  return (\n    <li className=\"calendar-view flex items-center justify-between gap-2 py-1 px-3 py-2\">\n      <div className=\"flex gap-2 items-center\">\n        <div\n          className=\"cal-include rounded-full w-4 h-4\"\n          style={{ backgroundColor: `#${calendar?.color}` }}\n        />\n        {calendar?.name}\n        <div className=\"text-muted\">\n          {isShared(calendar) &&\n            !isEmpty(calendar?.author) &&\n            I18n.t(\"calendars.shared_from\", {\n              name: calendar?.author.name,\n            })}\n        </div>\n      </div>\n      <div className=\"btn-group\">{actions && map(actions(calendar))}</div>\n    </li>\n  );\n}\n","import { Calendar } from \"../../../@types/appointments\";\nimport { stringify } from \"query-string\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { isEmpty, map } from \"lodash\";\nimport React, { ReactNode } from \"react\";\nimport CalendarListItem from \"components/appointments/calendars/CalendarListItem\";\n\nexport default function CalendarList({\n  title,\n  calendars,\n  renderActions,\n  addCalendar,\n}: {\n  title: string;\n  calendars: Calendar[];\n  renderActions: (calendar: Calendar | undefined) => ReactNode[];\n  addCalendar?: { type: string; parent_id?: string };\n}) {\n  return (\n    <div className=\"context-calendars my-4\">\n      <div className=\"flex gap-4 items-baseline my-1\">\n        <h3 className=\"font-semibold\">{title}</h3>\n        {addCalendar && (\n          <a\n            className=\"text-lg\"\n            href={`/calendars/new?${stringify(addCalendar)}`}\n            data-bs-toggle=\"tooltip\"\n            data-bs-original-title={I18n.t(\"calendars.add_calendar\")}\n            title={I18n.t(\"calendars.add_calendar\")}\n          >\n            <FontAwesomeIcon icon={regular(\"calendar-circle-plus\")} />\n          </a>\n        )}\n      </div>\n      <ul className=\"calendars divide-neutral divide-y unstyled border border-neutral rounded\">\n        {isEmpty(calendars) ? (\n          <div className=\"px-3 py-2\">\n            {I18n.t(\"js.calendars.calendar_manager.no_calendars_listed\")}\n          </div>\n        ) : (\n          map(calendars, (calendar) => {\n            return (\n              <CalendarListItem\n                key={calendar.id}\n                calendar={calendar}\n                actions={renderActions}\n              />\n            );\n          })\n        )}\n      </ul>\n    </div>\n  );\n}\n","import React, { ReactNode } from \"react\";\nimport { map } from \"lodash\";\nimport {\n  canAddCalendar,\n  groupCalendarsByGroup,\n  groupCalendarsByType,\n} from \"components/appointments/calendars/helpers\";\nimport { Calendar } from \"../../../@types/appointments\";\nimport CalendarList from \"components/appointments/calendars/CalendarList\";\nimport { Group } from \"../../../@types\";\n\ntype GroupWithCalendars = Group & {\n  calendars: Calendar[];\n};\n\nexport default function CalendarListView({\n  renderActions,\n  calendars,\n  isLoading,\n  addCalendarsAllowed = false,\n}: {\n  renderActions: (calendar: Calendar | undefined) => ReactNode[];\n  isLoading: boolean;\n  addCalendarsAllowed?: boolean;\n  calendars?: Calendar[];\n}) {\n  const groupedCalendars = groupCalendarsByType(calendars);\n  const groupsWithCalendars = groupCalendarsByGroup(calendars);\n\n  return (\n    <div className=\"calendar-manager\">\n      {isLoading && I18n.t(\"js.loading\")}\n      {map(groupedCalendars, (contextCalendars, type) => {\n        return (\n          <CalendarList\n            key={type}\n            title={I18n.t(`js.calendars.${type}_calendars`)}\n            calendars={contextCalendars}\n            renderActions={renderActions}\n            addCalendar={\n              canAddCalendar(type) && addCalendarsAllowed ? { type } : undefined\n            }\n          />\n        );\n      })}\n      {map(groupsWithCalendars, (group: GroupWithCalendars) => {\n        return (\n          <CalendarList\n            key={group.id}\n            title={group.name}\n            calendars={group.calendars}\n            renderActions={renderActions}\n            addCalendar={\n              group.can.create_calendars && addCalendarsAllowed\n                ? { type: \"group\", parent_id: group.id }\n                : undefined\n            }\n          />\n        );\n      })}\n    </div>\n  );\n}\n","import React, { ReactNode } from \"react\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport { Calendar } from \"../../../@types/appointments\";\nimport { isShared } from \"components/appointments/calendars/helpers\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport {\n  useDeleteCalendar,\n  useDeleteShare,\n} from \"components/appointments/calendars/api\";\nimport CalendarListView from \"components/appointments/calendars/CalendarListView\";\nimport { useCalendars } from \"components/appointments/api\";\n\nexport default function ManageCalendarsPage() {\n  const { data: calendars, isLoading, refetch } = useCalendars();\n\n  const { mutate: deleteCalendar } = useDeleteCalendar({\n    onSuccess: () => {\n      toastr.success(I18n.t(\"js.delete_successful\"));\n      refetch();\n    },\n  });\n\n  const { mutate: deleteShare } = useDeleteShare({\n    onSuccess: () => {\n      toastr.success(I18n.t(\"js.delete_successful\"));\n      refetch();\n    },\n  });\n\n  function actions(calendar: Calendar | undefined) {\n    const buttons: ReactNode[] = [];\n\n    if (isShared(calendar)) {\n      buttons.push(\n        <button\n          key=\"delete_share\"\n          className=\"btn btn-light btn-sm\"\n          onClick={() =>\n            window.bridge?.confirm(\n              I18n.t(\"delete_confirmation\"),\n              () => calendar && deleteShare(calendar?.id),\n            )\n          }\n        >\n          <FontAwesomeIcon icon={regular(\"ban\")} />\n        </button>,\n      );\n    }\n\n    if (calendar?.can.update) {\n      buttons.push(\n        <a\n          key=\"edit\"\n          className=\"btn btn-light btn-sm\"\n          href={`/calendars/${calendar.id}/edit`}\n        >\n          <FontAwesomeIcon icon={regular(\"pencil\")} />\n        </a>,\n      );\n    }\n\n    if (calendar?.can.destroy) {\n      buttons.push(\n        <button\n          key=\"delete\"\n          className=\"btn btn-light btn-sm text-danger\"\n          onClick={() =>\n            window.bridge?.confirm(\n              I18n.t(\"calendars.calendar_manager.destroy_confirmation\"),\n              () => deleteCalendar(calendar.id),\n            )\n          }\n        >\n          <FontAwesomeIcon icon={regular(\"trash\")} />\n        </button>,\n      );\n    }\n\n    return buttons;\n  }\n\n  return (\n    <>\n      <PageTitle title={I18n.t(\"calendars.manage_calendars\")} />\n      <CalendarListView\n        renderActions={actions}\n        calendars={calendars}\n        isLoading={isLoading}\n        addCalendarsAllowed\n      />\n    </>\n  );\n}\n","import { useMutation, useQuery } from \"react-query\";\nimport { Calendar } from \"../../../@types/appointments\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nexport function useDeleteCalendar(options) {\n  return useMutation(\n    (id: string) => fetchApi(`/calendars/${id}`, { method: \"DELETE\" }),\n    options,\n  );\n}\nexport function useDeleteShare(options) {\n  return useMutation(\n    (id: string) => fetchApi(`/calendars/${id}/share`, { method: \"DELETE\" }),\n    options,\n  );\n}\n\nexport function useCalendar(id?: string) {\n  return useQuery<Calendar>(`/calendars/${id}`, { enabled: !!id });\n}\n\nexport type CreateCalendarParams = {\n  parent_id?: string | string[];\n  calendar: {\n    name: string;\n    color?: string;\n    membership_ids?: (string | undefined)[];\n  };\n};\n\nexport function useCreateCalendar(options) {\n  return useMutation(\n    (params: CreateCalendarParams) =>\n      fetchApi(`/calendars`, {\n        method: \"POST\",\n        body: params,\n      }),\n    options,\n  );\n}\n\nexport type UpdateCalendarParams = {\n  calendar: {\n    id: string;\n    name: string;\n    color?: string;\n    membership_ids?: (string | undefined)[];\n  };\n};\n\nexport function useUpdateCalendar(options) {\n  return useMutation(\n    (params: UpdateCalendarParams) =>\n      fetchApi(`/calendars/${params.calendar.id}`, {\n        method: \"PUT\",\n        body: params,\n      }),\n    options,\n  );\n}\n","import React from \"react\";\nimport Modal from \"components/shared/Modal\";\nimport { stringify } from \"query-string\";\nimport { Calendar } from \"../../../@types/appointments\";\nimport { find, isEmpty, map, split } from \"lodash\";\nimport { groupCalendarsByType } from \"components/appointments/calendars/helpers\";\nimport CalendarListItem from \"components/appointments/calendars/CalendarListItem\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nconst COLLECTION_URL_LOOKUP = {\n  all_appointments: \"appointments\",\n  participating_appointments: \"appointments/participating\",\n  personal_calendar: \"calendars/my/appointments\",\n  shared_calendar: \"calendars/shared/appointments\",\n  network_calendar: \"calendars/all/appointments\",\n};\n\ntype CalendarSubscribeModalArgs = {\n  setShowModal: (showModal: boolean) => void;\n  modalOptions?: ModalOptions;\n  calendars?: Calendar[];\n};\n\nexport type ModalOptions = {\n  title: string;\n  collectionType?: string;\n  calendarId?: string;\n};\n\nexport default function CalendarSubscribeModal({\n  setShowModal,\n  modalOptions,\n  calendars = [],\n}: CalendarSubscribeModalArgs) {\n  const isCollection = !!modalOptions?.collectionType;\n  const isCalendar = !!modalOptions?.calendarId;\n  const url = `webcal:${Preload.current_network?.url}/${\n    modalOptions?.collectionType\n      ? COLLECTION_URL_LOOKUP[modalOptions?.collectionType]\n      : `calendars/${modalOptions?.calendarId}/appointments`\n  }.ics?${stringify({\n    auth_token: Preload.current_member?.authentication_token,\n  })}`;\n\n  const groupedCalendars = groupCalendarsByType(calendars);\n\n  let filteredCalendars: (Calendar | undefined)[] = [];\n\n  if (modalOptions?.collectionType) {\n    const calendarFilter = split(modalOptions?.collectionType, \"_\")[0];\n    filteredCalendars =\n      calendarFilter == \"all\" ? calendars : groupedCalendars[calendarFilter];\n  }\n\n  if (modalOptions?.calendarId) {\n    const calendar = find(calendars, { id: modalOptions?.calendarId });\n    filteredCalendars = [calendar];\n  }\n\n  function copyToClipboard(url: string) {\n    navigator.clipboard\n      .writeText(url)\n      .then(() => {\n        toastr.success(I18n.t(\"js.calendars.webcal_url_copied\"));\n      })\n      .catch(() => {\n        toastr.error(I18n.t(\"js.generic_error\"));\n      });\n  }\n\n  return (\n    <Modal\n      static\n      title={modalOptions?.title}\n      onClose={() => setShowModal(false)}\n    >\n      <div className=\"divider divide-y divide-neutral\">\n        <div className=\"mb-4\">\n          {isCalendar && !isEmpty(filteredCalendars) && (\n            <>\n              <CalendarListItem calendar={filteredCalendars[0]} />\n              <p className=\"pt-4\">\n                {I18n.t(\"calendars.subscriptions.subscribe\")}\n              </p>\n            </>\n          )}\n          {isCollection && (\n            <p>{I18n.t(\"calendars.subscriptions.collection_subscribe\")}</p>\n          )}\n          <p>\n            <a href={url} className=\"break-words\">\n              {url}\n            </a>\n            <button className=\"btn-small\" onClick={() => copyToClipboard(url)}>\n              <FontAwesomeIcon className=\"ml-2\" icon={regular(\"copy\")} />\n            </button>\n          </p>\n        </div>\n        {isCollection && (\n          <div className=\"pt-4\">\n            <p>{I18n.t(\"js.calendars.subscriptions.following_calendars\")}:</p>\n            {!isEmpty(filteredCalendars) ? (\n              <ul>\n                {map(\n                  filteredCalendars,\n                  (calendar) =>\n                    calendar && (\n                      <CalendarListItem calendar={calendar} key={calendar.id} />\n                    ),\n                )}\n              </ul>\n            ) : (\n              <p>\n                {modalOptions?.collectionType === \"participating_appointments\"\n                  ? I18n.t(\"js.calendars.subscriptions.no_specific_calendars\")\n                  : I18n.t(\"js.calendars.calendar_manager.no_calendars_listed\")}\n              </p>\n            )}\n          </div>\n        )}\n      </div>\n    </Modal>\n  );\n}\n","import React, { ReactNode, useState } from \"react\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport { map } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { useCalendars } from \"components/appointments/api\";\nimport CalendarListView from \"components/appointments/calendars/CalendarListView\";\nimport { Calendar } from \"../../../@types/appointments\";\nimport CalendarSubscribeModal, {\n  ModalOptions,\n} from \"components/appointments/calendars/CalendarSubscribeModal\";\n\nexport default function SubscribeCalendarsPage() {\n  const [showModal, setShowModal] = useState(false);\n  const [modalOptions, setModalOptions] = useState<ModalOptions>();\n\n  const { data: calendars, isLoading } = useCalendars();\n  const calendarCollections = [\n    \"all_appointments\",\n    \"participating_appointments\",\n    \"personal_calendar\",\n    \"shared_calendar\",\n    \"network_calendar\",\n  ];\n\n  function onShowModal(modalOptions: ModalOptions) {\n    setModalOptions(modalOptions);\n    setShowModal(true);\n  }\n\n  function actions(calendar: Calendar | undefined) {\n    const buttons: ReactNode[] = [];\n\n    buttons.push(\n      <button\n        key=\"subscribe\"\n        className=\"btn btn-light btn-sm\"\n        onClick={() =>\n          onShowModal({\n            title: I18n.t(\"calendars.calendar_manager.subscribe_calendar\"),\n            calendarId: calendar?.id,\n          })\n        }\n      >\n        <FontAwesomeIcon icon={regular(\"calendar-plus\")} />\n      </button>,\n    );\n\n    return buttons;\n  }\n\n  return (\n    <>\n      <PageTitle title={I18n.t(\"calendars.subscribe_calendars\")} />\n      {showModal && (\n        <CalendarSubscribeModal\n          calendars={calendars}\n          modalOptions={modalOptions}\n          setShowModal={setShowModal}\n        />\n      )}\n      <div className=\"calendar-manager\">\n        {Preload.current_member?.authentication_token ? (\n          <div className=\"all-region\">\n            <h3 className=\"font-semibold my-1\">\n              {I18n.t(\"js.calendars.subscriptions.calendar_collection_title\")}\n            </h3>\n            <div className=\"prose my-1\">\n              {I18n.t(\"js.calendars.subscriptions.all_region_subscribe\")}\n            </div>\n            <div className=\"divide-neutral divide-y unstyled border border-neutral rounded mb-4\">\n              {map(calendarCollections, (collectionType: string) => (\n                <div\n                  key={collectionType}\n                  className=\"flex items-center justify-between px-3 py-2\"\n                >\n                  {I18n.t(`js.calendars.subscriptions.${collectionType}`)}\n                  <div className=\"btn-group\">\n                    <button\n                      className=\"btn btn-light btn-sm\"\n                      onClick={() =>\n                        onShowModal({\n                          title: I18n.t(\n                            `js.calendars.subscriptions.${collectionType}_subscribe`,\n                          ),\n                          collectionType,\n                        })\n                      }\n                    >\n                      <FontAwesomeIcon icon={regular(\"calendar-plus\")} />\n                    </button>\n                  </div>\n                </div>\n              ))}\n            </div>\n            <div className=\"prose my-1\">\n              {I18n.t(\n                \"js.calendars.subscriptions.single_calendar_subscriptions\",\n              )}\n            </div>\n            <CalendarListView\n              renderActions={actions}\n              calendars={calendars}\n              isLoading={isLoading}\n            />\n          </div>\n        ) : (\n          <a href=\"/users/edit\">\n            {I18n.t(\"js.calendars.subscriptions.no_access_token_found\")}\n          </a>\n        )}\n      </div>\n    </>\n  );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport { AppointmentInviteDate } from \"../AppointmentInvite\";\n\nfunction AppointmentPreview({ name, date, description_rendered }) {\n  return (\n    <div className=\"appointment-preview bg-primary/10 border-primary/25 border mb-4 p-3 rounded text-sm\">\n      <h4 className=\"name text-normal font-semibold mb-2\">{name}</h4>\n      <div className=\"detail-date flex flex-row gap-2\">\n        <i className=\"fa-regular fa-clock text-muted\" />\n        <AppointmentInviteDate date={date} />\n      </div>\n      {description_rendered ? (\n        <div\n          className=\"description mt-2\"\n          dangerouslySetInnerHTML={{ __html: description_rendered }}\n        />\n      ) : null}\n    </div>\n  );\n}\nAppointmentPreview.propTypes = {\n  name: PropTypes.string,\n  date: PropTypes.shape({\n    all_day: PropTypes.bool,\n    end: PropTypes.any,\n    same_day: PropTypes.bool,\n    start: PropTypes.any,\n  }),\n  description_rendered: PropTypes.string,\n};\n\nexport default AppointmentPreview;\n","import React, { useState } from \"react\";\nimport { map, filter } from \"lodash\";\n\nimport MemberSelect, { Value } from \"../../shared/MemberSelect\";\nimport { useRecurringAppointment } from \"../../../hooks/useRecurringAppointment\";\nimport { useAddParticipants } from \"components/appointments/participants/api\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ntype NewParticipantFormArgs = {\n  id: string;\n  invite_consumers?: boolean;\n  reloadAppointment: () => void;\n};\n\ntype FormData = {\n  participantsStatus: string;\n  emailNotification: boolean;\n  inviteConsumers: boolean;\n  selectedEntities: Value[];\n  applyTo?: boolean;\n};\n\nfunction NewParticipantForm({ reloadAppointment, id }: NewParticipantFormArgs) {\n  const { register, handleSubmit, control, reset } = useForm<FormData>();\n  const [reloading, setReloading] = useState(false);\n  const isRecurring = useRecurringAppointment(id);\n  const { mutate: addParticipants, isLoading } = useAddParticipants(id, {\n    onSuccess: (_data, { participant }) => {\n      reset();\n      setReloading(true);\n      window.setTimeout(reloadAppointment, 3000);\n      window.setTimeout(reloadAppointment, 9000);\n      toastr.success(\n        I18n.t(\n          participant.membership_ids.length === 0\n            ? \"js.calendars.appointment.participations.success_alert\"\n            : \"js.calendars.appointment.participations.success_alert_with_mr\",\n          {\n            member_count: participant.membership_ids.length,\n            group_count: participant.group_ids.length,\n            membership_role_count: participant.membership_role_ids.length,\n          },\n        ),\n      );\n      window.setTimeout(() => {\n        reloadAppointment();\n        setReloading(false);\n      }, 18000);\n    },\n    onError: () => {\n      toastr.error(I18n.t(\"js.saving_failure\"));\n    },\n  });\n\n  const addParticipantsHandler = ({\n    memberIds,\n    groupIds,\n    membershipRoleIds,\n    participantsStatus,\n    emailNotification,\n    inviteConsumers,\n    applyTo,\n  }: {\n    memberIds: (string | undefined)[];\n    groupIds: (string | undefined)[];\n    membershipRoleIds: (string | undefined)[];\n    participantsStatus: string;\n    emailNotification: boolean;\n    inviteConsumers: boolean;\n    applyTo?: \"this\" | \"all\";\n  }) => {\n    const params = {\n      participant: {\n        membership_ids: memberIds,\n        group_ids: groupIds,\n        membership_role_ids: membershipRoleIds,\n        status: participantsStatus,\n        send_email_notification: emailNotification,\n        invite_consumers: inviteConsumers,\n      },\n      apply_to: applyTo,\n    };\n    addParticipants(params);\n  };\n\n  return (\n    <div className=\"border-box mb-4 p-3\">\n      <form\n        className=\"form-horizontal\"\n        onSubmit={handleSubmit(onAddParticipants)}\n      >\n        <div className=\"control-group member-select\">\n          <label className=\"control-label\">\n            {I18n.t(\"js.calendars.appointment.participations.add\")}\n          </label>\n          <div className=\"controls contacts-container member-select-control mt-2\">\n            <div className=\"invites-select-view mb-2\">\n              <Controller\n                name=\"selectedEntities\"\n                control={control}\n                defaultValue={[]}\n                render={({ field }) => (\n                  <MemberSelect\n                    field={field}\n                    multi={true}\n                    membersAndGroups\n                    includeMembershipRoles\n                  />\n                )}\n              />\n            </div>\n            <div className=\"flex flex-col\">\n              <select\n                {...register(\"participantsStatus\")}\n                className=\"invites-status-view pull-left mb-2\"\n              >\n                <option value=\"open\">\n                  {I18n.t(\"js.calendars.appointment.participant_status.open\")}\n                </option>\n                <option value=\"accepted\">\n                  {I18n.t(\n                    \"js.calendars.appointment.participant_status.accepted\",\n                  )}\n                </option>\n                <option value=\"declined\">\n                  {I18n.t(\n                    \"js.calendars.appointment.participant_status.declined\",\n                  )}\n                </option>\n              </select>\n              <label className=\"mail-notifications\">\n                <Controller\n                  name=\"emailNotification\"\n                  control={control}\n                  defaultValue={true}\n                  render={({ field }) => (\n                    <input\n                      className=\"mail-notification-checkbox mr-2\"\n                      type=\"checkbox\"\n                      checked={field.value}\n                      {...field}\n                      value=\"true\"\n                    />\n                  )}\n                />\n                <span className=\"mail-notifications-label\">\n                  {I18n.t(\n                    \"js.calendars.appointment.participations.send_notification\",\n                  )}\n                </span>\n              </label>\n              {Tixxt.currentNetwork.getConfig(\"consumers_enabled\") ? (\n                <label className=\"invite-consumers\">\n                  <input\n                    className=\"invite-consumers-checkbox mr-2\"\n                    {...register(\"inviteConsumers\")}\n                    type=\"checkbox\"\n                  />\n                  <span className=\"invite-consumers-label\">\n                    {I18n.t(\n                      \"js.calendars.appointment.invites.invite_consumers\",\n                    )}\n                  </span>\n                </label>\n              ) : null}\n              {isRecurring ? (\n                <label className=\"response-for\">\n                  <input\n                    className=\"response-for-checkbox mr-2\"\n                    type=\"checkbox\"\n                    {...register(\"applyTo\")}\n                  />\n                  <span className=\"response-for-label\">\n                    {I18n.t(\n                      \"js.calendars.recurring_appointment.invites.apply_to\",\n                    )}\n                  </span>\n                </label>\n              ) : null}\n            </div>\n          </div>\n        </div>\n        <div className=\"new-participants-send-button flex flex-row justify-end items-center gap-2 mt-4\">\n          {isLoading || reloading ? (\n            <FontAwesomeIcon\n              icon={regular(\"spinner\")}\n              className=\"text-muted add-participants-loading-icon\"\n              spin\n            />\n          ) : null}\n          <button\n            type=\"submit\"\n            className=\"btn btn-success\"\n            disabled={isLoading}\n          >\n            {I18n.t(\"js.calendars.appointment.add_participant.send_title\")}\n          </button>\n        </div>\n      </form>\n    </div>\n  );\n\n  function onAddParticipants({\n    participantsStatus,\n    emailNotification,\n    selectedEntities,\n    inviteConsumers,\n    applyTo,\n  }: FormData) {\n    const memberIds = map(\n      filter(selectedEntities, (entity) => entity.type === \"member\"),\n      (m) => m.value,\n    );\n\n    const groupIds = map(\n      filter(selectedEntities, (entity) => entity.type === \"group\"),\n      (g) => g.value,\n    );\n\n    const membershipRoleIds = map(\n      filter(selectedEntities, (entity) => entity.type === \"membershipRole\"),\n      (mr) => mr.value,\n    );\n\n    addParticipantsHandler({\n      memberIds,\n      groupIds,\n      membershipRoleIds,\n      participantsStatus,\n      emailNotification,\n      inviteConsumers,\n      applyTo: applyTo ? \"this\" : \"all\",\n    });\n  }\n}\n\nexport default NewParticipantForm;\n","import { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\ntype ParticipantParams = {\n  membership_ids: (string | undefined)[];\n  group_ids: (string | undefined)[];\n  membership_role_ids: (string | undefined)[];\n  status: string;\n  send_email_notification: boolean;\n  invite_consumers?: boolean;\n};\n\nexport function useAddParticipants(\n  appointmentId: string,\n  options: {\n    onSuccess: (\n      data: any,\n      params: { participant: ParticipantParams; apply_to?: \"this\" | \"all\" },\n    ) => void;\n    onError: (error: string) => void;\n  },\n) {\n  return useMutation(\n    (params: { participant: ParticipantParams; apply_to?: \"this\" | \"all\" }) =>\n      fetchApi(`/appointments/${appointmentId}/participants`, {\n        method: \"POST\",\n        body: params,\n      }),\n    options,\n  );\n}\n\nexport function useUpdateParticipation(\n  participantId: string,\n  appointmentId: string,\n  options: { onSuccess: () => void },\n) {\n  return useMutation(\n    (params: {\n      participant: {\n        status: string | null;\n      };\n      apply_to?: string;\n    }) =>\n      fetchApi(`/appointments/${appointmentId}/participants/${participantId}`, {\n        method: \"PUT\",\n        body: params,\n      }),\n    options,\n  );\n}\n\nexport function useDeleteParticipant(\n  participantId: string,\n  appointmentId: string,\n  options: { onSuccess: () => void },\n) {\n  return useMutation(\n    (params: { apply_to: string }) =>\n      fetchApi(`/appointments/${appointmentId}/participants/${participantId}`, {\n        method: \"DELETE\",\n        body: params,\n      }),\n    options,\n  );\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ntype StatusButtonArgs = {\n  changeStatus: () => void;\n  icon: IconProp;\n  isActive: boolean;\n  className: string;\n  isLoading: boolean;\n  disabled?: boolean;\n};\n\nexport default function StatusButton({\n  changeStatus,\n  icon,\n  isActive,\n  disabled,\n  className,\n  isLoading,\n}: StatusButtonArgs) {\n  return (\n    <button\n      onClick={onChangeStatus}\n      className={`btn btn-light btn-sm ${isActive ? \"active\" : \"\"}`}\n      disabled={isLoading || disabled}\n    >\n      <FontAwesomeIcon\n        icon={isLoading ? regular(\"spinner\") : icon}\n        className={isLoading ? \"interaction-icon-spinner\" : className}\n        spin={isLoading}\n      />\n    </button>\n  );\n\n  function onChangeStatus(e) {\n    e.preventDefault();\n    if (isActive) return;\n    changeStatus();\n  }\n}\n","import React, { useState } from \"react\";\nimport { isEmpty, map } from \"lodash\";\nimport StatusButton from \"./StatusButton\";\nimport {\n  showNameWithProfileField,\n  ExternalMemberBadge,\n} from \"components/memberships/MemberNameWithAdditions\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { useRecurringAppointment } from \"../../../hooks/useRecurringAppointment\";\nimport {\n  useDeleteParticipant,\n  useUpdateParticipation,\n} from \"components/appointments/participants/api\";\nimport { Membership } from \"../../../@types\";\nimport DropDown, { DropDownItem } from \"components/shared/DropDown\";\nimport RecurringAppointmentDecisionModal from \"components/shared/RecurringAppointmentDecisionModal\";\nimport { regular, solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\nconst PARTICIPANT_STATUS_LOOKUP = {\n  open: { icon: regular(\"circle-half-stroke\"), className: \"muted\" },\n  accepted: { icon: solid(\"circle\"), className: \"text-success\" },\n  declined: { icon: regular(\"circle\"), className: \"text-danger\" },\n};\n\ntype ParticipantRowArgs = {\n  id: string;\n  appointmentId: string;\n  membership: Membership;\n  status: \"accepted\" | \"open\" | \"declined\" | \"invited\";\n  reloadAppointment: () => void;\n};\n\nexport default function ParticipantRow({\n  membership,\n  status,\n  id,\n  appointmentId,\n  reloadAppointment,\n}: ParticipantRowArgs) {\n  const [showModal, setShowModal] = useState(false);\n  const [newStatus, setNewStatus] = useState<string | null>(null);\n\n  const { mutate: updateParticipation, isLoading } = useUpdateParticipation(\n    id,\n    appointmentId,\n    {\n      onSuccess: () => {\n        reloadAppointment();\n      },\n    },\n  );\n  const { mutate: deleteParticipant } = useDeleteParticipant(\n    id,\n    appointmentId,\n    {\n      onSuccess: () => {\n        reloadAppointment();\n      },\n    },\n  );\n\n  const displayModal = useRecurringAppointment(appointmentId);\n\n  function handleDecision(applyTo: string) {\n    if (applyTo) {\n      updateParticipation({\n        participant: { status: newStatus },\n        apply_to: applyTo,\n      });\n    }\n    handleCloseModal();\n  }\n\n  function handleCloseModal() {\n    setNewStatus(null);\n    setShowModal(false);\n  }\n\n  function onChangeParticipantStatus(status: string) {\n    if (displayModal) {\n      setNewStatus(status);\n      setShowModal(true);\n    } else {\n      setNewStatus(status);\n      updateParticipation({ participant: { status } });\n    }\n  }\n\n  function onRemoveParticipant(applyTo: string) {\n    window?.bridge?.confirm(\n      I18n.t(\"js.calendars.appointment.remove_participant.confirm_hint\"),\n      () => deleteParticipant({ apply_to: applyTo }),\n    );\n  }\n\n  return (\n    <tr className=\"participant-row text-sm\">\n      <td className=\"participant-info p-2\">\n        <span className=\"flex flex-row gap-2 items-center\">\n          <img\n            src={\n              !isEmpty(membership.images)\n                ? membership.images.small\n                : Assets[\"profile_25x25.jpg\"]\n            }\n            className=\"participant-membership-image rounded-full w-7 h-7\"\n          />\n          <a href={membership.path}>\n            {showNameWithProfileField({\n              name: membership.name,\n              detectionProfileField: membership.detection_profile_field,\n            })}\n          </a>\n          {membership.is_external ? <ExternalMemberBadge /> : null}\n        </span>\n      </td>\n      <td className=\"participant-status p-2\">\n        <span className=\"flex flex-row gap-2 items-baseline\">\n          <FontAwesomeIcon\n            icon={PARTICIPANT_STATUS_LOOKUP[status]?.icon}\n            className={`participant-status-icon ${PARTICIPANT_STATUS_LOOKUP[status]?.className}`}\n          />\n          {I18n.t(\n            `js.calendars.appointment.participant_status.${\n              status === \"invited\" ? \"open\" : status\n            }`,\n          )}\n        </span>\n      </td>\n      <td className=\"participant-status-interactions  p-2\">\n        <div className=\"btn-group\">\n          {map([\"open\", \"accepted\", \"declined\"], (state) => (\n            <StatusButton\n              key={state}\n              changeStatus={() => onChangeParticipantStatus(state)}\n              icon={PARTICIPANT_STATUS_LOOKUP[state].icon}\n              isActive={\n                state == \"open\"\n                  ? status === state || status === \"invited\"\n                  : status === state\n              }\n              className={PARTICIPANT_STATUS_LOOKUP[state]?.className}\n              isLoading={\n                state == \"open\"\n                  ? isLoading &&\n                    (newStatus === state || newStatus === \"invited\")\n                  : isLoading && newStatus === state\n              }\n            />\n          ))}\n        </div>\n      </td>\n      <td className=\"remove-participant-button  p-2\">\n        <div className=\"btn-group pull-right\">\n          <button\n            className=\"btn btn-light btn-sm dropdown-toggle\"\n            data-bs-toggle=\"dropdown\"\n          >\n            <FontAwesomeIcon icon={solid(\"ellipsis-h\")} className=\"\" />\n          </button>\n          <DropDown className=\"context-menu dropdown-menu\">\n            <DropDownItem\n              text={I18n.t(\"js.calendars.appointment.remove_participant.title\")}\n              onSelect={() => onRemoveParticipant(\"this\")}\n            />\n            {/^r-/.test(appointmentId) && (\n              <DropDownItem\n                text={I18n.t(\n                  \"js.calendars.appointment.remove_participant_from_recurring.title\",\n                )}\n                onSelect={() => onRemoveParticipant(\"this\")}\n              />\n            )}\n          </DropDown>\n        </div>\n      </td>\n      {showModal && (\n        <RecurringAppointmentDecisionModal\n          showModal={showModal}\n          onClose={handleCloseModal}\n          handleDecision={handleDecision}\n        />\n      )}\n    </tr>\n  );\n}\n","import React, { useState } from \"react\";\nimport { map, filter, includes, without, concat, isEmpty } from \"lodash\";\nimport classNames from \"classnames\";\n\nimport ParticipantRow from \"./ParticipantRow\";\nimport { Participant } from \"../../../@types/appointments\";\n\ntype ParticipantsOverviewArgs = {\n  participants: Participant[];\n  appointmentId: string;\n  reloadAppointment: () => void;\n};\n\nexport default function ParticipantsOverview({\n  participants,\n  appointmentId,\n  reloadAppointment,\n}: ParticipantsOverviewArgs) {\n  const [searchText, setSearchText] = useState(\"\");\n  const [activeFilter, setActiveFilter] = useState<string[]>([]);\n  const regex = new RegExp(`(${searchText})`, \"gi\");\n\n  const filteredParticipants: Participant[] = filter(\n    participants,\n    (participant: Participant) =>\n      !isEmpty(participant.membership.name.match(regex)) &&\n      (includes(activeFilter, participant.status) || isEmpty(activeFilter)),\n  );\n\n  function onSearch(event: { target: { value: string } }) {\n    setSearchText(event.target.value);\n  }\n\n  function changeActiveFilter(status: string) {\n    setActiveFilter(\n      includes(activeFilter, status)\n        ? without(activeFilter, status)\n        : concat(activeFilter, status),\n    );\n  }\n\n  return (\n    <div className=\"participants-overview\">\n      <div className=\"participants-search btn-toolbar\">\n        <input\n          className=\"participants-search-input border-box p-2 w-80 text-sm\"\n          onChange={onSearch}\n          placeholder={I18n.t(\"js.calendars.appointment.search_participants\")}\n        />\n        <div className=\"participants-status-filter flex flex-row gap-2 items-center flex-wrap\">\n          <div className=\"flex flex-row gap-2 items-baseline flex-wrap\">\n            <ul className=\"filter-bar border-none nav nav-pills unshim\">\n              {map([\"open\", \"accepted\", \"declined\"], (status) => (\n                <li\n                  className={classNames(\"nav-item\", {\n                    active: includes(activeFilter, status),\n                  })}\n                  key={status}\n                >\n                  <a\n                    className={classNames(\"filter-bar__link\", {\n                      active: includes(activeFilter, status),\n                    })}\n                    href=\"#\"\n                    onClick={(e) => {\n                      e.preventDefault();\n                      changeActiveFilter(status);\n                    }}\n                  >\n                    {I18n.t(\n                      `js.calendars.appointment.participant_status.${status}`,\n                    )}\n                  </a>\n                </li>\n              ))}\n            </ul>\n          </div>\n        </div>\n      </div>\n      <table className=\"w-full mt-4\">\n        <tbody className=\"divide-y divide-gray-300\">\n          {map(filteredParticipants, (participant) => (\n            <ParticipantRow\n              key={participant.id}\n              appointmentId={appointmentId}\n              reloadAppointment={reloadAppointment}\n              {...participant}\n            />\n          ))}\n        </tbody>\n      </table>\n    </div>\n  );\n}\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\nimport AppointmentPreview from \"components/appointments/participants/AppointmentPreview\";\nimport NewParticipantForm from \"components/appointments/participants/NewParticipantForm\";\nimport ParticipantsOverview from \"components/appointments/participants/ParticipantsOverview\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { useAppointment } from \"components/appointments/api\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular, solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport DropDown, { DropDownItem } from \"components/shared/DropDown\";\n\nexport default function ParticipantsView() {\n  const { id } = useParams();\n  const {\n    data: appointment,\n    isLoading,\n    refetch: reloadAppointment,\n  } = useAppointment(id);\n\n  return isLoading ? (\n    <p>{I18n.t(\"js.calendars.appointment.loading\")}</p>\n  ) : (\n    <div>\n      <PageTitle\n        title={I18n.t(\"js.calendars.appointment.participations.manage\")}\n      />\n      <div className=\"btn-toolbar\">\n        <div className=\"btn-group\">\n          <a\n            className=\"btn btn-light\"\n            href={`/appointments/${id}`}\n            title={I18n.t(\"js.back\")}\n          >\n            <FontAwesomeIcon icon={solid(\"caret-left\")} />\n            <FontAwesomeIcon icon={regular(\"bars\")} />\n          </a>\n        </div>\n        {appointment?.can.download_attendees &&\n          !isEmpty(appointment?.participants) && (\n            <div className=\"btn-group pull-right\">\n              <button\n                className=\"btn btn-light dropdown-toggle\"\n                data-bs-toggle=\"dropdown\"\n              >\n                <FontAwesomeIcon\n                  className=\"mr-2\"\n                  icon={regular(\"cloud-arrow-down\")}\n                />\n                {I18n.t(\"js.calendars.appointment.invitees.label\")}\n                <FontAwesomeIcon className=\"ml-2\" icon={solid(\"caret-down\")} />\n              </button>\n              <DropDown className=\"dropdown-menu\" alignment=\"start\">\n                <DropDownItem\n                  icon={regular(\"file-csv\")}\n                  text={I18n.t(\n                    \"js.calendars.appointment.invitees.download_as\",\n                    { file_ending: \"CSV\" },\n                  )}\n                  url={`/appointments/${id}/attendees.csv`}\n                />\n                <DropDownItem\n                  icon={regular(\"file-excel\")}\n                  text={I18n.t(\n                    \"js.calendars.appointment.invitees.download_as\",\n                    { file_ending: \"XLSX\" },\n                  )}\n                  url={`/appointments/${id}/attendees.xlsx`}\n                />\n              </DropDown>\n            </div>\n          )}\n      </div>\n      {appointment && (\n        <div className=\"participants-view my-4\">\n          <AppointmentPreview {...appointment} />\n          <NewParticipantForm\n            {...appointment}\n            reloadAppointment={reloadAppointment}\n          />\n\n          <ParticipantsOverview\n            participants={appointment?.participants}\n            appointmentId={appointment.id}\n            reloadAppointment={reloadAppointment}\n          />\n        </div>\n      )}\n    </div>\n  );\n}\n","import React, { FormEvent } from \"react\";\nimport { useNavigate } from \"helpers/tixxt-router\";\nimport Spectrum from \"components/shared/Spectrum\";\nimport {\n  CreateCalendarParams,\n  UpdateCalendarParams,\n} from \"components/appointments/calendars/api\";\nimport MemberSelect, { Value } from \"components/shared/MemberSelect\";\nimport { isEmpty, map, trim } from \"lodash\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { Membership } from \"../../../@types\";\n\nconst COLOR_POOL = [\n  \"CC2929\",\n  \"CC8129\",\n  \"C6CC29\",\n  \"A8CC29\",\n  \"6ACC29\",\n  \"29CC53\",\n  \"29CCB7\",\n  \"299CCC\",\n  \"2962CC\",\n  \"7229CC\",\n  \"CA29CC\",\n  \"CC296A\",\n];\n\ntype FormData = {\n  calendarName: string;\n  calendarColor: string;\n  calendarShare: Value[];\n};\n\ntype EditableCalendar = {\n  type?: string;\n  parent_id?: string;\n  id?: string;\n  name?: string;\n  memberships?: Membership[];\n  color?: string;\n};\n\ntype CalendarFormArgs = {\n  calendar: EditableCalendar;\n  onSubmit: (params: CreateCalendarParams | UpdateCalendarParams) => void;\n};\n\nexport default function CalendarForm({ calendar, onSubmit }: CalendarFormArgs) {\n  const navigate = useNavigate();\n\n  const { handleSubmit, control } = useForm<FormData>();\n\n  function submit({ calendarName, calendarColor, calendarShare }: FormData) {\n    const values = {\n      name: calendarName,\n      color: trim(calendarColor, \"#\"),\n      type: calendar.type,\n      membership_ids: !isEmpty(calendarShare)\n        ? map(calendarShare, \"value\")\n        : undefined,\n    };\n\n    if (calendar.id) {\n      onSubmit({\n        calendar: { id: calendar.id, ...values },\n      });\n    } else {\n      onSubmit({\n        parent_id: calendar.parent_id,\n        calendar: values,\n      });\n    }\n  }\n\n  function reset(e: FormEvent) {\n    e.preventDefault();\n    navigate(`/calendars/manage`);\n  }\n\n  return (\n    <div>\n      <div className=\"calendar-edit-view calendar-composer composer\">\n        <form\n          className=\"form-horizontal\"\n          onSubmit={handleSubmit(submit)}\n          onReset={reset}\n        >\n          <div className=\"control-group required string\">\n            <label className=\"control-label\">\n              {I18n.t(\"js.calendars.calendar.name\")}\n              <abbr className=\"ml-2\" title={I18n.t(\"required\")}>\n                *\n              </abbr>\n            </label>\n            <div className=\"controls\">\n              <Controller\n                name=\"calendarName\"\n                control={control}\n                defaultValue={calendar.name || \"\"}\n                render={({ field }) => (\n                  <input\n                    type=\"text\"\n                    {...field}\n                    placeholder={I18n.t(\"calendars.calendar.name\")}\n                  />\n                )}\n              />\n            </div>\n          </div>\n          <div className=\"control-group\">\n            <label className=\"control-label\">\n              {I18n.t(\"calendars.calendar.color\")}\n            </label>\n            <div className=\"controls\">\n              <Controller\n                name=\"calendarColor\"\n                control={control}\n                defaultValue={\n                  calendar.color ||\n                  COLOR_POOL[Math.floor(Math.random() * COLOR_POOL.length)]\n                }\n                render={({ field }) => (\n                  <Spectrum {...field} colorPalette={COLOR_POOL} showPalette />\n                )}\n              />\n            </div>\n          </div>\n          {calendar.type === \"personal\" && (\n            <div className=\"control-group member_select\">\n              <label className=\"control-label\">\n                {I18n.t(\"calendars.calendar.shares\")}\n              </label>\n              <div className=\"controls\">\n                <Controller\n                  name=\"calendarShare\"\n                  control={control}\n                  defaultValue={\n                    map(calendar.memberships, (member) => ({\n                      value: member.id,\n                      label: member.name,\n                      type: \"member\",\n                    })) || []\n                  }\n                  render={({ field }) => <MemberSelect field={field} multi />}\n                />\n              </div>\n            </div>\n          )}\n          <fieldset className=\"flex justify-end mt-2 gap-2\">\n            <button className=\"btn btn-light\" type=\"reset\">\n              {I18n.t(\"cancel\")}\n            </button>\n            <button className=\"btn btn-primary\" type=\"submit\">\n              {I18n.t(\"save\")}\n            </button>\n          </fieldset>\n        </form>\n      </div>\n    </div>\n  );\n}\n","import React from \"react\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport CalendarForm from \"components/appointments/calendars/CalendarForm\";\nimport { useNavigate, useSearchParams } from \"helpers/tixxt-router\";\nimport { useCreateCalendar } from \"components/appointments/calendars/api\";\n\nexport default function NewCalendarPage() {\n  const navigate = useNavigate();\n  const [searchParams] = useSearchParams();\n  const type = searchParams.get(\"type\");\n  const parentId = searchParams.get(\"parent_id\");\n\n  const { mutate: createCalendar } = useCreateCalendar({\n    onSuccess: () => {\n      toastr.success(I18n.t(\"js.saving_successful\"));\n      navigate(`/calendars/manage`);\n    },\n    onError: () => {\n      toastr.error(I18n.t(\"js.saving_failure\"));\n    },\n  });\n\n  const calendar = {\n    id: undefined,\n    name: undefined,\n    type: type || undefined,\n    parent_id: parentId || undefined,\n  };\n\n  return (\n    <>\n      <PageTitle title={I18n.t(\"calendars.add_calendar\")} />\n      <CalendarForm calendar={calendar} onSubmit={createCalendar} />\n    </>\n  );\n}\n","import React from \"react\";\nimport { useNavigate, useParams } from \"helpers/tixxt-router\";\nimport {\n  CreateCalendarParams,\n  UpdateCalendarParams,\n  useCalendar,\n  useUpdateCalendar,\n} from \"components/appointments/calendars/api\";\nimport CalendarForm from \"components/appointments/calendars/CalendarForm\";\nimport PageTitle from \"components/layout/PageTitle\";\n\nexport default function EditCalendarPage() {\n  const navigate = useNavigate();\n  const { id } = useParams();\n  const { data: calendar, isLoading } = useCalendar(id);\n\n  const { mutate: updateCalendar } = useUpdateCalendar({\n    onSuccess: () => {\n      toastr.success(I18n.t(\"js.saving_successful\"));\n      navigate(`/calendars/manage`);\n    },\n    onError: () => {\n      toastr.error(I18n.t(\"js.saving_failure\"));\n    },\n  });\n\n  const handleSubmit = (\n    params: UpdateCalendarParams | CreateCalendarParams,\n  ) => {\n    updateCalendar(params as UpdateCalendarParams);\n  };\n\n  return (\n    <>\n      <PageTitle title={I18n.t(\"calendars.edit_calendar\")} />\n      {!isLoading && calendar ? (\n        <CalendarForm calendar={calendar} onSubmit={handleSubmit} />\n      ) : (\n        I18n.t(\"js.loading\")\n      )}\n    </>\n  );\n}\n","import { convertRoutes } from \"components/tixxt/BackboneFeature\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport React from \"react\";\nimport AppointmentsPage from \"components/appointments/AppointmentPage\";\nimport ManageCalendarsPage from \"components/appointments/calendars/ManageCalendarsPage\";\nimport SubscribeCalendarsPage from \"components/appointments/calendars/SubscribeCalendarsPage\";\nimport ParticipantsView from \"components/appointments/participants/ParticipantsView\";\nimport NewCalendarPage from \"components/appointments/calendars/NewCalendarPage\";\nimport EditCalendarPage from \"components/appointments/calendars/EditCalendarPage\";\n\nconst backboneRoutes: RouteObject[] = convertRoutes({\n  feature: \"Calendars\",\n  featureRoutes: {\n    \"calendars/my\": \"showMyCalendars\",\n    \"calendars/shared\": \"showSharedCalendars\",\n    \"appointments/invites\": \"showAppointmentInvites\",\n    \"appointments/invites/archive\": \"showAppointmentInvitesArchive\",\n    \"appointments/new\": \"newAppointment\",\n    \"appointments/:id\": \"showAppointment\",\n    \"appointments/:id/edit\": \"editAppointment\",\n    \"appointments/:id/contact\": \"appointmentContact\",\n  },\n});\n\nconst reactRoutes: RouteObject[] = [\n  { path: \"/groups/:groupSlug/calendars\", element: <AppointmentsPage /> },\n  { path: \"/appointments\", element: <AppointmentsPage /> },\n  {\n    path: \"/appointments/participating\",\n    element: <AppointmentsPage participating />,\n  },\n  {\n    path: \"/calendars/manage\",\n    element: <ManageCalendarsPage />,\n  },\n  {\n    path: \"/calendars/subscribe\",\n    element: <SubscribeCalendarsPage />,\n  },\n  {\n    path: \"/calendars/new\",\n    element: <NewCalendarPage />,\n  },\n  {\n    path: \"/calendars/:id/edit\",\n    element: <EditCalendarPage />,\n  },\n  {\n    path: \"/appointments/:id/participants\",\n    element: <ParticipantsView />,\n  },\n];\n\nexport default reactRoutes.concat(backboneRoutes);\n","import React from \"react\";\nimport { map, join, find } from \"lodash\";\nimport classNames from \"classnames\";\nimport moment from \"moment\";\nimport { useNavigate } from \"helpers/tixxt-router\";\nimport { SimpleMembership } from \"../../@types\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ntype MessageRowProps = {\n  id: string;\n  subject: string;\n  members: SimpleMembership[];\n  date: string;\n  content: string;\n  selectMessage: (messageId: string) => void;\n  isActive: boolean;\n  read: boolean;\n  hasAttachments: boolean;\n  hasReplies: boolean;\n  conversationLength: number | undefined;\n  to_count: number | null;\n};\n\nfunction MessageRow({\n  id,\n  subject,\n  members,\n  date,\n  content,\n  selectMessage,\n  isActive,\n  read,\n  hasReplies,\n  hasAttachments,\n  conversationLength,\n  to_count,\n}: MessageRowProps) {\n  const member = members?.[0];\n  const navigate = useNavigate();\n\n  return (\n    <div\n      className={classNames(\"messageRow table-row\", {\n        activeMessageRow: isActive,\n        unreadMessage: !read,\n      })}\n    >\n      <div\n        className={\n          \"table-cell py-3 pl-3 pr-2.5 border-b border-b-neutral align-middle\"\n        }\n      >\n        <input\n          type=\"checkbox\"\n          onChange={() => selectMessage(id)}\n          checked={isActive}\n          aria-label=\"Select message\"\n          className={\"!w-6 !h-6\"}\n        />\n      </div>\n      <div className=\"messageRowMemberImage member-image table-cell py-3 px-1.5 border-b border-b-neutral align-middle\">\n        {members.length == 1 && member.html_url && member.name ? (\n          <a className=\"member-link\" href={member.html_url}>\n            <img\n              src={find(member.images, { width: 80, height: 80 })?.url}\n              alt={member.name}\n              title={member.name}\n              className={\"w-10 h-10 max-w-none\"}\n            />\n          </a>\n        ) : (\n          <i className=\"fa fa-users text-gray-400 w-10 h-10 block fa-xl flex items-center justify-center\" />\n        )}\n      </div>\n      <div\n        className=\"messageRowDetails table-cell w-3/12 py-3 px-1.5 border-b border-b-neutral align-middle\"\n        role=\"button\"\n        tabIndex={0}\n        onKeyDown={(e) => [\" \", \"Enter\"].includes(e.key) && navigateDetails()}\n        onClick={navigateDetails}\n      >\n        <div className=\"messageRowInfo\">\n          <div className=\"messageRowDateMember\">\n            <div className=\"messageRowMemberName\">\n              {member.html_url ? (\n                <a\n                  onClick={(e) => e.stopPropagation()}\n                  href={member.html_url}\n                  title={member.name}\n                  className={classNames({ \"font-semibold\": !read })}\n                >\n                  {member.name ||\n                    Preload.current_network.config.anonymize_membership_name}\n                </a>\n              ) : (\n                <span className={classNames({ \"font-semibold\": !read })}>\n                  {member.name ||\n                    Preload.current_network.config.anonymize_membership_name}\n                </span>\n              )}\n              {to_count && to_count > 1 ? (\n                <span\n                  className={\"text-muted text-sm\"}\n                  title={join(\n                    map(members, (m) => m.name),\n                    \", \",\n                  )}\n                >{` +${to_count - 1}`}</span>\n              ) : null}\n            </div>\n            <div className=\"messageRowMeta text-sm\">\n              <span className={\"text-muted\"}>\n                {moment(date).format(\"DD.MM.YYYY HH:mm\")}\n              </span>\n              {conversationLength ? <span> ({conversationLength})</span> : null}\n              {hasReplies ? (\n                <FontAwesomeIcon\n                  icon={solid(\"reply\")}\n                  className={\"text-muted ml-1\"}\n                  title={I18n.t(\"js.messages.message_list.replied_icon_title\")}\n                />\n              ) : null}\n            </div>\n          </div>\n        </div>\n      </div>\n      <div\n        className={classNames(\n          \"messageRowContent table-cell w-9/12 py-3 px-1.5 border-b border-b-neutral\",\n          {\n            \"text-gray-400\": read,\n          },\n        )}\n        role=\"button\"\n        tabIndex={0}\n        onKeyDown={(e) => [\" \", \"Enter\"].includes(e.key) && navigateDetails()}\n        onClick={navigateDetails}\n      >\n        {subject ? (\n          <p className={\"font-semibold\"}>{subject}</p>\n        ) : (\n          <p>{I18n.t(\"js.messages.composer.no_subject\")}</p>\n        )}\n        <p>{content}</p>\n      </div>\n      <div\n        className={\n          \"table-cell py-3 px-1.5 pr-3 border-b border-b-neutral align-middle\"\n        }\n      >\n        {hasAttachments ? (\n          <i className=\"fa-light fa-paperclip-vertical fa-xl text-gray-400\" />\n        ) : null}\n      </div>\n    </div>\n  );\n\n  function navigateDetails() {\n    navigate(`/messages/${id}`, {\n      state: {\n        pathname: location.pathname,\n        search: location.search,\n      },\n    });\n  }\n}\n\nexport default MessageRow;\n","import type { MouseEventHandler } from \"react\";\nimport React from \"react\";\nimport { isEmpty, map } from \"lodash\";\nimport classNames from \"classnames\";\n\nfunction InteractionsButton({\n  onClick,\n  className,\n  icons,\n  title,\n  isDisabled = false,\n  onlyIcon,\n}: InteractionsButtonProps) {\n  return (\n    <button\n      className={classNames(\"btn btn-sm btn-light\", className)}\n      onClick={onClick}\n      disabled={isDisabled}\n    >\n      {map(icons, (iconClassName, index) => (\n        <i\n          key={index}\n          className={classNames(`${iconClassName} text-primary`, {\n            \"mr-1\": !(onlyIcon || isEmpty(title)),\n          })}\n        />\n      ))}\n\n      {onlyIcon ? null : title}\n    </button>\n  );\n}\n\ninterface InteractionsButtonProps {\n  onClick: MouseEventHandler;\n  className?: string;\n  icons?: Array<string>;\n  title?: string;\n  isDisabled?: boolean;\n  onlyIcon?: boolean;\n  testId?: string;\n}\n\nexport default InteractionsButton;\n","import { useMutation, useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { SimpleMembership } from \"../../@types\";\n\nexport type TrimmedMessage = {\n  id: string;\n  created_at: string;\n  author: SimpleMembership;\n  to: [SimpleMembership] | SimpleMembership[];\n  to_count: number;\n  subject: string;\n  plain_content: string;\n  html_content: string;\n  has_replies: boolean;\n  has_attachments: boolean;\n  i: {\n    marked: boolean;\n    read: boolean;\n  };\n  conversation_length: number;\n};\n\ntype MessagesPayload = {\n  messages: TrimmedMessage[];\n  offset: number;\n  limit: number;\n  total: number;\n  next_url: string | null;\n};\n\nexport function useFetchMessages(\n  filter: string,\n  page: number,\n  options = { keepPreviousData: true },\n) {\n  const query = `?limit=10&offset=${(page - 1) * 10}`;\n  return useQuery<MessagesPayload>(\n    [\"messages\", filter, page],\n    () => fetchApi(`/api/v1/messages${filter ? `/${filter}${query}` : query}`),\n    options,\n  );\n}\n\nexport function useFetchMessage(messageId: string, options = {}) {\n  return useQuery(\n    [\"message\", messageId],\n    () => fetchApi(`/api/v1/messages/${messageId}`),\n    options,\n  );\n}\n\nexport function useDeleteMessage(filter, messageId, options = {}) {\n  if (filter === \"sent\") {\n    return useMutation(\n      () =>\n        fetchApi(`/api/v1/messages/sent/${messageId}`, {\n          method: \"DELETE\",\n        }),\n      options,\n    );\n  }\n  return useMutation(\n    () =>\n      fetchApi(`/api/v1/messages/${messageId}`, {\n        method: \"DELETE\",\n      }),\n    options,\n  );\n}\n\nexport function useDeleteMessages(filter, options = {}) {\n  if (filter === \"sent\") {\n    return useMutation(\n      (messageIds: string[]) =>\n        fetchApi(`/api/v1/messages/sent/delete`, {\n          method: \"DELETE\",\n          body: {\n            message_ids: messageIds,\n          },\n        }),\n      options,\n    );\n  }\n  return useMutation(\n    (messageIds: string[]) =>\n      fetchApi(`/api/v1/messages/delete`, {\n        method: \"DELETE\",\n        body: {\n          message_ids: messageIds,\n        },\n      }),\n    options,\n  );\n}\n\nexport function useMarkMessageAsUnread(options = {}) {\n  return useMutation(\n    (messageId: string) =>\n      fetchApi(`/api/v1/messages/${messageId}/read`, {\n        method: \"DELETE\",\n      }),\n    options,\n  );\n}\n\nexport function useMarkMessageAsRead(options = {}) {\n  return useMutation(\n    (messageId: string) =>\n      fetchApi(`/api/v1/messages/${messageId}/read`, {\n        method: \"POST\",\n      }),\n    options,\n  );\n}\n\nexport function useMarkMessagesAsUnread(options = {}) {\n  return useMutation(\n    (messageIds: string[]) =>\n      fetchApi(`/api/v1/messages/read`, {\n        method: \"DELETE\",\n        body: {\n          message_ids: messageIds,\n        },\n      }),\n    options,\n  );\n}\n\nexport function useMarkMessagesAsRead(options = {}) {\n  return useMutation(\n    (messageIds: string[]) =>\n      fetchApi(`/api/v1/messages/read`, {\n        method: \"POST\",\n        body: {\n          message_ids: messageIds,\n        },\n      }),\n    options,\n  );\n}\n\nexport function useSendMessage(options = {}) {\n  return useMutation(\n    (body: Record<PropertyKey, unknown>) =>\n      fetchApi(`/api/v1/messages`, {\n        method: \"POST\",\n        body,\n      }),\n    options,\n  );\n}\n\nexport function onError() {\n  toastr.error(I18n.t(\"js.generic_network_error\"));\n}\n","import React, { Fragment, useEffect } from \"react\";\nimport { isEmpty, divide, ceil, floor, size } from \"lodash\";\nimport { queryClient } from \"helpers/queryClient\";\nimport InteractionsButton from \"./InteractionsButton\";\nimport Pagination from \"../shared/Pagination\";\nimport {\n  useDeleteMessages,\n  useMarkMessagesAsRead,\n  useMarkMessagesAsUnread,\n  onError,\n  TrimmedMessage,\n} from \"./api\";\nimport classNames from \"classnames\";\n\ntype MessagesInteractionsProps = {\n  filter: \"\" | \"sent\";\n  total: number;\n  limit: number;\n  offset: number;\n  messages: TrimmedMessage[];\n  isFetching: boolean;\n  selectedMessageIds: Array<string>;\n  setSelectedMessageIds: (ids: string[]) => void;\n  onLoadMoreMessages: (page: number) => void;\n  refetchMessages: () => void;\n};\n\nfunction MessagesInteractions({\n  filter,\n  total,\n  limit,\n  offset,\n  messages,\n  isFetching,\n  selectedMessageIds,\n  setSelectedMessageIds,\n  onLoadMoreMessages,\n  refetchMessages,\n}: MessagesInteractionsProps) {\n  const allMessageIds = messages?.map((m) => m.id);\n  const { mutate: deleteMessages } = useDeleteMessages(filter, {\n    onSuccess: () => {\n      // need to call refetch to update messages list in turbo app\n      refetchMessages();\n      toastr.success(I18n.t(\"js.messages.messages_deleted\"));\n    },\n    onError,\n  });\n  const { mutate: markAsRead, isLoading: isLoadingRead } =\n    useMarkMessagesAsRead({\n      onSuccess: () => {\n        queryClient.invalidateQueries([\"messages\", filter, page]);\n      },\n      onError,\n    });\n  const { mutate: markAsUnread, isLoading: isLoadingUnread } =\n    useMarkMessagesAsUnread({\n      onSuccess: () => {\n        queryClient.invalidateQueries([\"messages\", filter, page]);\n      },\n      onError,\n    });\n\n  const page = floor(divide(offset, limit)) + 1;\n\n  useEffect(() => {\n    setSelectedMessageIds([]);\n    return () => setSelectedMessageIds([]);\n  }, [filter]);\n\n  const checked = size(selectedMessageIds) === size(messages);\n  const indeterminate =\n    size(selectedMessageIds) > 0 && size(selectedMessageIds) < size(messages);\n\n  return total > 0 ? (\n    <>\n      <div className={\"flex justify-end\"}>\n        <Pagination\n          page={page}\n          totalPages={ceil(divide(total, limit))}\n          onPaginate={onLoadMoreMessages}\n          loading={isFetching}\n          width={2}\n        />\n      </div>\n      <div\n        className={\n          \"messages-interactions flex gap-2 mt-2 px-3 py-2 bg-gray-100 border-b border-b-neutral\"\n        }\n      >\n        {total > 0 ? (\n          <input\n            type=\"checkbox\"\n            onChange={onSelectAllMessages}\n            checked={checked}\n            title={I18n.t(\"js.messages.message_list.mark_all\")}\n            className={classNames(\"!h-6 !w-6 mr-2\", {\n              \"!bg-primary !border-primary\": indeterminate,\n            })}\n            ref={(input) => {\n              if (input) input.indeterminate = indeterminate;\n            }}\n          />\n        ) : null}\n        {filter !== \"sent\" ? (\n          <Fragment>\n            <InteractionsButton\n              onClick={onReadMessages}\n              isDisabled={isEmpty(selectedMessageIds) || isLoadingRead}\n              icons={[\"fa-regular fa-circle-check text-success fa-lg\"]}\n              title={I18n.t(\"js.messages.index_toolbar.read\")}\n            />\n            <InteractionsButton\n              onClick={onUnreadMessages}\n              isDisabled={isEmpty(selectedMessageIds) || isLoadingUnread}\n              icons={[\"fa-regular fa-envelope text-normal fa-lg\"]}\n              title={I18n.t(\"js.messages.index_toolbar.unread\")}\n            />\n          </Fragment>\n        ) : null}\n        <InteractionsButton\n          onClick={onDeleteMessages}\n          isDisabled={isEmpty(selectedMessageIds)}\n          icons={[\"fa-regular fa-trash-can text-danger fa-lg\"]}\n          title={I18n.t(\"js.messages.index_toolbar.delete\")}\n        />\n      </div>\n    </>\n  ) : null;\n\n  function onSelectAllMessages() {\n    if (\n      isEmpty(selectedMessageIds) ||\n      size(selectedMessageIds) < size(messages)\n    ) {\n      setSelectedMessageIds(allMessageIds);\n    } else {\n      setSelectedMessageIds([]);\n    }\n  }\n\n  function onDeleteMessages() {\n    const confirmMessage =\n      filter === \"sent\"\n        ? `${I18n.t(\"js.delete_confirmation\")}\\n${I18n.t(\n            \"js.messages.delete_confirmation_sent\",\n          )}`\n        : I18n.t(\"js.delete_confirmation\");\n\n    window.bridge?.confirm(confirmMessage, () => {\n      deleteMessages(selectedMessageIds);\n      setSelectedMessageIds([]);\n    });\n  }\n\n  function onReadMessages() {\n    markAsRead(selectedMessageIds);\n    setSelectedMessageIds([]);\n  }\n\n  function onUnreadMessages() {\n    markAsUnread(selectedMessageIds);\n    setSelectedMessageIds([]);\n  }\n}\n\nexport default MessagesInteractions;\n","import React, { useEffect, useState } from \"react\";\nimport {\n  map,\n  includes,\n  pull,\n  get,\n  toInteger,\n  isEmpty,\n  divide,\n  ceil,\n} from \"lodash\";\n\nimport { useNavigate } from \"helpers/tixxt-router\";\nimport { useQueryParams } from \"helpers/useQueryParams\";\nimport MessageRow from \"./MessageRow\";\nimport MessagesInteractions from \"./MessagesInteractions\";\nimport { useFetchMessages } from \"./api\";\nimport { MessagesListProps } from \"./@types\";\nimport Pagination from \"components/shared/Pagination\";\n\nfunction MessagesList({ filter = \"\" }: MessagesListProps) {\n  const [selectedMessageIds, setSelectedMessageIds] = useState<string[]>([]);\n  const { page: pageParam } = useQueryParams();\n  const [page, setPage] = useState<number>(toInteger(pageParam || \"1\"));\n  const { isLoading, isFetching, data, refetch } = useFetchMessages(\n    filter,\n    page,\n  );\n\n  useEffect(() => {\n    if (page !== 1) setPage(1);\n  }, [filter]);\n\n  const navigate = useNavigate();\n\n  if (isLoading)\n    return (\n      <div className=\"messagesLoading\">\n        <i className=\"fa fa-spinner fa-spin\" />\n      </div>\n    );\n\n  return (\n    <div className=\"message-list-view mb-8\">\n      {data && (\n        <MessagesInteractions\n          filter={filter}\n          {...data}\n          isFetching={isFetching}\n          refetchMessages={refetch}\n          selectedMessageIds={selectedMessageIds}\n          setSelectedMessageIds={setSelectedMessageIds}\n          onLoadMoreMessages={onLoadMoreMessages}\n        />\n      )}\n      <div className=\"table w-full\">\n        <div className=\"table-row-group\">\n          {isEmpty(data) ? (\n            <span>{I18n.t(\"js.messages.message_list.no_messages\")}</span>\n          ) : (\n            map(data?.messages, (message) => {\n              const id = get(message, \"id\");\n\n              return (\n                <MessageRow\n                  id={id}\n                  key={id}\n                  subject={get(message, \"subject\")}\n                  date={get(message, \"created_at\")}\n                  members={\n                    filter === \"sent\"\n                      ? get(message, \"to\")\n                      : [get(message, \"author\")]\n                  }\n                  to_count={filter === \"sent\" ? message?.to_count : null}\n                  content={get(message, \"plain_content\")}\n                  selectMessage={onSetMessageId}\n                  isActive={includes(selectedMessageIds, id)}\n                  read={get(message, \"i.read\")}\n                  hasReplies={get(message, \"has_replies\")}\n                  hasAttachments={get(message, \"has_attachments\")}\n                  conversationLength={message.conversation_length}\n                />\n              );\n            })\n          )}\n        </div>\n      </div>\n      <div className={\"flex justify-end\"}>\n        {data && (\n          <Pagination\n            page={page}\n            totalPages={ceil(divide(data.total, data.limit))}\n            onPaginate={onLoadMoreMessages}\n            loading={isFetching}\n            width={2}\n          />\n        )}\n      </div>\n    </div>\n  );\n\n  function onLoadMoreMessages(page: number) {\n    setPage(page);\n    setSelectedMessageIds([]);\n    const navigationUrl = filter ? `/messages/${filter}` : \"/messages\";\n    if (page === 1) {\n      navigate(navigationUrl);\n    } else {\n      navigate(`${navigationUrl}?page=${page}`);\n    }\n  }\n\n  function onSetMessageId(messageId: string) {\n    if (includes(selectedMessageIds, messageId)) {\n      setSelectedMessageIds([...pull(selectedMessageIds, messageId)]);\n    } else {\n      setSelectedMessageIds([...selectedMessageIds, messageId]);\n    }\n  }\n}\n\nexport default MessagesList;\n","import React from \"react\";\nimport PageTitle, { Subtitle } from \"components/layout/PageTitle\";\nimport MessagesList from \"components/messages/MessagesList\";\nimport { useSelector } from \"react-redux\";\nimport { get } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport classNames from \"classnames\";\n\nexport function InboxToolbar({ className }: { className?: string }) {\n  const sendDirectMessages = useSelector((state) =>\n    get(state, \"currentMember.can.send_direct_messages\"),\n  );\n  if (!sendDirectMessages) return null;\n\n  return (\n    <div className={classNames(\"btn-toolbar justify-end\", className)}>\n      <a className=\"btn btn-primary\" href=\"/messages/new\">\n        <FontAwesomeIcon icon={regular(\"pen-line\")} className={\"mr-2\"} />\n        {I18n.t(\"js.messages.new.new_message\")}\n      </a>\n    </div>\n  );\n}\n\nexport default function InboxPage() {\n  return (\n    <>\n      <PageTitle title={I18n.t(\"js.messages.module_name\")} />\n      <Subtitle className={\"mb-3 mt-8\"}>\n        {I18n.t(\"js.messages.index.title\")}\n      </Subtitle>\n      <InboxToolbar className={\"mb-10\"} />\n      <MessagesList />\n    </>\n  );\n}\n","import React from \"react\";\nimport PageTitle, { Subtitle } from \"components/layout/PageTitle\";\nimport MessagesList from \"components/messages/MessagesList\";\nimport { InboxToolbar } from \"components/messages/InboxPage\";\n\nexport default function SentPage() {\n  return (\n    <>\n      <PageTitle title={I18n.t(\"js.messages.module_name\")} />\n      <Subtitle className={\"mb-3 mt-8\"}>\n        {I18n.t(\"js.messages.sent.title\")}\n      </Subtitle>\n      <InboxToolbar className={\"mb-10\"} />\n      <MessagesList filter=\"sent\" />\n    </>\n  );\n}\n","import React from \"react\";\nimport { useNavigate } from \"helpers/tixxt-router\";\n\ninterface BackButtonProps {\n  title?: string;\n  href?: string;\n}\n\nexport function BackButton({ title, href = \"#\" }: BackButtonProps) {\n  const navigate = useNavigate();\n\n  return (\n    <div className=\"btn-group desktop-only\">\n      <a\n        className=\"btn btn-light btn-sm backButton\"\n        href={href}\n        onClick={(e) => {\n          e.preventDefault();\n          if (navigate) {\n            if (href !== \"#\") {\n              navigate(href);\n            } else {\n              navigate(-1);\n            }\n            // Stop the handler in routes to manipulate the history again.\n            e.nativeEvent.stopImmediatePropagation();\n          } else {\n            window.history.back();\n          }\n        }}\n        title={title}\n      >\n        <i className=\"fa fa-arrow-left text-primary\" />\n      </a>\n    </div>\n  );\n}\n\nexport default BackButton;\n","import React, { useState } from \"react\";\nimport { Field } from \"redux-form\";\nimport classNames from \"classnames\";\nimport useTooltip from \"hooks/useTooltip\";\nimport \"./CheckboxField.css\";\n\ninterface CheckboxFieldProps {\n  name: string;\n  label: string;\n  type?: \"radio\" | \"checkbox\";\n  className?: string;\n  disabled?: boolean;\n  required?: boolean;\n  value?: boolean | string;\n\n  setValue?(val: boolean): void;\n\n  id?: string;\n  labelHint?: string;\n  additionalText?: string;\n}\n\nexport default function CheckboxField({\n  name,\n  type = \"checkbox\",\n  className,\n  disabled,\n  required,\n  value = false,\n  setValue,\n  label,\n  id,\n  labelHint,\n  additionalText,\n}: CheckboxFieldProps) {\n  if (!setValue) {\n    const [val, setVal] = useState(value);\n    value = val;\n    setValue = setVal;\n  }\n\n  const tooltipRef = useTooltip<HTMLLabelElement>();\n\n  let labelProps = {};\n\n  if (labelHint) {\n    labelProps = { [\"data-bs-toggle\"]: \"tooltip\", title: I18n.t(labelHint) };\n  }\n\n  return (\n    <>\n      <label\n        ref={tooltipRef}\n        className={classNames(\n          className,\n          type,\n          additionalText ? \"checkboxfield__label\" : \"\",\n        )}\n        {...labelProps}\n      >\n        <Field\n          name={name}\n          component=\"input\"\n          type={type}\n          required={required}\n          value={String(value)}\n          onChange={(_, newVal) => setValue?.(newVal)}\n          disabled={disabled}\n          id={id}\n        />\n        {label}\n      </label>\n\n      {additionalText ? (\n        <p className=\"additionalText\">\n          <i className=\"fa fa-exclamation text-info mr-2\" />\n          {additionalText}\n        </p>\n      ) : null}\n    </>\n  );\n}\n","import React, { Fragment, useMemo } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport {\n  map,\n  each,\n  uniqBy,\n  castArray,\n  isArray,\n  compact,\n  debounce,\n} from \"lodash\";\nimport { Field } from \"redux-form\";\nimport AsyncSelect from \"react-select/async\";\n\nimport { showNameWithProfileField } from \"components/memberships/MemberNameWithAdditions\";\nimport styles from \"../appCreator/properties/edit/editFields.module.css\";\nimport { fetchMembersAndGroups } from \"actions/memberships\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\n\nconst normalizeValue = (value) => {\n  if (value === null) return null; // When nothing is selected\n  if (isArray(value)) return map(value, normalizeValue);\n\n  return {\n    id: value.value,\n    displayValue: value.label,\n    type: value.type,\n  };\n};\n\nconst formatValue = (state) =>\n  map(compact(castArray(state)), ({ id, displayName, displayValue, type }) => ({\n    value: id,\n    label: displayName || displayValue,\n    type: type,\n  }));\n\nconst formatResponse = (results) => {\n  const members: Array<{ label: string; value: string; type: string }> = [];\n  const groups: Array<{\n    label: string;\n    value: string;\n    category: string;\n    type: string;\n  }> = [];\n  let groupCategories: Array<{ label: string; id: string }> = [];\n\n  each(results, (result) => {\n    if (result.type === \"member\") {\n      members.push({\n        label: showNameWithProfileField({\n          name: result.name,\n          detectionProfileField: result.detection_profile_field,\n          isExternal: result.is_external,\n        }),\n        value: result.id,\n        type: \"member\",\n      });\n    } else {\n      groupCategories.push({\n        label: result.category.name,\n        id: result.category.id,\n      });\n      groups.push({\n        label: result.name,\n        value: result.id,\n        category: result.category.id,\n        type: \"group\",\n      });\n    }\n  });\n\n  groupCategories = uniqBy(groupCategories, \"id\");\n  const finalResults: Array<{ label: string; options: typeof members }> = [];\n\n  if (members.length > 0) {\n    finalResults.push({\n      label: I18n.t(\"js.directory.title.members\"),\n      options: members,\n    });\n  }\n  if (groups.length > 0) {\n    each(groupCategories, (cat) => {\n      finalResults.push({\n        label: cat.label,\n        options: groups.filter((group) => group.category === cat.id),\n      });\n    });\n  }\n\n  return finalResults;\n};\n\ninterface SelectAdapterTypes {\n  input?: Record<PropertyKey, unknown>;\n  required?: boolean;\n  id: string;\n  disabled: boolean;\n  className?: string;\n  multiple: boolean;\n  meta?: { error?: string };\n  extraQueryParams?: {\n    only_my_groups?: boolean;\n    only_my_admin_groups?: boolean;\n  };\n}\n\nfunction SelectAdapter({\n  input,\n  required,\n  id,\n  disabled,\n  className,\n  multiple,\n  meta = {},\n  extraQueryParams = {},\n}: SelectAdapterTypes) {\n  const dispatch = useDispatch();\n  const loadOptions = useMemo(\n    () =>\n      debounce(async (value, callback) => {\n        const params = { ...extraQueryParams, q: value };\n        const { payload } = await dispatch(fetchMembersAndGroups(params));\n        callback(formatResponse(payload.entries));\n      }, 375),\n    [],\n  );\n\n  const props = {\n    ...input,\n    // workaround for mobile,\n    // see ticket #9930 or issue https://github.com/JedWatson/react-select/issues/2692#issuecomment-395743446\n    onBlur: (e) => e.preventDefault(),\n    isClearable: !required,\n    isDisabled: disabled,\n    inputId: id,\n    placeholder: I18n.t(\"js.member_select.placeholder\"),\n    noOptionsMessage: () => I18n.t(\"plugins.select2.no_match\"),\n    className,\n    loadOptions: (value, callback) => {\n      loadOptions(value, callback);\n    },\n    isMulti: multiple,\n    styles: { menu: (base) => ({ ...base, zIndex: 999 }) },\n  };\n\n  return (\n    <Fragment>\n      <AsyncSelect {...props} classNamePrefix={\"Select\"} />\n      {meta.error && <FieldError error={meta.error} />}\n    </Fragment>\n  );\n}\n\ninterface MembershipAndGroupFieldTypes extends SelectAdapterTypes {\n  name: string;\n  multiple: boolean;\n}\nfunction MembershipAndGroupField({\n  name,\n  required,\n  disabled,\n  id,\n  multiple,\n  extraQueryParams,\n}: MembershipAndGroupFieldTypes) {\n  return (\n    <Field\n      component={SelectAdapter}\n      name={name}\n      required={required}\n      disabled={disabled}\n      normalize={normalizeValue}\n      format={formatValue}\n      multiple={multiple}\n      id={id}\n      props={{\n        className: `${styles.Membership} property-${name}`,\n        extraQueryParams,\n      }}\n    />\n  );\n}\n\nexport default MembershipAndGroupField;\n","import React, { useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { formValueSelector } from \"redux-form\";\nimport {\n  networkAdminSelector,\n  currentMemberSelector,\n} from \"selectors/environment\";\nimport CheckboxField from \"components/shared/fields/CheckboxField\";\nimport MembershipAndGroupField from \"components/shared/MembershipAndGroupField\";\nimport TextField from \"components/appCreator/properties/edit/TextField\";\nimport FileField from \"components/appCreator/properties/edit/FileField\";\nimport { State } from \"@types\";\n\nfunction MessageForm() {\n  const currentMember = useSelector((state: State) =>\n    currentMemberSelector(state),\n  );\n  const isAdmin = useSelector(networkAdminSelector);\n  const toAllNetworkMembers = useSelector((state) =>\n    formValueSelector(\"newMessage\")(state as State, \"to_all_network_members\"),\n  );\n  const to = useSelector((state) =>\n    formValueSelector(\"newMessage\")(state as State, \"to\"),\n  );\n  const hasGroupRecipient = (to || []).find((to) => to.type === \"group\");\n  const [toAll, setToAll] = useState(false);\n\n  return (\n    <div className=\"flex flex-col gap-3 mb-6\">\n      <div className=\"border-box p-3 flex justify-start items-start gap-2 bg-gray-50\">\n        <div className={\"flex items-center gap-2\"}>\n          {currentMember && (\n            <img\n              className={\"member-image w-10 h-10\"}\n              src={currentMember.images[\"40x40@2\"]}\n              alt=\"\"\n              aria-hidden\n            />\n          )}\n          <label className=\"font-semibold\">\n            {I18n.t(\"js.messages.composer.to\")}\n          </label>\n        </div>\n        <div className=\"grow space-y-2\">\n          <MembershipAndGroupField\n            name=\"to\"\n            multiple\n            id=\"to\"\n            extraQueryParams={{ only_my_admin_groups: !isAdmin }}\n            disabled={toAllNetworkMembers}\n          />\n\n          {isAdmin ? (\n            <CheckboxField\n              type=\"checkbox\"\n              className=\"checkbox items-center gap-2\"\n              label={I18n.t(\"js.messages.composer.to_all_network_members\")}\n              name=\"to_all_network_members\"\n              id=\"to_all_network_members\"\n              value={toAll}\n              setValue={setToAll}\n              additionalText={\n                toAll\n                  ? I18n.t(\"js.messages.composer.warn_to_all_network_members\")\n                  : hasGroupRecipient\n                    ? I18n.t(\"js.messages.composer.warn_to_all_group_members\")\n                    : \"\"\n              }\n            />\n          ) : null}\n        </div>\n      </div>\n\n      <div className=\"inline items-center gap-2\">\n        <label className=\"font-semibold\">\n          {I18n.t(\"js.messages.composer.subject\")}\n        </label>\n        <TextField name=\"subject\" htmlId=\"subject\" />\n      </div>\n\n      <TextField name=\"content\" htmlId=\"content\" multiline />\n      <div className=\"inline items-center \">\n        <label className=\"font-semibold\">\n          {I18n.t(\"js.messages.composer.attachments\")}\n        </label>\n        <FileField name=\"attachments\" htmlId=\"attachments\" multiple />\n      </div>\n    </div>\n  );\n}\n\nexport default MessageForm;\n","import React, { Fragment, useEffect } from \"react\";\nimport { map, isEmpty, get, filter } from \"lodash\";\nimport { SubmissionError, change } from \"redux-form\";\nimport { useDispatch } from \"react-redux\";\nimport { useNavigate } from \"helpers/tixxt-router\";\nimport publishAllVolatile from \"helpers/files/publishAllVolatile\";\nimport ReduxForm from \"components/shared/reduxForm\";\nimport BackButton from \"components/shared/BackButton\";\nimport { useFetchBaseMembershipData } from \"actions/memberships\";\nimport { useQueryParams } from \"helpers/useQueryParams\";\nimport MessageForm from \"./MessageForm\";\nimport { useSendMessage } from \"../api\";\nimport { messageInitialValues } from \"../message\";\nimport useFileProcessing from \"components/shared/hooks/useFileProcessing\";\n\nfunction MessageComposer({ initialValues }: MessageComposerProps) {\n  const dispatch = useDispatch();\n  const navigate = useNavigate();\n  const params = useQueryParams();\n  const membershipId = params.to;\n  const { data } = useFetchBaseMembershipData(membershipId);\n  const { mutateAsync: sendMessage } = useSendMessage();\n\n  useEffect(() => {\n    if (membershipId && !isEmpty(membershipId)) {\n      dispatch(\n        change(\"newMessage\", \"to\", [\n          { id: membershipId, displayValue: I18n.t(\"js.tasks.loading\") },\n        ]),\n      );\n    }\n  }, []);\n\n  useEffect(() => {\n    if (!data) return;\n\n    dispatch(\n      change(\"newMessage\", \"to\", [\n        { id: membershipId, displayValue: data.name },\n      ]),\n    );\n  }, [data]);\n\n  useEffect(() => {\n    if (!window.isApp) {\n      window.addEventListener(\"beforeunload\", onUnload);\n\n      return () => window.removeEventListener(\"beforeunload\", onUnload);\n    }\n  }, []);\n\n  function onUnload(e) {\n    e.preventDefault();\n  }\n\n  const fileProcessing = useFileProcessing(\"newMessage\", \"attachments\");\n\n  return (\n    <Fragment>\n      {!initialValues ? (\n        <div className=\"px-3 py-2 border-box mb-10\">\n          <BackButton />\n        </div>\n      ) : null}\n      <ReduxForm\n        form=\"newMessage\"\n        className=\"form-horizontal mb-10\"\n        renderChildren={MessageForm}\n        fullWidth={true}\n        initialValues={initialValues}\n        submitText={I18n.t(\"js.messages.composer.send\")}\n        submitIcon=\"fa fa-paper-plane\"\n        enableReinitialize\n        onSubmit={onSubmit}\n        processing={fileProcessing}\n        onSubmitSuccess={() => {\n          navigate(\"/messages\");\n          toastr.success(I18n.t(\"js.messages.message_sent\"));\n        }}\n        onSubmitFail={(error: Error) =>\n          toastr.error(error?.message || I18n.t(\"js.messages.message_not_sent\"))\n        }\n      />\n    </Fragment>\n  );\n\n  async function onSubmit(values: Record<PropertyKey, unknown>) {\n    interface Recipient {\n      type: string;\n    }\n\n    if (isEmpty(values.to) && !values.to_all_network_members) {\n      throw new SubmissionError({\n        message: I18n.t(\"js.messages.composer.missing_recipient\"),\n      });\n    }\n\n    const attachments = !isEmpty(get(values, \"attachments\"))\n      ? await publishAllVolatile({\n          dispatch,\n          values: { attachments: get(values, \"attachments\") },\n          storageDirectory: \"files\",\n        })\n      : [];\n\n    await sendMessage(\n      {\n        ...values,\n        to: map(\n          filter(\n            values.to as Record<PropertyKey, unknown>,\n            (recipient: Recipient) => recipient.type != \"group\",\n          ),\n          \"id\",\n        ),\n        to_group: map(\n          filter(\n            values.to as Record<PropertyKey, unknown>,\n            (recipient: Recipient) => recipient.type == \"group\",\n          ),\n          \"id\",\n        ),\n        ...attachments,\n      },\n      {\n        onError: () => {\n          throw new SubmissionError({});\n        },\n      },\n    );\n  }\n}\n\ninterface MessageComposerProps {\n  initialValues?: ReturnType<typeof messageInitialValues>;\n}\n\nexport default MessageComposer;\n","import React from \"react\";\nimport PageTitle, { Subtitle } from \"components/layout/PageTitle\";\nimport MessageComposer from \"components/messages/composer\";\n\nexport default function NewMessagePage() {\n  return (\n    <>\n      <PageTitle title={I18n.t(\"js.messages.module_name\")} />\n      <Subtitle className={\"mb-3 mt-8\"}>\n        {I18n.t(\"js.messages.new.new_message\")}\n      </Subtitle>\n      <MessageComposer />\n    </>\n  );\n}\n","import type { MouseEventHandler } from \"react\";\nimport React, { Fragment } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useNavigate } from \"helpers/tixxt-router\";\nimport classNames from \"classnames\";\nimport { get, set } from \"lodash\";\nimport { queryClient } from \"helpers/queryClient\";\nimport BackButton from \"components/shared/BackButton\";\nimport InteractionsButton from \"../InteractionsButton\";\nimport {\n  useMarkMessageAsRead,\n  useMarkMessageAsUnread,\n  useDeleteMessage,\n  onError,\n} from \"../api\";\nimport { MessageInteractionsProps } from \"../@types\";\nimport { useQueryParams } from \"helpers/useQueryParams\";\n\nfunction MessageInteractions({\n  messageId,\n  isRead,\n  onSetMessageAction,\n  messageAction,\n  filter,\n}: MessageInteractionsProps) {\n  const navigate = useNavigate();\n  const { mutate: deleteMessage } = useDeleteMessage(filter, messageId, {\n    onSuccess: () => {\n      if (navigate) {\n        navigate(-1);\n      } else {\n        window.history.back();\n      }\n      toastr.success(I18n.t(\"js.messages.message_deleted\"));\n    },\n    onError,\n  });\n\n  const { mutate: markAsUnread, isLoading: isLoadingUnread } =\n    useMarkMessageAsUnread({\n      onSuccess: () => {\n        const updatedCache = set(\n          queryClient.getQueryData([\"message\", messageId]) as Record<\n            PropertyKey,\n            unknown\n          >,\n          \"i.read\",\n          false,\n        );\n        queryClient.setQueryData([\"message\", messageId], updatedCache);\n      },\n      onError,\n    });\n\n  const { mutate: markAsRead, isLoading: isLoadingRead } = useMarkMessageAsRead(\n    {\n      onSuccess: () => {\n        const updatedCache = set(\n          queryClient.getQueryData([\"message\", messageId]) as Record<\n            PropertyKey,\n            unknown\n          >,\n          \"i.read\",\n          true,\n        );\n        queryClient.setQueryData([\"message\", messageId], updatedCache);\n      },\n      onError,\n    },\n  );\n\n  const sendDirectMessages = useSelector((state) =>\n    get(state, \"currentMember.can.send_direct_messages\"),\n  );\n  const { state } = useQueryParams();\n  const search = (state as Record<PropertyKey, unknown>)?.search || \"\";\n\n  return (\n    <div className=\"flex justify-between gap-2 mt-2 px-3 py-2 border-box mb-10\">\n      <div className=\"flex gap-2 items-center\">\n        <BackButton\n          title={I18n.t(\"js.messages.back_to_overview\")}\n          href={`/messages${filter ? `/${filter}${search}` : search}`}\n        />\n        <span className={\"block border-neutral border-r mx-1 self-stretch\"} />\n\n        {filter !== \"sent\" ? (\n          <Fragment>\n            {isRead ? (\n              <InteractionsButton\n                onClick={() => markAsUnread(messageId)}\n                isDisabled={isLoadingUnread}\n                icons={[\"fa-regular fa-envelope text-normal fa-lg\"]}\n                title={I18n.t(\"js.messages.index_toolbar.unread\")}\n              />\n            ) : (\n              <InteractionsButton\n                onClick={() => markAsRead(messageId)}\n                isDisabled={isLoadingRead}\n                icons={[\"fa-regular fa-envelope text-normal fa-lg\"]}\n                title={I18n.t(\"js.messages.index_toolbar.read\")}\n              />\n            )}\n          </Fragment>\n        ) : null}\n        <InteractionsButton\n          onClick={onDeleteMessage as unknown as MouseEventHandler}\n          icons={[\"fa-regular fa-trash-can text-danger fa-lg\"]}\n          testId=\"deleteMsg\"\n        />\n      </div>\n      <div className=\"reply-toolbar flex gap-2 items-center desktop-only\">\n        {filter !== \"sent\" && sendDirectMessages ? (\n          <Fragment>\n            <InteractionsButton\n              onClick={() => onSetMessageAction(\"reply\")}\n              icons={[\"fa fa-reply\"]}\n              title={I18n.t(\"js.messages.combined.answer\")}\n              onlyIcon={false}\n              className={classNames({\n                active: messageAction === \"reply\",\n              })}\n            />\n            <InteractionsButton\n              onClick={() => onSetMessageAction(\"replyAll\")}\n              icons={[\"fa fa-reply-all\"]}\n              title={I18n.t(\"js.messages.combined.answer_all\")}\n              onlyIcon={false}\n              className={classNames({\n                active: messageAction === \"replyAll\",\n              })}\n            />\n          </Fragment>\n        ) : null}\n        {sendDirectMessages ? (\n          <InteractionsButton\n            onClick={() => onSetMessageAction(\"share\")}\n            icons={[\"fa fa-share\"]}\n            title={I18n.t(\"js.messages.combined.forward\")}\n            onlyIcon={false}\n            className={classNames({\n              active: messageAction === \"share\",\n            })}\n          />\n        ) : null}\n      </div>\n    </div>\n  );\n\n  function onDeleteMessage(e: Event) {\n    e.preventDefault();\n    window.bridge?.confirm(\n      filter == \"sent\"\n        ? `${I18n.t(\"js.delete_confirmation\")}\\n${I18n.t(\n            \"js.messages.message.delete_confirmation_sent\",\n          )}`\n        : I18n.t(\"js.delete_confirmation\"),\n      () => deleteMessage(),\n    );\n  }\n}\n\nexport default MessageInteractions;\n","import React, { Fragment } from \"react\";\nimport { get, map, isEqual, isEmpty, find } from \"lodash\";\nimport moment from \"moment\";\nimport { showNameWithProfileField } from \"components/memberships/MemberNameWithAdditions\";\nimport { Message } from \"../@types\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport FileIcon from \"components/shared/FileIcon\";\n\ntype Props = {\n  currentMemberId: string;\n  attachments: Array<{ id: string; original_filename: string }>;\n  isConversation: boolean;\n} & Message;\n\nfunction MessageContainer({\n  author,\n  created_at,\n  currentMemberId,\n  html_content,\n  to,\n  subject,\n  attachments,\n  id,\n  isConversation,\n}: Props): JSX.Element {\n  const authorUrl = get(author, \"html_url\");\n  const authorImageUrl = find(author.images, { width: 80, height: 80 })?.url;\n  const authorName = get(author, \"name\");\n  const date = moment(created_at).format(\"DD.MM.YYYY\");\n  const time = moment(created_at).format(\"HH:mm\");\n\n  return (\n    <div\n      className={classNames(\"border-box mb-10\", {\n        \"bg-gray-50 rounded\": isConversation,\n      })}\n    >\n      <div className=\"detailsAuthor flex items-center p-4 border-neutral border-dashed border-b\">\n        <div className=\"activity-actor-image member-image mr-4\">\n          <a className=\"member-link\" href={authorUrl}>\n            <img className=\"w-10 h-10\" src={authorImageUrl} alt={authorName} />\n          </a>\n        </div>\n        <div className=\"flex-1\">\n          <a href={authorUrl} className=\"member-link font-semibold\">\n            {authorName}\n          </a>\n\n          <div className={\"text-sm\"}>\n            <span>{I18n.t(\"js.messages.message.to\")}: </span>\n            {to &&\n              map(to, (recipient, i) => (\n                <Fragment key={recipient.id}>\n                  <a href={recipient.html_url}>\n                    {isEqual(currentMemberId, recipient.id)\n                      ? I18n.t(\"js.messages.search_result_row.myself\")\n                      : showNameWithProfileField({\n                          name: recipient.name,\n                          detectionProfileField:\n                            recipient.detection_profile_field,\n                          isExternal: recipient.is_external,\n                        })}\n                  </a>\n                  {i != to.length - 1 ? \", \" : null}\n                </Fragment>\n              ))}\n          </div>\n        </div>\n\n        <div className=\"detailsMeta flex gap-2 text-sm\">\n          {!isEmpty(attachments) ? (\n            <i className=\"fa fa-paperclip text-muted\" />\n          ) : null}\n          {date} {time}\n        </div>\n      </div>\n      <div className={\"p-2 my-2\"}>\n        <div className=\"messageContent p-2\">\n          <span className=\"messageSubject font-bold\">{subject}</span>\n          <p\n            className=\"pt-2\"\n            dangerouslySetInnerHTML={{\n              __html: html_content,\n            }}\n          />\n        </div>\n\n        {!isEmpty(attachments) ? (\n          <div className=\"attachmentsContainer pt-4 px-2 pb-2 flex flex-col gap-6\">\n            {map(attachments, (a) => {\n              return (\n                <div className=\"messageAttachment flex\" key={a.id}>\n                  <div className=\"attachmentIcon\">\n                    <FileIcon extension={get(a, \"extension\")} />\n                  </div>\n                  <a href={`/messages/${id}/files/${get(a, \"id\")}`}>\n                    {get(a, \"original_filename\")}\n                  </a>\n                </div>\n              );\n            })}\n          </div>\n        ) : null}\n      </div>\n\n      {isConversation ? (\n        <div className=\"border-neutral border-dashed border-t\">\n          <a href={`/messages/${id}`} className={\"btn btn-link block\"}>\n            <FontAwesomeIcon icon={regular(\"eye\")} className={\"mr-2\"} />\n            {I18n.t(\"js.messages.message.more\")}\n          </a>\n        </div>\n      ) : null}\n    </div>\n  );\n}\n\nexport default MessageContainer;\n","import React, { useEffect, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport {\n  get,\n  map,\n  isEqual,\n  isEmpty,\n  concat,\n  orderBy,\n  includes,\n  set,\n  uniqBy,\n} from \"lodash\";\nimport moment from \"moment\";\nimport { queryClient } from \"helpers/queryClient\";\nimport { useLocation } from \"helpers/tixxt-router\";\nimport { useQueryParams } from \"helpers/useQueryParams\";\nimport { currentMemberSelector } from \"selectors/environment\";\nimport { useMarkMessageAsRead, useFetchMessage } from \"../api\";\nimport NewMessage from \"../composer\";\nimport MessageInteractions from \"./MessageInteractions\";\nimport MessageContainer from \"./MessageContainer\";\nimport { Author, Message } from \"../@types\";\n\nfunction MessageDetails(): JSX.Element {\n  const [messageAction, setMessageAction] = useState(\"\");\n  const { messageId } = useQueryParams() as { messageId: string };\n  const location = useLocation() as unknown as Location & {\n    state: History[\"state\"];\n  };\n  const { isLoading, isSuccess, data: message } = useFetchMessage(messageId);\n  const { mutate: markAsRead } = useMarkMessageAsRead({\n    onSuccess: () => {\n      const updatedCache = set(\n        queryClient.getQueryData([\"message\", messageId]) as Record<\n          PropertyKey,\n          unknown\n        >,\n        \"i.read\",\n        true,\n      );\n      queryClient.setQueryData([\"message\", messageId], updatedCache);\n    },\n  });\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const currentMemberId = useSelector(currentMemberSelector)?.id;\n  const filter = location.state?.pathname?.includes(\"sent\") ? \"sent\" : \"\";\n  const conversation = get(message, \"conversation\");\n\n  useEffect(() => {\n    if (isSuccess && message?.i.read === false) {\n      markAsRead(messageId);\n    }\n  }, [message]);\n\n  if (isLoading || !currentMemberId)\n    return (\n      <div className=\"messagesLoading\">\n        <i className=\"fa fa-spinner fa-spin\" />\n      </div>\n    );\n\n  return (\n    <>\n      <MessageInteractions\n        messageId={messageId}\n        isRead={get(message, [\"i\", \"read\"])}\n        onSetMessageAction={onSetMessageAction}\n        messageAction={messageAction}\n        filter={filter}\n      />\n\n      {isEmpty(messageAction) ? null : (\n        <div>\n          <NewMessage\n            initialValues={messageInitialValues(\n              messageAction,\n              message,\n              currentMemberId,\n            )}\n          />\n        </div>\n      )}\n\n      <MessageContainer {...message} currentMemberId={currentMemberId} />\n\n      {map(orderBy(conversation, \"created_at\", \"desc\"), (message, i) => (\n        <MessageContainer\n          {...message}\n          currentMemberId={currentMemberId}\n          key={get(message, \"id\") || i}\n          isConversation\n        />\n      ))}\n    </>\n  );\n\n  function onSetMessageAction(action: string) {\n    setMessageAction(action);\n  }\n}\n\nfunction selectedMembers(recipients: Array<Author>) {\n  const newMemberArray: Array<{ id: string; displayValue: string }> = [];\n  map(recipients, (recipient) =>\n    newMemberArray.push({\n      id: recipient.id,\n      displayValue: recipient.name,\n    }),\n  );\n  return newMemberArray;\n}\n\ninterface Attachment {\n  content_type: string;\n  download_url: string;\n  extension: string;\n  external_id: null;\n  html_url: string;\n  i: object;\n  id: string;\n  original_filename: string;\n  size: number;\n  state: string;\n  type: string;\n}\n\nexport function messageInitialValues(\n  messageAction: string,\n  message: Message,\n  currentMemberId: string,\n) {\n  const sender_name = get(message, [\"author\", \"name\"]);\n  const recipients =\n    get(message, \"to\")?.filter(\n      // filter out the currentMember, as we do not want to send a message to self (https://gitlab.sys.mixxt.net/tixxt/foundation/-/issues/2380)\n      (recipient) => recipient.id != currentMemberId,\n    ) || [];\n  const subject = get(message, \"subject\") ? get(message, \"subject\") : \"\";\n  const htmlContent = get(message, \"content\");\n  const send_date = moment(get(message, \"created_at\")).format(\"DD.MM.YYYY\");\n  const send_time = moment(get(message, \"created_at\")).format(\"HH:mm\");\n  const messageId = get(message, \"id\");\n  const conversation_starter_id =\n    get(message, \"conversation_starter_id\") || messageId;\n\n  switch (messageAction) {\n    case \"reply\": {\n      return {\n        to: selectedMembers([get(message, \"author\")]),\n        subject: `${I18n.t(\"js.messages.message.re\")}: ${subject}`,\n        conversation_starter_id,\n      };\n    }\n    case \"replyAll\": {\n      const isAuthorInRecipients = includes(\n        map(recipients, (r) => isEqual(r, get(message, \"author\"))),\n        true,\n      );\n      const to = uniqBy(\n        selectedMembers(\n          isAuthorInRecipients\n            ? recipients\n            : concat(recipients, [get(message, \"author\")]),\n        ),\n        \"id\",\n      );\n\n      return {\n        to,\n        subject: `${I18n.t(\"js.messages.message.re\")}: ${subject}`,\n        conversation_starter_id,\n      };\n    }\n    case \"share\": {\n      return {\n        subject: `${I18n.t(\"js.messages.message.fwd\")}: ${subject}`,\n        content: `\\n\\n${I18n.t(\"js.messages.message.forwarded_message\", {\n          sender_name,\n          send_date,\n          send_time,\n        })} \\n${htmlContent}`,\n        attachments: map(\n          get(message, \"attachments\"),\n          (attachment: Attachment) => ({\n            ...attachment,\n            name: attachment.original_filename,\n          }),\n        ),\n      };\n    }\n    default: {\n      return {};\n    }\n  }\n}\n\nexport default MessageDetails;\n","import React from \"react\";\nimport PageTitle, { Subtitle } from \"components/layout/PageTitle\";\nimport MessageDetails from \"components/messages/message\";\n\nexport default function ShowMessagePage() {\n  return (\n    <>\n      <PageTitle title={I18n.t(\"js.messages.message.title\")} />\n      <Subtitle className={\"mb-3 mt-8\"}>\n        {I18n.t(\"js.messages.message.history\")}\n      </Subtitle>\n      <MessageDetails />\n    </>\n  );\n}\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport InboxPage from \"components/messages/InboxPage\";\nimport SentPage from \"components/messages/SentPage\";\nimport NewMessagePage from \"components/messages/NewMessagePage\";\nimport ShowMessagePage from \"components/messages/ShowMessagePage\";\n\nconst routes: RouteObject[] = [\n  { path: \"/messages\", element: <InboxPage /> },\n  { path: \"/messages/sent\", element: <SentPage /> },\n  { path: \"/messages/new\", element: <NewMessagePage /> },\n  { path: \"/messages/:messageId\", element: <ShowMessagePage /> },\n];\n\nexport default routes;\n","import React, { useMemo } from \"react\";\nimport { connect, useSelector } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport { get, isEmpty, map, filter } from \"lodash\";\nimport { useParams, useSearchParams } from \"helpers/tixxt-router\";\n\nimport PageTitle from \"../layout/PageTitle\";\nimport ControlGroup from \"../shared/fields/ControlGroup\";\nimport { Field } from \"redux-form\";\nimport styles from \"./files.module.css\";\nimport FileUploadField from \"../shared/fields/FileUploadField\";\nimport FolderSelectionField from \"./FolderSelectionField\";\nimport EmbeddedValueSetForm from \"../shared/propertySets/EmbeddedValueSetForm\";\nimport ReduxForm from \"../shared/reduxForm\";\nimport { selectFileProfilesEnabled } from \"../../selectors/propertySets\";\nimport { submitApi } from \"../../helpers/api\";\nimport { publishFiles } from \"../../actions/files\";\nimport { rootFolderIdSelector } from \"../../selectors/folders\";\nimport Breadcrumb from \"./Breadcrumb\";\nimport GroupNavigation from \"../layout/GroupNavigation\";\nimport { useFetchFolder } from \"./api\";\n\nconst validate = ({ files }) => {\n  const errors = {};\n  if (isEmpty(files)) errors.files = I18n.t(\"js.required\");\n  return errors;\n};\n\nfunction ActualForm({\n  defaultFolder,\n  showFileProfileFields,\n  postToStreamDefault,\n  files,\n  onSubmit,\n  onSubmitSuccess,\n  onCancel,\n}) {\n  const initialValues = useMemo(\n    () => ({\n      folder_ids: [defaultFolder.id],\n      post_to_stream: postToStreamDefault,\n    }),\n    [defaultFolder.id, postToStreamDefault],\n  );\n\n  return (\n    <ReduxForm\n      form=\"new-files\"\n      className={`${styles.NewFilesForm} form-horizontal`}\n      onSubmit={onSubmit}\n      onSubmitSuccess={onSubmitSuccess}\n      onCancel={onCancel}\n      validate={validate}\n      processing={\n        !files?.every(\n          (file) =>\n            file.state === \"volatile\" ||\n            file.state === \"published\" ||\n            file.state === \"removed\",\n        )\n      }\n      initialValues={initialValues}\n      submitText={I18n.t(\"js.files.add_files\")}\n      renderChildren={() => (\n        <>\n          <ControlGroup\n            name=\"files\"\n            label={I18n.t(\"js.files.file.label\")}\n            required\n          >\n            <Field\n              className={styles.FileUpload}\n              name=\"files\"\n              required\n              component={FileUploadField}\n              multiple\n            />\n          </ControlGroup>\n          <ControlGroup\n            name=\"folder_ids\"\n            label={I18n.t(\"js.files.file.folder_selection.label\")}\n          >\n            <Field\n              name=\"folder_ids\"\n              component={FolderSelectionField}\n              props={{ defaultFolder }}\n            />\n          </ControlGroup>\n          <ControlGroup\n            name=\"description\"\n            label={I18n.t(\"js.files.edit.description.label\")}\n          >\n            <Field\n              name=\"description\"\n              component=\"textarea\"\n              rows={5}\n              className={styles.FileDescription}\n            />\n          </ControlGroup>\n          {showFileProfileFields ? (\n            <EmbeddedValueSetForm\n              name=\"file_profile\"\n              contextType={defaultFolder.group_id ? \"group\" : \"network\"}\n              contextId={defaultFolder.group_id}\n            />\n          ) : null}\n          <ControlGroup name=\"post_to_stream\">\n            <label className=\"checkbox\">\n              <Field name=\"post_to_stream\" component=\"input\" type=\"checkbox\" />\n              {I18n.t(\"js.files.file.post_to_stream\")}\n            </label>\n            <span className=\"help-block\">\n              {I18n.t(\"js.files.file.description_help_1\")}\n            </span>\n            <span className=\"help-block\">\n              {I18n.t(\"js.files.file.description_help_2\")}\n            </span>\n          </ControlGroup>\n        </>\n      )}\n    />\n  );\n}\n\nActualForm.propTypes = {\n  defaultFolder: PropTypes.shape({\n    id: PropTypes.string.isRequired,\n    group_id: PropTypes.string,\n  }),\n  showFileProfileFields: PropTypes.bool,\n  postToStreamDefault: PropTypes.bool,\n  onSubmit: PropTypes.func.isRequired,\n  onSubmitSuccess: PropTypes.func,\n  onCancel: PropTypes.func.isRequired,\n};\n\nconst ConnectedForm = connect((state) => ({\n  files: get(state, [\"form\", \"new-files\", \"values\", \"files\"], null),\n  showFileProfileFields: selectFileProfilesEnabled(state),\n  postToStreamDefault: get(\n    state,\n    [\"network\", \"config\", \"files\", \"default_post_to_stream\"],\n    false,\n  ),\n}))(ActualForm);\n\n// Complete page for adding files to one or more folders\n// Loads parent folder information first, by id if one was given, root folder\n// of current context otherwise\nexport default function NewFilesPage() {\n  const { groupSlug } = useParams();\n  const [searchParams] = useSearchParams();\n  const contextRootFolderId = useSelector(rootFolderIdSelector({ groupSlug }));\n  const folderId = searchParams.get(\"folder_id\") || contextRootFolderId;\n\n  const { data: folder, isLoading: loading } = useFetchFolder(folderId);\n\n  const onSubmit = submitApi(({ files, ...remainingValues }) => ({\n    body: {\n      files: map(filter(files, { state: \"volatile\" }), ({ id }) => ({ id })),\n      ...remainingValues,\n    },\n  }))(publishFiles);\n\n  const navigateToFolder = () => {\n    const contextPath = groupSlug ? `/groups/${groupSlug}` : \"\";\n    window.Turbo.visit(`${contextPath}/files/folders/${folderId}`, {\n      action: \"replace\",\n    });\n  };\n\n  return (\n    <>\n      <PageTitle title={I18n.t(\"js.files.add_files\")} />\n      {groupSlug && <GroupNavigation groupSlug={groupSlug} />}\n      {loading || isEmpty(folder) ? (\n        I18n.t(\"js.loading\")\n      ) : (\n        <>\n          <Breadcrumb folder={folder} />\n          <ConnectedForm\n            defaultFolder={folder}\n            onSubmit={onSubmit}\n            onSubmitSuccess={navigateToFolder}\n            onCancel={navigateToFolder}\n          />\n        </>\n      )}\n    </>\n  );\n}\nNewFilesPage.propTypes = {\n  groupSlug: PropTypes.string,\n  query: PropTypes.shape({\n    folder_id: PropTypes.string,\n  }),\n};\n","import { useState } from \"react\";\nimport { useQuery, useMutation } from \"react-query\";\nimport { get, set, reject, findIndex } from \"lodash\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { queryClient } from \"helpers/queryClient\";\nimport { stringify } from \"query-string\";\n\nfunction fetchFilesForReviewStatus(groupSlug, page) {\n  return fetchApi(\n    `/api/storage/v2/files?${\n      groupSlug\n        ? `${stringify({\n            context_id: groupSlug,\n            context_type: \"group\",\n            query: \"reviewed\",\n            page: page,\n          })}`\n        : `${stringify({\n            context_id: Tixxt.currentNetwork.id,\n            context_type: \"network\",\n            query: \"reviewed\",\n            page: page,\n          })}`\n    }`,\n    { parsePaginationHeaders: true },\n  );\n}\n\nexport function approvePendingFileVersion({ fileId, pendingVersionId }) {\n  return fetchApi(\n    `/api/storage/files/${fileId}/pending_versions/${pendingVersionId}/approve`,\n    { method: \"POST\" },\n  );\n}\nexport function declinePendingFileVersion({ fileId, pendingVersionId }) {\n  return fetchApi(\n    `/api/storage/files/${fileId}/pending_versions/${pendingVersionId}`,\n    { method: \"DELETE\" },\n  );\n}\n\nexport function useFilesVersionApproval(groupSlug) {\n  return useQuery([\"filesVersionApproval\", groupSlug], () =>\n    fetchApi(\n      `/api/storage/folders/${\n        groupSlug ? groupSlug : Tixxt.currentNetwork.rootFolder().id\n      }/files/approval`,\n    ),\n  );\n}\n\n// that can directly be spread into <Pagination />\n// fetcher must parsePaginationHeaders (i.e. return { payload, pagination: { totalPages }})\nexport function useFilesReviewStatus(groupSlug) {\n  const [page, onPaginate] = useState(1);\n  const { data, isFetching, ...rest } = useQuery(\n    [\"filesReviewStatus\", groupSlug, page],\n    () => fetchFilesForReviewStatus(groupSlug, page),\n    {\n      keepPreviousData: true,\n    },\n  );\n\n  return {\n    data: get(data, [\"payload\"]),\n    pagination: {\n      totalPages: get(data, [\"pagination\", \"totalPages\"]),\n      page,\n      loading: isFetching,\n      onPaginate,\n    },\n    isFetching,\n    ...rest,\n  };\n}\n\nfunction removePendingFileVersionFromCache(\n  _response,\n  { groupSlug, fileId, pendingVersionId },\n) {\n  const files = queryClient.getQueryData([\"filesVersionApproval\", groupSlug]);\n  const index = findIndex(files, { id: fileId });\n  set(\n    files,\n    [index, \"pending_versions\"],\n    reject(get(files, [index, \"pending_versions\"]), {\n      id: pendingVersionId,\n    }),\n  );\n  queryClient.setQueryData([\"filesVersionApproval\", groupSlug], files);\n  queryClient.invalidateQueries(\"folderUnreads\");\n}\n\nexport function useApprovePendingFileVersion() {\n  return useMutation(approvePendingFileVersion, {\n    onSuccess: removePendingFileVersionFromCache,\n  });\n}\nexport function useDeclinePendingFileVersion() {\n  return useMutation(declinePendingFileVersion, {\n    onSuccess: removePendingFileVersionFromCache,\n  });\n}\n","import React from \"react\";\nimport { map, isEmpty } from \"lodash\";\nimport moment from \"moment\";\nimport {\n  useFilesVersionApproval,\n  useDeclinePendingFileVersion,\n  useApprovePendingFileVersion,\n} from \"./api\";\nimport FileIcon from \"../../shared/FileIcon\";\n\nexport default function VersionApproval({ groupSlug }) {\n  const { isLoading, data: files } = useFilesVersionApproval(groupSlug);\n\n  if (isLoading) {\n    return (\n      <div>\n        <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n      </div>\n    );\n  }\n\n  if (isEmpty(files))\n    return (\n      <div className=\"well\">\n        {I18n.t(\"js.files.approval.review_status.empty_list\")}\n      </div>\n    );\n\n  return map(files, ({ id: fileId, name, pending_versions }) => {\n    if (isEmpty(pending_versions)) return null;\n\n    return (\n      <div key={fileId} className=\"mb-6\">\n        <h4>\n          <a\n            href={`${groupSlug ? `/groups/${groupSlug}` : \"\"}/files/${fileId}`}\n          >\n            {name}\n          </a>\n        </h4>\n        <table className=\"tixxt-table\">\n          <thead>\n            <tr>\n              <th></th>\n              <th>{I18n.t(\"js.files.overview.new_filename\")}</th>\n              <th>{I18n.t(\"js.files.overview.created_at\")}</th>\n              <th>{I18n.t(\"js.files.overview.author\")}</th>\n              <th>{I18n.t(\"js.files.overview.description\")}</th>\n              <th></th>\n              <th></th>\n            </tr>\n          </thead>\n          <tbody>\n            {map(pending_versions, (pendingVersion) => (\n              <PendingVersionApprovalRow\n                key={pendingVersion.id}\n                {...pendingVersion}\n                fileId={fileId}\n                groupSlug={groupSlug}\n              />\n            ))}\n          </tbody>\n        </table>\n      </div>\n    );\n  });\n}\n\nfunction PendingVersionApprovalRow({\n  fileId,\n  groupSlug,\n  id,\n  extension,\n  original_filename,\n  created_at,\n  author_name,\n  description,\n}) {\n  const { mutate: decline, isLoading: isDeclining } =\n    useDeclinePendingFileVersion();\n  const { mutate: approve, isLoading: isApproving } =\n    useApprovePendingFileVersion();\n\n  const fileUrl = `/api/storage/files/${fileId}/pending_versions/${id}`;\n  return (\n    <tr key={id}>\n      <td className=\"this-icon\">\n        <i className=\"icon icons-file\">\n          <FileIcon extension={extension} />\n        </i>\n      </td>\n      <td>{original_filename}</td>\n      <td>\n        {moment(created_at).format(\n          I18n.t(\"js.time.formats.short_date_and_time\"),\n        )}\n      </td>\n      <td>{author_name}</td>\n      <td>{description}</td>\n      <td>\n        <div className=\"whitespace-nowrap text-right\">\n          <a\n            className=\"mr-2\"\n            href={`${fileUrl}/get/${original_filename}`}\n            title={I18n.t(\"js.files.show.open_file\")}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n          >\n            <i className={`fa-regular fa-eye`}></i>\n          </a>\n          <a\n            href={`${fileUrl}/get/${original_filename}?download`}\n            title={I18n.t(\"js.files.show.download_file\")}\n            aria-label={I18n.t(\"js.files.show.download_file\")}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n          >\n            <i className=\"fa-regular fa-cloud-download\"></i>\n          </a>\n        </div>\n      </td>\n\n      <td>\n        <div className=\"btn-group\">\n          <button\n            className=\"btn btn-primary btn-sm\"\n            title={I18n.t(\"js.files.approval.accept_version\")}\n            onClick={() => {\n              approve({\n                fileId,\n                pendingVersionId: id,\n                groupSlug,\n                foo: \"Bar\",\n              });\n            }}\n            disabled={isDeclining || isApproving}\n          >\n            <i className=\"fa-regular fa-check\"></i>\n          </button>\n          <button\n            className=\"btn btn-danger btn-sm\"\n            title={I18n.t(\"js.files.approval.decline_version\")}\n            onClick={() => {\n              decline({\n                fileId,\n                pendingVersionId: id,\n                groupSlug,\n              });\n            }}\n            disabled={isDeclining || isApproving}\n          >\n            <i className=\"fa-regular fa-xmark\"></i>\n          </button>\n        </div>\n      </td>\n    </tr>\n  );\n}\n","import React from \"react\";\nimport { get, map, isEmpty } from \"lodash\";\nimport moment from \"moment\";\nimport { useFilesReviewStatus } from \"./api\";\nimport DocumentAction from \"../documents/DocumentAction\";\nimport FileIcon from \"../../shared/FileIcon\";\nimport Pagination from \"../../shared/Pagination\";\n\nexport default function ReviewStatus({ groupSlug }) {\n  const {\n    data: files,\n    pagination,\n    isLoading,\n  } = useFilesReviewStatus(groupSlug);\n\n  if (isLoading) {\n    return (\n      <div>\n        <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n      </div>\n    );\n  }\n\n  if (isEmpty(files) && pagination.page === 1) {\n    return (\n      <div className=\"alert alert-info\">\n        {I18n.t(\"js.files.approval.review_status.empty_list\")}\n      </div>\n    );\n  }\n\n  return (\n    <>\n      <table className=\"tixxt-table\">\n        <thead>\n          <tr className=\"muted\">\n            <th></th>\n            <th>{I18n.t(\"js.files.overview.file_name\")}</th>\n            <th>{I18n.t(\"js.files.overview.updated_at\")}</th>\n            <th>{I18n.t(\"js.files.overview.last_author\")}</th>\n            <th></th>\n            <th></th>\n          </tr>\n        </thead>\n        <tbody>\n          {map(files, (file) => (\n            <ReviewStatusRow key={file.id} {...file} groupSlug={groupSlug} />\n          ))}\n        </tbody>\n      </table>\n      <Pagination {...pagination} width={2} hideIfEmpty />\n    </>\n  );\n}\n\nfunction ReviewStatusRow({\n  original_filename,\n  updated_at,\n  current_version_authors,\n  id,\n  review_status,\n  extension,\n  groupSlug,\n}) {\n  const insertions = get(review_status, \"insertions\", 0);\n  const deletions = get(review_status, \"deletions\", 0);\n  const changes = get(review_status, \"changes\", 0);\n  const comments = get(review_status, \"comments\", 0);\n  return (\n    <tr key={id}>\n      <td>\n        <FileIcon extension={extension} />\n      </td>\n      <td>\n        <a href={`${groupSlug ? `/groups/${groupSlug}` : \"\"}/files/${id}`}>\n          {original_filename}\n        </a>\n      </td>\n      <td>\n        {moment(updated_at).format(\n          I18n.t(\"js.time.formats.short_date_and_time\"),\n        )}\n      </td>\n      <td>{map(current_version_authors, \"name\").join(\", \")}</td>\n      <td>\n        <div className={\"btn-group\"}>\n          <DocumentAction\n            fileId={id}\n            action=\"edit\"\n            icon={<i className=\"fa-regular fa-file-word\" aria-hidden=\"true\" />}\n            type=\"docs\"\n            showReviewChanges={true}\n          />\n        </div>\n      </td>\n\n      <td>\n        <div className=\"flex gap-2\">\n          <span\n            title={`${changes + insertions + deletions} ${I18n.t(\n              \"js.files.approval.review_status.changes\",\n            )}`}\n          >\n            <i className=\"fa-regular fa-edit mr-1 text-primary\" />\n            {changes + insertions + deletions}\n          </span>\n          <span\n            title={`${comments} ${I18n.t(\n              \"js.files.approval.review_status.comments\",\n            )}`}\n          >\n            <i className=\"fa-regular fa-comments mr-1\" />\n            {comments}\n          </span>\n        </div>\n      </td>\n    </tr>\n  );\n}\n","import React, { useState } from \"react\";\nimport classNames from \"classnames\";\nimport { find } from \"lodash\";\nimport { useParams } from \"helpers/tixxt-router\";\n\nimport VersionApproval from \"./VersionApproval\";\nimport ReviewStatus from \"./ReviewStatus\";\nimport GroupNavigation from \"components/layout/GroupNavigation\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport { useFoldersUnreads } from \"../../../api/unreads\";\n\ntype LayoutProps = {\n  groupSlug?: string;\n  children?: React.ReactNode;\n};\n\nfunction Layout({ groupSlug, children }: LayoutProps) {\n  return (\n    <>\n      <PageTitle\n        title={I18n.t(\"js.files.approval.title\")}\n        subtitle={I18n.t(\"js.files.approval.subtitle\")}\n      />\n      {groupSlug ? <GroupNavigation groupSlug={groupSlug} /> : null}\n      {children}\n    </>\n  );\n}\n\nexport default function ApprovalPage() {\n  const { groupSlug } = useParams();\n  const [activeTab, setActiveTab] = useState<string | null>(null);\n\n  const { data: foldersUnreads, isLoading } = useFoldersUnreads();\n\n  const unreads = find(foldersUnreads, { group_slug: groupSlug || null });\n\n  if (activeTab === null) {\n    Number(unreads?.reviewed_files) === 0 &&\n    Number(unreads?.pending_versions) > 0\n      ? setActiveTab(\"versions\")\n      : setActiveTab(\"approval\");\n  }\n\n  if (isLoading) {\n    return (\n      <Layout groupSlug={groupSlug}>\n        <div>\n          <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n        </div>\n      </Layout>\n    );\n  }\n\n  return (\n    <Layout groupSlug={groupSlug}>\n      <div>\n        <ul className=\"nav nav-tabs mb-4\">\n          <li className={classNames({ active: activeTab === \"approval\" })}>\n            <a\n              href=\"#\"\n              className=\"!inline-flex gap-1\"\n              onClick={(e) => {\n                e.preventDefault();\n                setActiveTab(\"approval\");\n              }}\n            >\n              {I18n.t(\"js.files.approval.open_review_status\")}{\" \"}\n              {Number(unreads?.reviewed_files) > 0 && (\n                <span className=\"badge rounded-xl self-center bg-unread text-[10px]\">\n                  {unreads?.reviewed_files}\n                </span>\n              )}\n            </a>\n          </li>\n          <li className={classNames({ active: activeTab === \"versions\" })}>\n            <a\n              href=\"#\"\n              className=\"!inline-flex gap-1\"\n              onClick={(e) => {\n                e.preventDefault();\n                setActiveTab(\"versions\");\n              }}\n            >\n              {I18n.t(\"js.files.approval.new_versions\")}{\" \"}\n              {Number(unreads?.pending_versions) > 0 && (\n                <span className=\"badge rounded-xl self-center bg-unread text-[10px]\">\n                  {unreads?.pending_versions}\n                </span>\n              )}\n            </a>\n          </li>\n        </ul>\n        <div className=\"tab-content\">\n          <div\n            id=\"#review_status\"\n            className={classNames(\"tab-pane\", {\n              active: activeTab === \"approval\",\n            })}\n          >\n            <ReviewStatus groupSlug={groupSlug} />\n          </div>\n          <div\n            id=\"#new_file_versions\"\n            className={classNames(\"tab-pane\", {\n              active: activeTab === \"versions\",\n            })}\n          >\n            <VersionApproval groupSlug={groupSlug} />\n          </div>\n        </div>\n      </div>\n    </Layout>\n  );\n}\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport { convertRoutes } from \"components/tixxt/BackboneFeature\";\nimport NewFilesPage from \"./NewFilesPage\";\nimport ApprovalPage from \"./approval/ApprovalPage\";\n\nconst backboneRoutes: RouteObject[] = convertRoutes({\n  feature: \"Files\",\n  featureRoutes: {\n    \"(groups/:group_slug/)files\": \"showRootFolder\",\n    \"(groups/:group_slug/)files/:file_id\": \"showFile\",\n    \"(groups/:group_slug/)files/folders/new\": \"newFolder\",\n    \"(groups/:group_slug/)files/folders/:folder_id\": \"showFolder\",\n    \"(groups/:group_slug/)files/folders/:folder_id/edit\": \"editFolder\",\n    \"(groups/:group_slug/)files/activitystream_folders/:stream_slug\":\n      \"showActivitystreamFolder\",\n    \"(groups/:group_slug/)files/:file_id/edit\": \"editFile\",\n    \"(groups/:group_slug/)files/:file_id/versions/new\": \"newFileVersion\",\n    \"administration/members/files/:file_id\": \"showFile\",\n    \"administration/consumers/files/:file_id\": \"showFile\",\n    \"administration/industrials/files/:file_id\": \"showFile\",\n    \"activities/:activity_id/files/:file_id\": \"showFile\",\n    \"(groups/:group_slug/)activitystreams/:slug/files/:file_id\": \"showFile\",\n    \"(groups/:group_slug/)apps/:app_slug/items/exports/files/:file_id\":\n      \"showFile\",\n    \"(groups/:group_slug/)apps/:app_slug/items/files/:file_id\": \"showFile\",\n    \"(groups/:group_slug/)apps/:app_slug/items/:item_id/files/:file_id\":\n      \"showFile\",\n    \"appointments/:appointment_id/files/:file_id\": \"showFile\",\n    \"messages/:message_id/files/:file_id\": \"showFile\",\n  },\n});\n\nconst reactRoutes: RouteObject[] = [\n  { path: \"/files/new\", element: <NewFilesPage /> },\n  { path: \"/files/approval\", element: <ApprovalPage /> },\n  { path: \"/groups/:groupSlug/files/new\", element: <NewFilesPage /> },\n  { path: \"/groups/:groupSlug/files/approval\", element: <ApprovalPage /> },\n];\n\nexport default reactRoutes.concat(backboneRoutes);\n","import { convertRoutes } from \"components/tixxt/BackboneFeature\";\nimport { RouteObject } from \"helpers/tixxt-router\";\n\nconst tasksRoutes: RouteObject[] = convertRoutes({\n  feature: \"Tasks\",\n  featureRoutes: {\n    \"groups/:group_slug/tasks\": \"index\",\n    \"(groups/:group_slug/)tasks\": \"my\",\n    \"(groups/:group_slug/)tasks/my\": \"my\",\n    \"(groups/:group_slug/)tasks/assigned\": \"assigned\",\n    \"(groups/:group_slug/)tasks/archive\": \"archive\",\n    \"(groups/:group_slug/)tasks/starred\": \"starred\",\n    \"tasks/notes\": \"notes\",\n    \"tasks/declined\": \"declined\",\n    \"tasks/:id\": \"showTask\",\n    \"tasks/:id/edit\": \"editTask\",\n  },\n});\n\nexport default tasksRoutes;\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\nimport { useParams, useSearchParams } from \"helpers/tixxt-router\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport SearchResults from \"./SearchResults\";\nimport GroupNavigation from \"../layout/GroupNavigation\";\nimport { useSearchResults } from \"./api\";\n\nfunction Content() {\n  const routeParams = useParams();\n  const [searchParams] = useSearchParams();\n\n  // rebuild legacy params\n  routeParams.q = searchParams.get(\"q\");\n  routeParams.module = searchParams.get(\"module\");\n  routeParams.page = searchParams.get(\"page\");\n\n  const {\n    data: searchResults,\n    isLoading,\n    error,\n  } = useSearchResults(routeParams);\n\n  return (\n    <>\n      <PageTitle\n        title={\n          isEmpty(routeParams.q)\n            ? I18n.t(\"js.global_search.search_title\")\n            : I18n.t(\"js.global_search.search_for_title\", {\n                search_text: routeParams.q,\n              })\n        }\n        key=\"title\"\n      />\n      {routeParams.groupSlug ? (\n        <GroupNavigation key=\"groupNav\" groupSlug={routeParams.groupSlug} />\n      ) : null}\n      <SearchResults\n        results={searchResults}\n        params={routeParams}\n        loading={isLoading}\n        error={error}\n        key=\"results\"\n      />\n    </>\n  );\n}\n\nexport default Content;\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport Content from \"./Content\";\n\nconst globalSearchRoutes: RouteObject[] = [\n  { path: \"/search\", element: <Content /> },\n  { path: \"/groups/:groupSlug/search\", element: <Content /> },\n];\n\nexport default globalSearchRoutes;\n","import { useQuery, useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nexport function fetchNetworkSettings() {\n  return fetchApi(\"/administration/settings\");\n}\n\nexport function useNetworkSettings() {\n  return useQuery(\"networkSettings\", fetchNetworkSettings);\n}\n\nexport async function updateNetworkSettings(body) {\n  return fetchApi(`/administration/settings`, { method: \"PUT\", body });\n}\n\nexport function useUpdateNetworkSettings(options) {\n  return useMutation(updateNetworkSettings, options);\n}\n\nexport async function sendTestBirthdayEmail({ birthday_emails }) {\n  return fetchApi(`/administration/settings/send_test_birthday_email`, {\n    method: \"POST\",\n    body: birthday_emails,\n  });\n}\n\nexport function useSendTestBirthdayEmail(options) {\n  return useMutation(sendTestBirthdayEmail, options);\n}\n","import React from \"react\";\nimport { map, includes } from \"lodash\";\n\nimport ControlGroup from \"../../shared/fields/ControlGroup\";\nimport TextField from \"../../appCreator/properties/edit/TextField\";\nimport SelectionField from \"../../appCreator/properties/edit/SelectionField\";\n\nconst AVAILABLE_LANGUAGES = [\"de\", \"de_DU\", \"en\", \"es\", \"fr\"];\n\nfunction BasicSettings() {\n  return (\n    <>\n      <h3>\n        {I18n.t(\"js.administration.network_settings.basic_settings.title\")}\n      </h3>\n      <div className=\"flex flex-col gap-4\">\n        <ControlGroup\n          name=\"name\"\n          label={I18n.t(\"js.administration.network_settings.name_label\")}\n          required\n        >\n          <TextField name=\"name\" required />\n        </ControlGroup>\n\n        <ControlGroup\n          name=\"language\"\n          label={I18n.t(\"js.administration.network_settings.language_label\")}\n          required\n        >\n          <SelectionField\n            id=\"language\"\n            name=\"language\"\n            required\n            disabled={\n              !includes(\n                AVAILABLE_LANGUAGES,\n                Tixxt.currentNetwork.get(\"language\"),\n              )\n            }\n            options={\n              includes(\n                AVAILABLE_LANGUAGES,\n                Tixxt.currentNetwork.get(\"language\"),\n              )\n                ? map(AVAILABLE_LANGUAGES, (lang) => ({\n                    value: lang,\n                    label: I18n.t(`js.networks.languages.${lang}`),\n                  }))\n                : [\n                    I18n.t(\n                      `js.networks.languages.${Tixxt.currentNetwork.get(\n                        \"language\",\n                      )}`,\n                    ),\n                  ]\n            }\n          />\n        </ControlGroup>\n        {Preload.current_network.config.abuse_reports.admin_configurable ? (\n          <ControlGroup\n            name=\"abuse_reports_enabled\"\n            label={I18n.t(\n              \"js.administration.network_settings.abuse_reporting.label\",\n            )}\n            className=\"white-box checkboxes border-box p-3\"\n          >\n            <SelectionField\n              name=\"abuse_reports_enabled\"\n              multiple={false}\n              select={false}\n              required\n              options={[\n                {\n                  value: \"enabled\",\n                  label: I18n.t(\n                    \"js.administration.network_settings.abuse_reporting.enabled\",\n                  ),\n                },\n                {\n                  value: \"disabled\",\n                  label: I18n.t(\n                    \"js.administration.network_settings.abuse_reporting.disabled\",\n                  ),\n                },\n              ]}\n            />\n          </ControlGroup>\n        ) : null}\n      </div>\n    </>\n  );\n}\n\nexport default BasicSettings;\n","import React, { Fragment, useMemo } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { map, castArray, isArray, compact, debounce } from \"lodash\";\nimport { Field } from \"redux-form\";\nimport AsyncSelect from \"react-select/async\";\n\nimport styles from \"../../appCreator/properties/edit/editFields.module.css\";\nimport { fetchMembersAndGroups } from \"actions/memberships\";\n\nconst normalizeValue = (value) => {\n  if (value === null) return null; // When nothing is selected\n  if (isArray(value)) return map(value, normalizeValue);\n\n  return { id: value.value, name: value.label };\n};\n\nconst formatValue = (state) =>\n  map(compact(castArray(state)), ({ id, name }) => ({\n    value: id,\n    label: name,\n  }));\n\ninterface SelectAdapterProps {\n  input?: Record<PropertyKey, unknown>;\n  required?: boolean;\n  id?: string;\n  disabled?: boolean;\n  multiple?: boolean;\n  className?: string;\n}\n\nfunction SelectAdapter({\n  input,\n  required,\n  id,\n  disabled,\n  className,\n  multiple,\n}: SelectAdapterProps) {\n  const dispatch = useDispatch();\n  const loadOptions = useMemo(\n    () =>\n      debounce(async (value, callback) => {\n        const { payload } = await dispatch(\n          fetchMembersAndGroups({ q: value, groups_only: true }),\n        );\n        callback(formatValue(payload.entries));\n      }, 375),\n    [],\n  );\n\n  const props = {\n    ...input,\n    // workaround for mobile,\n    // see ticket #9930 or issue https://github.com/JedWatson/react-select/issues/2692#issuecomment-395743446\n    onBlur: (e) => e.preventDefault(),\n    isClearable: !required,\n    isDisabled: disabled,\n    inputId: id,\n    placeholder: I18n.t(\"js.group_select.placeholder\"),\n    noOptionsMessage: () => I18n.t(\"plugins.select2.no_match\"),\n    className,\n    loadOptions: (value, callback) => {\n      loadOptions(value, callback);\n    },\n    isMulti: multiple,\n    styles: { menu: (base) => ({ ...base, zIndex: 999 }) },\n  };\n\n  return (\n    <Fragment>\n      <AsyncSelect {...props} classNamePrefix={\"Select\"} />\n    </Fragment>\n  );\n}\n\ninterface GroupSelectFieldProps {\n  name: string;\n  multiple: boolean;\n  required?: boolean;\n  disabled?: boolean;\n  id?: string;\n}\n\nfunction GroupSelectField({\n  name,\n  required,\n  disabled,\n  id,\n  multiple,\n}: GroupSelectFieldProps) {\n  return (\n    <Field\n      component={SelectAdapter}\n      name={name}\n      required={required}\n      disabled={disabled}\n      normalize={normalizeValue}\n      format={formatValue}\n      multiple={multiple}\n      id={id}\n      props={{\n        className: styles.Selection,\n      }}\n    />\n  );\n}\n\nexport default GroupSelectField;\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Field, formValueSelector } from \"redux-form\";\nimport ControlGroup from \"../../shared/fields/ControlGroup\";\nimport MarkdownTranslation from \"components/shared/MarkdownTranslation\";\nimport TextField from \"../../appCreator/properties/edit/TextField\";\nimport SelectionField from \"../../appCreator/properties/edit/SelectionField\";\nimport GroupSelectField from \"../../shared/fields/GroupSelectField\";\nimport { State } from \"@types\";\nimport MarkdownEditorAdapter from \"components/shared/markdownEditor/MarkdownEditorAdapter\";\n\ninterface JoinSettingsTypes {\n  join_user_can_initiate?: boolean;\n  join_promote_groups?: boolean;\n  decorators?: boolean;\n  decorators_external?: boolean;\n}\n\nfunction JoinSettings({\n  join_user_can_initiate,\n  join_promote_groups,\n  decorators,\n  decorators_external,\n}: JoinSettingsTypes) {\n  return (\n    <>\n      <h3>\n        {I18n.t(\"js.administration.network_settings.join_settings.title\")}\n      </h3>\n      <div className=\"flex flex-col gap-4\">\n        {I18n.t(\"js.administration.network_settings.join_settings.hint\") !=\n        \"no_content_do_not_change\" ? (\n          <div className=\"alert alert-info\">\n            {I18n.t(\"js.administration.network_settings.join_settings.hint\")}\n          </div>\n        ) : null}\n\n        <ControlGroup\n          label={I18n.t(\"js.networks.join_settings.label\")}\n          className=\"white-box checkboxes border-box p-3\"\n        >\n          <label className=\"choice checkbox\">\n            <Field\n              component=\"input\"\n              type=\"checkbox\"\n              name=\"join_user_can_initiate\"\n            />{\" \"}\n            {I18n.t(\"js.networks.join_settings.user_can_initiate\")}\n          </label>\n\n          {join_user_can_initiate ? (\n            <>\n              <label className=\"choice checkbox ml-4\">\n                <Field\n                  component=\"input\"\n                  type=\"checkbox\"\n                  name=\"join_moderated\"\n                />{\" \"}\n                {I18n.t(\"js.networks.join_settings.moderated\")}\n              </label>\n\n              {Tixxt.currentNetwork.getConfig(\"guest_users.allowed\") ? (\n                <label className=\"choice checkbox ml-4\">\n                  <Field\n                    component=\"input\"\n                    type=\"checkbox\"\n                    name=\"join_as_external\"\n                  />{\" \"}\n                  {I18n.t(\"js.networks.join_settings.as_external\")}\n                </label>\n              ) : null}\n            </>\n          ) : null}\n\n          <label className=\"choice checkbox\">\n            <Field\n              component=\"input\"\n              type=\"checkbox\"\n              name=\"join_ask_for_profile_data\"\n            />{\" \"}\n            {I18n.t(\"js.networks.join_settings.ask_for_profile_data\")}\n          </label>\n\n          <label className=\"choice checkbox\">\n            <Field\n              component=\"input\"\n              type=\"checkbox\"\n              name=\"group_promotion_config.active\"\n            />{\" \"}\n            {I18n.t(\"js.networks.join_settings.join_promote_groups\")}\n          </label>\n        </ControlGroup>\n\n        {join_promote_groups ? (\n          <div className=\"group_promotion_settings\">\n            <h4>{I18n.t(\"js.networks.group_promotion.headline\")}</h4>\n\n            <div className=\"help-block !mb-3\">\n              {I18n.t(\"js.networks.group_promotion.help_text\")}\n            </div>\n            {decorators ? (\n              <div className=\"help-block !mb-3 mt-1\">\n                <span className=\"text-warning\">\n                  {I18n.t(\"js.networks.group_promotion.decorators_help\")}\n                </span>\n              </div>\n            ) : null}\n\n            <ControlGroup\n              name=\"group_promotion_config.title\"\n              label={I18n.t(\"js.networks.group_promotion.title.label\")}\n              required\n            >\n              <TextField name=\"group_promotion_config.title\" required />\n              <div className=\"help-block !mb-3 mt-1\">\n                {I18n.t(\"js.networks.group_promotion.title.help\")}\n              </div>\n            </ControlGroup>\n\n            <ControlGroup\n              name=\"group_promotion_config.description\"\n              label={I18n.t(\"js.networks.group_promotion.description.label\")}\n            >\n              <TextField name=\"group_promotion_config.description\" multiline />\n              <div className=\"help-block !mb-3 mt-1\">\n                {I18n.t(\"js.networks.group_promotion.description.help\")}\n              </div>\n            </ControlGroup>\n\n            <ControlGroup\n              name=\"group_promotion_config.group_category_ids\"\n              label={I18n.t(\n                \"js.networks.group_promotion.group_categories.label\",\n              )}\n            >\n              <SelectionField\n                name=\"group_promotion_config.group_category_ids\"\n                options={Tixxt.currentNetwork\n                  .group_categories()\n                  .filter(\n                    (gc) => !gc.get(\"hidden\") && gc.get(\"access\") != \"hidden\",\n                  )\n                  .map((gc) => ({\n                    value: gc.get(\"id\"),\n                    label: gc.get(\"plural_name\"),\n                  }))}\n                multiple\n              />\n              <div className=\"help-block !mb-3 mt-1\">\n                {I18n.t(\"js.networks.group_promotion.group_categories.help\")}\n              </div>\n            </ControlGroup>\n\n            <ControlGroup\n              name=\"group_promotion_config.groups\"\n              label={I18n.t(\"js.networks.group_promotion.groups.label\")}\n            >\n              <GroupSelectField name=\"group_promotion_config.groups\" multiple />\n              <div className=\"help-block !mb-3 mt-1\">\n                {I18n.t(\"js.networks.group_promotion.groups.help\")}\n              </div>\n            </ControlGroup>\n            {Tixxt.currentNetwork.getConfig(\"guest_users.allowed\") ? (\n              <ControlGroup\n                name=\"group_promotion_config.enabled_for_external\"\n                label={I18n.t(\n                  \"js.networks.group_promotion.enabled_for_external.label\",\n                )}\n                className=\"white-box checkboxes border-box p-3 mt-2\"\n              >\n                <label className=\"choice checkbox border-box p-3\">\n                  <Field\n                    component=\"input\"\n                    type=\"checkbox\"\n                    name=\"group_promotion_config.enabled_for_external\"\n                  />{\" \"}\n                  {I18n.t(\n                    \"js.networks.group_promotion.enabled_for_external.choice\",\n                  )}\n                </label>\n                <div className=\"help-block mt-1\">\n                  {I18n.t(\n                    \"js.networks.group_promotion.enabled_for_external.help\",\n                  )}\n                </div>\n                {decorators_external ? (\n                  <div className=\"help-block !mb-3 mt-1\">\n                    <span className=\"text-warning\">\n                      {I18n.t(\n                        \"js.networks.group_promotion.enabled_for_external.decorators_help\",\n                      )}\n                    </span>\n                  </div>\n                ) : null}\n              </ControlGroup>\n            ) : null}\n          </div>\n        ) : null}\n\n        {Tixxt.currentNetwork.getConfig(\"devise.login_form_configurable\") ? (\n          <>\n            <div className=\"flex flex-col gap-4\">\n              <div>\n                <h4>{I18n.t(\"js.networks.join_settings.login_form\")}</h4>\n\n                <MarkdownTranslation\n                  styles=\"help-block !mb-3\"\n                  translation={\"js.networks.join_settings.login_form_hint_md\"}\n                />\n              </div>\n\n              <ControlGroup\n                label={I18n.t(\n                  \"js.networks.join_settings.label_devise_text_before\",\n                )}\n              >\n                <Field\n                  component={MarkdownEditorAdapter}\n                  name=\"devise_text_before\"\n                />\n              </ControlGroup>\n              <ControlGroup\n                label={I18n.t(\n                  \"js.networks.join_settings.label_devise_text_between\",\n                )}\n              >\n                <Field\n                  component={MarkdownEditorAdapter}\n                  name=\"devise_text_between\"\n                />\n              </ControlGroup>\n              <ControlGroup\n                label={I18n.t(\n                  \"js.networks.join_settings.label_devise_text_after\",\n                )}\n              >\n                <Field\n                  component={MarkdownEditorAdapter}\n                  name=\"devise_text_after\"\n                />\n              </ControlGroup>\n            </div>\n          </>\n        ) : null}\n      </div>\n    </>\n  );\n}\n\nconst selector = formValueSelector(\"networkSettingsForm\"); // the name of the outer form\nexport default connect((state) => ({\n  join_user_can_initiate: selector(state as State, \"join_user_can_initiate\"),\n  join_promote_groups: selector(\n    state as State,\n    \"group_promotion_config.active\",\n  ),\n  decorators: selector(state as State, \"group_promotion_config.decorators\"),\n  decorators_external: selector(\n    state as State,\n    \"group_promotion_config.decorators_external\",\n  ),\n}))(JoinSettings);\n","import React from \"react\";\nimport { get, map } from \"lodash\";\nimport { connect } from \"react-redux\";\nimport { formValueSelector } from \"redux-form\";\nimport ControlGroup from \"../../shared/fields/ControlGroup\";\nimport SelectionField from \"../../appCreator/properties/edit/SelectionField\";\nimport CheckboxField from \"components/shared/fields/CheckboxField\";\nimport { Controls } from \"components/shared/fields/ControlGroup\";\nimport AddressField from \"components/appCreator/properties/edit/AddressField\";\nimport TextField from \"../../appCreator/properties/edit/TextField\";\nimport NumberField from \"../../appCreator/properties/edit/NumberField\";\nimport { State } from \"@types\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\n\ninterface MemberSettings {\n  maps_enabled?: string;\n  show_map?: string;\n  map_scope_selection?: string;\n  two_factor?: string;\n  anonymize_memberships_config: string;\n  initial_anonymize_memberships_config: string;\n  anonymize_memberships_managed_by_admin: boolean;\n  show_locked_memberships_managed_by_admin: boolean;\n  anonymize_memberships_after_days: number;\n  deleted_membership_count: number;\n  available_factor_types?: {\n    two_factor_email_available: boolean;\n    two_factor_totp_available: boolean;\n  };\n}\n\nfunction MemberSettings({\n  show_map,\n  map_scope_selection,\n  maps_enabled,\n  two_factor,\n  anonymize_memberships_config,\n  initial_anonymize_memberships_config,\n  anonymize_memberships_managed_by_admin,\n  show_locked_memberships_managed_by_admin,\n  anonymize_memberships_after_days,\n  deleted_membership_count,\n  available_factor_types,\n}: MemberSettings) {\n  const twoFactorOptions = [\n    {\n      value: \"disabled\",\n      label: I18n.t(\"js.administration.authentication.2fa.deactivated\"),\n    },\n    {\n      value: \"enabled\",\n      label: I18n.t(\"js.administration.authentication.2fa.optional\"),\n    },\n  ];\n\n  if (Tixxt.currentNetwork.getConfig(\"two_factor.enforced_available\"))\n    twoFactorOptions.push({\n      value: \"enforced\",\n      label: I18n.t(\n        \"js.administration.authentication.2fa.enforced_for_network\",\n      ),\n    });\n\n  return (\n    <>\n      <h3>\n        {I18n.t(\"js.administration.network_settings.member_settings.title\")}\n      </h3>\n\n      <h4 className=\"font-bold\">\n        {I18n.t(\"js.administration.network_settings.member_settings.directory\")}\n      </h4>\n\n      <div className=\"flex flex-col gap-4\">\n        <ControlGroup\n          name=\"directory_default_sort\"\n          label={I18n.t(\"js.networks.directory_sort.label\")}\n          className=\"white-box checkboxes border-box p-3\"\n        >\n          <SelectionField\n            name=\"directory_default_sort\"\n            multiple={false}\n            select={false}\n            required\n            options={[\n              {\n                value: \"first_name\",\n                label: I18n.t(\"js.networks.directory_sort.first_name\"),\n              },\n              {\n                value: \"last_name\",\n                label: I18n.t(\"js.networks.directory_sort.last_name\"),\n              },\n            ]}\n          />\n        </ControlGroup>\n\n        {maps_enabled === \"enabled\" ? (\n          <>\n            <ControlGroup\n              name=\"member_map\"\n              label={I18n.t(\n                \"js.administration.network_settings.member_settings.map.label\",\n              )}\n              className=\"white-box checkboxes border-box p-3\"\n            >\n              <div className=\"flex align-baseline gap-2 mb-3 mt-1\">\n                <FontAwesomeIcon\n                  icon={regular(\"circle-info\")}\n                  className=\"text-3xl text-muted\"\n                />\n                <div className=\"help-block\">\n                  {I18n.t(\"js.administration.network_settings.map_hint\")}\n                </div>\n              </div>\n              <SelectionField\n                name=\"show_map\"\n                multiple={false}\n                select={false}\n                required\n                options={[\n                  {\n                    value: \"enabled\",\n                    label: I18n.t(\n                      \"js.administration.network_settings.member_settings.map.enabled\",\n                    ),\n                  },\n                  {\n                    value: \"disabled\",\n                    label: I18n.t(\n                      \"js.administration.network_settings.member_settings.map.disabled\",\n                    ),\n                  },\n                ]}\n              />\n              <div className=\"help-block mt-1\">\n                {I18n.t(\"js.administration.network_settings.map_modal_body\")}\n              </div>\n              {show_map === \"enabled\" ? (\n                <>\n                  <hr className=\"mb-2\" />\n                  <div>\n                    <span>\n                      {I18n.t(\n                        \"js.administration.network_settings.member_settings.map.map_scope_selection.label\",\n                      )}\n                    </span>\n                    <div className=\"pt-1\">\n                      <SelectionField\n                        name=\"map_scope_selection\"\n                        multiple={false}\n                        select={false}\n                        required\n                        options={[\n                          {\n                            value: \"all\",\n                            label: I18n.t(\n                              \"js.administration.network_settings.member_settings.map.map_scope_selection.all\",\n                            ),\n                          },\n                          {\n                            value: \"poi\",\n                            label: I18n.t(\n                              \"js.administration.network_settings.member_settings.map.map_scope_selection.poi\",\n                            ),\n                          },\n                        ]}\n                      />\n                    </div>\n                    {map_scope_selection === \"poi\" ? (\n                      <div className=\"pt-1 flex flex-col gap-2\">\n                        <div>\n                          <span>\n                            {I18n.t(\n                              \"js.administration.network_settings.member_settings.map.map_scope_selection.address_label\",\n                            )}\n                          </span>\n                          <AddressField\n                            className=\"flex-auto w-64\"\n                            name=\"network_location\"\n                            required={{\n                              street: true,\n                              number: true,\n                              zip: true,\n                              city: true,\n                            }}\n                          />\n                          <span className=\"-mt-[20px]\">\n                            {I18n.t(\n                              \"js.administration.network_settings.member_settings.map.map_scope_selection.zoom\",\n                            )}\n                          </span>\n                          <SelectionField\n                            name=\"zoom_level\"\n                            multiple={false}\n                            select={true}\n                            required\n                            options={[\n                              {\n                                value: \"0\",\n                                label: I18n.t(\n                                  \"js.administration.network_settings.member_settings.map.map_scope_selection.earth\",\n                                ),\n                              },\n                              {\n                                value: \"3\",\n                                label: I18n.t(\n                                  \"js.administration.network_settings.member_settings.map.map_scope_selection.continent\",\n                                ),\n                              },\n                              {\n                                value: \"6\",\n                                label: I18n.t(\n                                  \"js.administration.network_settings.member_settings.map.map_scope_selection.rivers\",\n                                ),\n                              },\n                              {\n                                value: \"10\",\n                                label: I18n.t(\n                                  \"js.administration.network_settings.member_settings.map.map_scope_selection.roads\",\n                                ),\n                              },\n                              {\n                                value: \"15\",\n                                label: I18n.t(\n                                  \"js.administration.network_settings.member_settings.map.map_scope_selection.buildings\",\n                                ),\n                              },\n                            ]}\n                          />\n                        </div>\n                      </div>\n                    ) : null}\n                  </div>\n                  <hr className=\"my-2\" />\n                  {I18n.t(\n                    \"js.administration.network_settings.member_settings.map.theme.label\",\n                  )}\n                  <SelectionField\n                    name=\"map_theme\"\n                    multiple={false}\n                    select={false}\n                    required\n                    options={[\n                      {\n                        value: \"alidade_smooth\",\n                        label: (\n                          <img\n                            className=\"w-56 pb-1\"\n                            src=\"/static/map/alidade_smooth.png\"\n                            alt=\"alidade_smooth\"\n                          />\n                        ),\n                      },\n                      {\n                        value: \"alidade_smooth_dark\",\n                        label: (\n                          <img\n                            className=\"w-56 pb-1\"\n                            src=\"/static/map/alidade_smooth_dark.png\"\n                            alt=\"alidade_smooth_dark\"\n                          />\n                        ),\n                      },\n                      {\n                        value: \"osm_bright\",\n                        label: (\n                          <img\n                            className=\"w-56 pb-1\"\n                            src=\"/static/map/osm_bright.png\"\n                            alt=\"osm_bright\"\n                          />\n                        ),\n                      },\n                      {\n                        value: \"outdoors\",\n                        label: (\n                          <img\n                            className=\"w-56\"\n                            src=\"/static/map/outdoors.png\"\n                            alt=\"outdoors\"\n                          />\n                        ),\n                      },\n                    ]}\n                  />\n                </>\n              ) : null}\n            </ControlGroup>\n          </>\n        ) : null}\n        <ControlGroup\n          name=\"directory_profile_fields\"\n          label={I18n.t(\"js.networks.directory_fields.label\")}\n        >\n          <SelectionField\n            name=\"directory_profile_fields\"\n            multiple\n            options={map(\n              Tixxt.currentNetwork.get(\"profile_fields\") as Array<{\n                name: string;\n                label: string;\n              }>,\n              (field) => ({\n                value: field.name,\n                label: field.label,\n              }),\n            )}\n          />\n          <div className=\"help-block mt-1 !mb-3\">\n            {I18n.t(\"js.networks.directory_fields.help\")}\n          </div>\n        </ControlGroup>\n\n        <ControlGroup\n          name=\"detection_profile_field\"\n          label={I18n.t(\"js.networks.detection_profile_field.label\")}\n        >\n          <SelectionField\n            name=\"detection_profile_field\"\n            multiple={false}\n            options={map(\n              Tixxt.currentNetwork.get(\n                \"profile_fields_without_multiline\",\n              ) as Array<{\n                name: string;\n                label: string;\n              }>,\n              (field) => ({\n                value: field.name,\n                label: field.label,\n              }),\n            )}\n          />\n          <div className=\"help-block mt-1 !mb-3\">\n            {I18n.t(\"js.networks.detection_profile_field.hint\")}\n          </div>\n        </ControlGroup>\n        {show_locked_memberships_managed_by_admin ? (\n          <ControlGroup\n            name=\"show_locked_memberships\"\n            label={\"Gesperrte Nutzer im Nutzerverzeichnis anzeigen?\"}\n            className=\"white-box checkboxes border-box p-3\"\n          >\n            <SelectionField\n              name=\"show_locked_memberships\"\n              multiple={false}\n              select={false}\n              required\n              options={[\n                {\n                  value: \"enabled\",\n                  label: I18n.t(\n                    \"js.administration.network_settings.choices.yes\",\n                  ),\n                },\n                {\n                  value: \"disabled\",\n                  label: I18n.t(\n                    \"js.administration.network_settings.choices.no\",\n                  ),\n                },\n              ]}\n            />\n          </ControlGroup>\n        ) : null}\n\n        {anonymize_memberships_managed_by_admin ? (\n          <>\n            <ControlGroup\n              name=\"anonymize_memberships\"\n              label={I18n.t(\n                \"js.administration.network_settings.anonymize_memberships.title\",\n              )}\n              className=\"white-box checkboxes border-box p-3\"\n            >\n              {[\"enabled\", \"after_days\"].includes(\n                anonymize_memberships_config,\n              ) && initial_anonymize_memberships_config == \"disabled\" ? (\n                <div className=\"alert alert-error\">\n                  {I18n.t(\n                    \"js.administration.network_settings.anonymize_memberships.warning\",\n                    { deletedMemberCount: deleted_membership_count },\n                  )}\n                </div>\n              ) : null}\n              <SelectionField\n                name=\"anonymize_memberships_config\"\n                multiple={false}\n                select={false}\n                required\n                options={[\n                  {\n                    value: \"enabled\",\n                    label: I18n.t(\n                      \"js.administration.network_settings.anonymize_memberships.enabled\",\n                    ),\n                  },\n                  {\n                    value: \"after_days\",\n                    label: I18n.t(\n                      \"js.administration.network_settings.anonymize_memberships.after_x_days\",\n                      { days: anonymize_memberships_after_days },\n                    ),\n                  },\n                  {\n                    value: \"disabled\",\n                    label: I18n.t(\n                      \"js.administration.network_settings.anonymize_memberships.disabled\",\n                    ),\n                  },\n                ]}\n              />\n              {anonymize_memberships_config === \"after_days\" ? (\n                <>\n                  <hr className=\"my-2\" />\n                  {I18n.t(\n                    \"js.administration.network_settings.anonymize_memberships.days.title\",\n                  )}\n                  <NumberField\n                    name=\"anonymize_memberships_after_days\"\n                    required\n                  />\n                </>\n              ) : null}\n              {[\"enabled\", \"after_days\"].includes(\n                anonymize_memberships_config as string,\n              ) ? (\n                <>\n                  <hr className=\"my-2\" />\n                  {I18n.t(\n                    \"js.administration.network_settings.anonymize_memberships.name.title\",\n                  )}\n                  <TextField name=\"anonymize_memberships_name\" required />\n                </>\n              ) : null}\n            </ControlGroup>\n          </>\n        ) : null}\n\n        {Tixxt.currentNetwork.getConfig(\"guest_users.allowed\") ? (\n          <>\n            <h4 className=\"font-bold\">\n              {I18n.t(\n                \"js.administration.network_settings.guest_users_settings.title\",\n              )}\n            </h4>\n            {Preload.current_member?.can?.chat && (\n              <ControlGroup\n                name=\"guest_users\"\n                label={I18n.t(\n                  \"js.administration.network_settings.guest_users_settings.allow_chat\",\n                )}\n                className=\"white-box checkboxes border-box p-3\"\n              >\n                <SelectionField\n                  name=\"guest_users_allow_chat\"\n                  multiple={false}\n                  select={false}\n                  required\n                  options={[\n                    {\n                      value: \"enabled\",\n                      label: I18n.t(\n                        \"js.administration.network_settings.choices.yes\",\n                      ),\n                    },\n                    {\n                      value: \"disabled\",\n                      label: I18n.t(\n                        \"js.administration.network_settings.choices.no\",\n                      ),\n                    },\n                  ]}\n                />\n              </ControlGroup>\n            )}\n          </>\n        ) : null}\n\n        <h4 className=\"font-bold\">\n          {I18n.t(\n            \"js.administration.network_settings.member_settings.security\",\n          )}\n        </h4>\n\n        <ControlGroup\n          name=\"two_factor\"\n          label={I18n.t(\"js.authentication.2fa.page_title\")}\n          className=\"white-box checkboxes border-box p-3\"\n        >\n          <SelectionField\n            name=\"two_factor\"\n            multiple={false}\n            select={false}\n            required\n            options={twoFactorOptions}\n          />\n          {Tixxt.currentNetwork.getConfig(\"two_factor.enforced_available\") ? (\n            <div className=\"help-block mt-1\">\n              {I18n.t(\n                \"js.administration.authentication.2fa.enforced_description\",\n              )}\n            </div>\n          ) : null}\n\n          {two_factor != \"disabled\" ? (\n            <div className=\"grid grid-cols-2 mt-2 gap-4\">\n              <Controls\n                wrapperClassName=\"members-can-invite input boolean col-span-1\"\n                className={\"flex\"}\n              >\n                <CheckboxField\n                  name={`two_factor_totp_available`}\n                  label={\"\"}\n                  type=\"checkbox\"\n                  disabled={\n                    available_factor_types?.two_factor_email_available == false\n                  }\n                />\n                <div key=\"totp\" className=\"border-box flex-1 p-2\">\n                  <div className=\"media-body flex flex-col gap-2\">\n                    <div className=\"flex gap-2 items-center\">\n                      <i className=\"fa-regular fa-mobile text-2xl\" />\n                      <div className=\"flex grow justify-between gap-2 items-center\">\n                        <span className=\"font-semibold\">\n                          {I18n.t(\"js.authentication.2fa.authenticator_app\")}\n                        </span>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </Controls>\n              <Controls\n                wrapperClassName=\"members-can-invite input boolean col-span-1\"\n                className={\"flex\"}\n              >\n                <CheckboxField\n                  name={`two_factor_email_available`}\n                  label={\"\"}\n                  type=\"checkbox\"\n                  disabled={\n                    available_factor_types?.two_factor_totp_available == false\n                  }\n                />\n                <div key=\"email\" className=\"border-box flex-1 p-2\">\n                  <div className=\"media-body flex flex-col gap-2\">\n                    <div className=\"flex gap-2 items-center\">\n                      <i className={\"text-2xl fa-regular fa-envelope\"} />\n                      <div className=\"flex grow justify-between gap-2 items-center\">\n                        <span className=\"font-semibold\">\n                          {I18n.t(\"js.authentication.2fa.email\")}\n                        </span>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </Controls>\n            </div>\n          ) : null}\n        </ControlGroup>\n\n        <ControlGroup\n          name=\"online_status\"\n          label={I18n.t(\n            \"js.administration.network_settings.show_online_status.title\",\n          )}\n          className=\"white-box checkboxes border-box p-3\"\n        >\n          <SelectionField\n            name=\"show_online_status\"\n            multiple={false}\n            select={false}\n            required\n            options={[\n              {\n                value: \"disabled\",\n                label: I18n.t(\n                  \"js.administration.network_settings.show_online_status.disabled\",\n                ),\n              },\n              {\n                value: \"optional\",\n                label: I18n.t(\n                  \"js.administration.network_settings.show_online_status.optional\",\n                ),\n              },\n              {\n                value: \"enabled\",\n                label: I18n.t(\n                  \"js.administration.network_settings.show_online_status.enabled\",\n                ),\n              },\n            ]}\n          />\n          <div className=\"help-block mt-1\">\n            {I18n.t(\"js.administration.network_settings.online_status.hint\")}\n          </div>\n        </ControlGroup>\n      </div>\n    </>\n  );\n}\n\nconst selector = formValueSelector(\"networkSettingsForm\"); // the name of the outer form\nexport default connect((state) => ({\n  maps_enabled: selector(state as State, \"maps_enabled\"),\n  show_map: selector(state as State, \"show_map\"),\n  map_scope_selection: selector(state as State, \"map_scope_selection\"),\n  two_factor: selector(state as State, \"two_factor\"),\n  deleted_membership_count: selector(\n    state as State,\n    \"deleted_membership_count\",\n  ),\n  anonymize_memberships_managed_by_admin: selector(\n    state as State,\n    \"anonymize_memberships_managed_by_admin\",\n  ),\n  show_locked_memberships_managed_by_admin: selector(\n    state as State,\n    \"show_locked_memberships_managed_by_admin\",\n  ),\n  initial_anonymize_memberships_config: get(state, [\n    \"form\",\n    \"networkSettingsForm\",\n    \"initial\",\n    \"anonymize_memberships_config\",\n  ]),\n  anonymize_memberships_config: selector(\n    state as State,\n    \"anonymize_memberships_config\",\n  ),\n  anonymize_memberships_after_days: selector(\n    state as State,\n    \"anonymize_memberships_after_days\",\n  ),\n\n  available_factor_types: {\n    two_factor_totp_available: selector(\n      state as State,\n      \"two_factor_totp_available\",\n    ),\n    two_factor_email_available: selector(\n      state as State,\n      \"two_factor_email_available\",\n    ),\n  },\n}))(MemberSettings);\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { formValueSelector } from \"redux-form\";\nimport moment from \"moment\";\nimport { flatMap, each, memoize } from \"lodash\";\nimport ControlGroup from \"../../shared/fields/ControlGroup\";\nimport SelectionField from \"../../appCreator/properties/edit/SelectionField\";\nimport { Field } from \"redux-form\";\nimport NumberField from \"components/appCreator/properties/edit/NumberField.js\";\nimport { State } from \"@types\";\nimport FileUploadField from \"components/shared/fields/FileUploadField\";\nimport TextField from \"../../appCreator/properties/edit/TextField\";\nimport { useSendTestBirthdayEmail } from \"./api\";\nimport MarkdownEditorAdapter from \"components/shared/markdownEditor/MarkdownEditorAdapter\";\n\ntype day = { name: string; index: number };\n\nconst createDaysArray = memoize(() => {\n  const days: Array<day> = [];\n  each(moment.localeData().weekdays(), (weekday, index) =>\n    days.push({ name: weekday, index: index }),\n  );\n\n  let moveArray = moment.localeData().firstDayOfWeek();\n  while (moveArray != 0) {\n    if (days.length) {\n      days.push(days.shift() as day);\n    }\n    moveArray--;\n  }\n\n  return days;\n});\n\nfunction MailSettings() {\n  const selector = formValueSelector(\"networkSettingsForm\");\n  const digests_daily_activity_enabled = useSelector((state) =>\n    selector(state as State, \"daily_activity.enabled\"),\n  );\n  const birthday_emails_enabled = useSelector((state) =>\n    selector(state as State, \"birthday_emails.enabled\"),\n  );\n\n  const birthday_emails_values = useSelector((state) =>\n    selector(\n      state as State,\n      \"birthday_emails.subject\",\n      \"birthday_emails.text\",\n      \"birthday_emails.image\",\n    ),\n  );\n\n  const { mutateAsync: sendTestMail } = useSendTestBirthdayEmail({\n    onSuccess: () => {\n      toastr.success(\"Test Mail erfolgreich gesendet\");\n    },\n  });\n\n  const days = createDaysArray();\n  return (\n    <>\n      <h3>\n        {I18n.t(\"js.administration.network_settings.mail_settings.title\")}\n      </h3>\n      <div className=\"flex flex-col gap-3\">\n        <ControlGroup\n          name=\"notifications\"\n          label={I18n.t(\"js.networks.notifications.label\")}\n          className=\"white-box checkboxes border-box p-3\"\n        >\n          <label className=\"choice checkbox\">\n            <Field\n              component=\"input\"\n              type=\"checkbox\"\n              name=\"notifications_send_direct_message_body\"\n            />{\" \"}\n            {I18n.t(\"js.networks.notifications.dm_body.label\")}\n          </label>\n          <div className=\"help-block mt-1\">\n            {I18n.t(\"js.networks.notifications.dm_body.help\")}\n          </div>\n        </ControlGroup>\n        {Tixxt.currentNetwork.getConfig(\n          \"email_recommendations.allow_email_recommendation_configuration_for_network_admins\",\n        ) ? (\n          <ControlGroup\n            name=\"digest_sending_days\"\n            label={I18n.t(\n              \"js.administration.network_settings.activity_recommendation_email.label\",\n            )}\n            className=\"white-box checkboxes border-box p-3\"\n          >\n            <label className=\"choice checkbox\">\n              <Field\n                component=\"input\"\n                type=\"checkbox\"\n                name=\"email_recommendations.allow_external_recipients\"\n              />{\" \"}\n              {I18n.t(\n                \"js.administration.network_settings.activity_recommendation_email.checkbox\",\n              )}\n            </label>\n            <div className=\"help-block mt-1\">\n              {I18n.t(\n                \"js.administration.network_settings.activity_recommendation_email.help\",\n              )}\n            </div>\n            <label className=\"choice checkbox\">\n              <Field\n                component=\"input\"\n                type=\"checkbox\"\n                name=\"email_recommendations.include_replies_default\"\n              />{\" \"}\n              {I18n.t(\n                \"js.activitystreams.email_recommendations.include_replies_label\",\n              )}\n            </label>\n          </ControlGroup>\n        ) : null}\n        {Tixxt.currentNetwork.getConfig(\"digests.enabled\") ? (\n          <>\n            <h4 className=\"font-bold\">\n              {I18n.t(\"js.administration.network_settings.digests.label\")}\n            </h4>\n            <ControlGroup\n              name=\"digest_sending_days\"\n              label={I18n.t(\n                \"js.administration.network_settings.digest_sending_days.label\",\n              )}\n            >\n              <SelectionField\n                name=\"digest_sending_days\"\n                multiple={true}\n                options={flatMap(days, (day) => [\n                  {\n                    key: `${day.index}_am`,\n                    value: { day: day.index, time: \"am\" },\n                    label: `${day.name} ${I18n.t(\n                      \"js.administration.network_settings.digests.am\",\n                    )}`,\n                  },\n                  {\n                    key: `${day.index}_pm`,\n                    value: { day: day.index, time: \"pm\" },\n                    label: `${day.name} ${I18n.t(\n                      \"js.administration.network_settings.digests.pm\",\n                    )}`,\n                  },\n                ])}\n              />\n              {Tixxt.currentNetwork.getConfig(\"digests.configurable\") ? null : (\n                <div className=\"help-block mt-1 !mb-3\">\n                  {I18n.t(\n                    \"js.administration.network_settings.setting_restricted_by_plan\",\n                  )}\n                </div>\n              )}\n            </ControlGroup>\n            {Tixxt.currentNetwork.getConfig(\"digests.configurable\") ? (\n              <>\n                <ControlGroup\n                  name=\"digests.max_number_of_upcoming_appointments\"\n                  label={I18n.t(\n                    \"js.administration.network_settings.max_number_of_upcoming_appointments.label\",\n                  )}\n                >\n                  <NumberField\n                    name=\"digests.max_number_of_upcoming_appointments\"\n                    required\n                    max={30}\n                    min={0}\n                  />\n                </ControlGroup>\n                <ControlGroup\n                  name=\"digests.upcoming_appointments_position\"\n                  label={I18n.t(\n                    \"js.administration.network_settings.upcoming_appointments_position.label\",\n                  )}\n                  className=\"white-box checkboxes border-box p-3\"\n                >\n                  <SelectionField\n                    name=\"digests.upcoming_appointments_position\"\n                    multiple={false}\n                    select={false}\n                    required\n                    options={[\n                      {\n                        value: \"top\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.upcoming_appointments_position.top\",\n                        ),\n                      },\n                      {\n                        value: \"bottom\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.upcoming_appointments_position.bottom\",\n                        ),\n                      },\n                    ]}\n                  />\n                </ControlGroup>\n                <ControlGroup\n                  name=\"digests.show_comments\"\n                  label={I18n.t(\n                    \"js.administration.network_settings.show_comments.label\",\n                  )}\n                  className=\"white-box checkboxes border-box p-3\"\n                >\n                  <SelectionField\n                    name=\"digests.show_comments\"\n                    multiple={false}\n                    select={false}\n                    required\n                    options={[\n                      {\n                        value: \"true\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.show_comments.show\",\n                        ),\n                      },\n                      {\n                        value: \"false\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.show_comments.show_not\",\n                        ),\n                      },\n                    ]}\n                  />\n                </ControlGroup>\n              </>\n            ) : null}\n          </>\n        ) : null}\n        {Tixxt.currentNetwork.getConfig(\n          \"digests.daily_activity.feature_available\",\n        ) ? (\n          <div className=\"flex flex-col gap-4\">\n            <ControlGroup\n              name=\"\"\n              label={I18n.t(\n                \"js.administration.network_settings.daily_digests.label\",\n              )}\n              className=\"white-box checkboxes border-box p-3\"\n            >\n              <SelectionField\n                name=\"daily_activity.enabled\"\n                multiple={false}\n                select={false}\n                required\n                options={[\n                  {\n                    value: \"true\",\n                    label: I18n.t(\n                      \"js.administration.network_settings.daily_digests.enabled.true\",\n                    ),\n                  },\n                  {\n                    value: \"false\",\n                    label: I18n.t(\n                      \"js.administration.network_settings.daily_digests.enabled.false\",\n                    ),\n                  },\n                ]}\n              />\n              <div className=\"help-block mt-1 !mb-3\">\n                {I18n.t(\n                  \"js.administration.network_settings.daily_digests.enabled.help\",\n                )}\n              </div>\n              {digests_daily_activity_enabled === \"true\" && (\n                <>\n                  <hr className=\"mb-2\" />\n                  <span className=\"pb-1\">\n                    {I18n.t(\n                      \"js.administration.network_settings.daily_digests.include_network_level.label\",\n                    )}\n                  </span>\n                  <SelectionField\n                    name=\"daily_activity.include_network_level\"\n                    multiple={false}\n                    select={false}\n                    required\n                    options={[\n                      {\n                        value: \"true\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.daily_digests.include_network_level.true\",\n                        ),\n                      },\n                      {\n                        value: \"false\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.daily_digests.include_network_level.false\",\n                        ),\n                      },\n                    ]}\n                  />\n                  <hr className=\"mb-2\" />\n                  <span className=\"pb-1\">\n                    {I18n.t(\n                      \"js.administration.network_settings.daily_digests.mode.label\",\n                    )}\n                  </span>\n                  <SelectionField\n                    name=\"daily_activity.mode\"\n                    multiple={false}\n                    select={false}\n                    required\n                    options={[\n                      {\n                        value: \"new\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.daily_digests.mode.new\",\n                        ),\n                      },\n                      {\n                        value: \"new_and_updated\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.daily_digests.mode.new_and_updated\",\n                        ),\n                      },\n                    ]}\n                  />\n                  <hr className=\"my-2\" />\n                  <span className=\"pb-1\">\n                    {I18n.t(\n                      \"js.administration.network_settings.daily_digests.sending_time.label\",\n                    )}\n                  </span>\n                  <SelectionField\n                    name=\"daily_activity.sending_time\"\n                    multiple={false}\n                    select={false}\n                    required\n                    options={[\n                      {\n                        value: \"am\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.daily_digests.sending_time.am\",\n                        ),\n                      },\n                      {\n                        value: \"pm\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.daily_digests.sending_time.pm\",\n                        ),\n                      },\n                    ]}\n                  />\n                  <hr className=\"my-2\" />\n                  <span className=\"pb-1\">\n                    {I18n.t(\n                      \"js.administration.network_settings.daily_digests.only_weekdays.label\",\n                    )}\n                  </span>\n                  <SelectionField\n                    name=\"daily_activity.only_weekdays\"\n                    multiple={false}\n                    select={false}\n                    required\n                    options={[\n                      {\n                        value: \"true\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.daily_digests.only_weekdays.true\",\n                        ),\n                      },\n                      {\n                        value: \"false\",\n                        label: I18n.t(\n                          \"js.administration.network_settings.daily_digests.only_weekdays.false\",\n                        ),\n                      },\n                    ]}\n                  />\n                </>\n              )}\n            </ControlGroup>\n          </div>\n        ) : null}\n        {Tixxt.currentNetwork.getConfig(\n          \"birthday_emails.admin_configurable\",\n        ) ? (\n          <div className=\"flex flex-col gap-4\">\n            <ControlGroup\n              name=\"\"\n              label={I18n.t(\n                \"js.administration.network_setting.birthday_emails.title\",\n              )}\n              className=\"white-box checkboxes border-box p-3\"\n            >\n              <span className=\"pb-1\">\n                {I18n.t(\n                  \"js.administration.network_setting.birthday_emails.enable_label\",\n                )}\n              </span>\n              <SelectionField\n                name=\"birthday_emails.enabled\"\n                multiple={false}\n                select={false}\n                required\n                options={[\n                  {\n                    value: \"true\",\n                    label: I18n.t(\n                      \"js.administration.network_setting.choices.yes\",\n                    ),\n                  },\n                  {\n                    value: \"false\",\n                    label: I18n.t(\n                      \"js.administration.network_setting.choices.no\",\n                    ),\n                  },\n                ]}\n              />\n\n              {birthday_emails_enabled === \"true\" && (\n                <>\n                  <hr className=\"my-2\" />\n                  <span className=\"pb-2\">\n                    {I18n.t(\n                      \"js.administration.network_setting.birthday_emails.image_label\",\n                    )}\n                  </span>\n\n                  <Field\n                    name=\"birthday_emails.image\"\n                    component={FileUploadField}\n                    props={{\n                      multiple: false,\n                      isImage: true,\n                      storageDirectory: \"assets\",\n                    }}\n                  />\n                  <div className=\"help-block mt-1\">\n                    {I18n.t(\n                      \"js.administration.network_setting.birthday_emails.image_size_hint\",\n                    )}\n                  </div>\n\n                  <hr className=\"my-2\" />\n                  <span className=\"pb-2\">\n                    {I18n.t(\n                      \"js.administration.network_setting.birthday_emails.subject_label\",\n                    )}\n                  </span>\n\n                  <TextField name=\"birthday_emails.subject\" />\n                  <hr className=\"my-2\" />\n                  <span className=\"mt-4\">\n                    {I18n.t(\n                      \"js.administration.network_setting.birthday_emails.text_label\",\n                    )}\n                  </span>\n\n                  <Field\n                    label={I18n.t(\n                      \"js.administration.network_setting.birthday_emails.text_label\",\n                    )}\n                    component={MarkdownEditorAdapter}\n                    name=\"birthday_emails.text\"\n                  />\n                  <div className=\"flex justify-end mt-4\">\n                    <button\n                      className=\"btn btn-primary\"\n                      onClick={(e) => {\n                        e.preventDefault();\n                        sendTestMail(birthday_emails_values);\n                      }}\n                    >\n                      {I18n.t(\n                        \"js.administration.network_setting.birthday_emails.send_test_mail_label\",\n                      )}\n                    </button>\n                  </div>\n                </>\n              )}\n            </ControlGroup>\n          </div>\n        ) : null}\n      </div>\n    </>\n  );\n}\n\nexport default MailSettings;\n","import React, { useState } from \"react\";\nimport { memoize } from \"lodash\";\nimport ReduxForm from \"components/shared/reduxForm\";\nimport BasicSettings from \"./BasicSettings\";\nimport JoinSettings from \"./JoinSettings\";\nimport MemberSettings from \"./MemberSettings\";\nimport MailSettings from \"./MailSettings\";\nimport TabBar from \"../../shared/TabBar\";\n\nconst getTabs = memoize(() => {\n  const tabs = [\n    {\n      label: I18n.t(\"js.administration.network_settings.basic_settings.title\"),\n      TabContent: BasicSettings,\n    },\n    {\n      label: I18n.t(\"js.administration.network_settings.join_settings.title\"),\n      TabContent: JoinSettings,\n    },\n    {\n      label: I18n.t(\"js.administration.network_settings.member_settings.title\"),\n      TabContent: MemberSettings,\n    },\n    {\n      label: I18n.t(\"js.administration.network_settings.mail_settings.title\"),\n      TabContent: MailSettings,\n    },\n  ];\n\n  return tabs;\n});\n\ninterface NetworkSettingsFormTypes {\n  initialValues: Record<PropertyKey, unknown>;\n  onSubmit: (values: any) => Promise<any>;\n}\n\nfunction NetworkSettingsForm({\n  onSubmit,\n  initialValues,\n}: NetworkSettingsFormTypes) {\n  const [selectedTabIndex, selectTabIndex] = useState(0);\n  const { TabContent } = getTabs()[selectedTabIndex];\n\n  return (\n    <ReduxForm\n      form=\"networkSettingsForm\"\n      className=\"form-horizontal boxed-form-fields\"\n      initialValues={initialValues}\n      onSubmit={onSubmit}\n      onSubmitFail={() => toastr.error(I18n.t(\"js.saving_failure\"))}\n      onCancel={(reset: () => void) => reset()}\n      allowSaveWithoutChange={false}\n    >\n      <TabBar\n        tabs={getTabs()}\n        selectedTabIndex={selectedTabIndex}\n        selectTabIndex={selectTabIndex}\n      />\n      <div className=\"tab-content network-settings\">\n        <TabContent />\n      </div>\n    </ReduxForm>\n  );\n}\n\nexport default NetworkSettingsForm;\n","import React from \"react\";\nimport { isEmpty, map } from \"lodash\";\n\nimport { useNetworkSettings, useUpdateNetworkSettings } from \"./api\";\nimport PageTitle from \"../../layout/PageTitle\";\nimport NetworkSettingsForm from \"./NetworkSettingsForm\";\nimport { useDispatch } from \"react-redux\";\nimport publishAllVolatile from \"helpers/files/publishAllVolatile\";\n\nfunction NetworkSettings() {\n  const { isLoading, data: networkSettings } = useNetworkSettings();\n  const dispatch = useDispatch();\n  const { mutateAsync: updateNetworkSettings } = useUpdateNetworkSettings({\n    onSuccess: () => {\n      toastr.success(I18n.t(\"js.saving_successful\"));\n      window.location.reload(); // hard reload, to apply language settings\n    },\n  });\n\n  const onSubmit = async (values) => {\n    let body = {\n      ...values,\n      // The SelectField resolve to an empty array if you clear the input\n      category: isEmpty(values.category) ? null : values.category,\n      detection_profile_field: isEmpty(values.detection_profile_field)\n        ? null\n        : values.detection_profile_field,\n      // Send array of group_ids instead of an array with group objects\n      group_promotion_config: {\n        ...values.group_promotion_config,\n        group_ids: map(values.group_promotion_config.groups, (g) => g.id),\n      },\n      guest_users_allow_chat: values.guest_users_allow_chat === \"enabled\",\n      birthday_emails: {\n        subject:\n          values.birthday_emails.subject === \"\"\n            ? null\n            : values.birthday_emails.subject,\n        text:\n          values.birthday_emails.text === \"\"\n            ? null\n            : values.birthday_emails.text,\n        enabled: values.birthday_emails.enabled === \"true\",\n      },\n    };\n\n    if (values.birthday_emails.image != null) {\n      const result = await publishAllVolatile({\n        dispatch,\n        values: { birthday_emails_image: values.birthday_emails.image },\n        storageDirectory: \"assets\",\n      });\n\n      body = {\n        ...body,\n        birthday_emails: {\n          ...body.birthday_emails,\n          image: result.birthday_emails_image[0],\n        },\n      };\n\n      return updateNetworkSettings(body);\n    } else {\n      body = {\n        ...body,\n        birthday_emails: {\n          ...body.birthday_emails,\n          image: null,\n        },\n      };\n\n      return updateNetworkSettings(body);\n    }\n  };\n\n  return (\n    <>\n      <PageTitle\n        title={I18n.t(\"js.administration.network_settings.edit.title\")}\n      />\n      <div>\n        <div>\n          {isLoading || isEmpty(networkSettings) ? (\n            <div>\n              <i className=\"fa fa-spin fa-spinner\" /> {I18n.t(\"js.loading\")}\n            </div>\n          ) : (\n            <NetworkSettingsForm\n              initialValues={networkSettings}\n              onSubmit={onSubmit}\n            />\n          )}\n        </div>\n      </div>\n    </>\n  );\n}\n\nexport default NetworkSettings;\n","import React from \"react\";\n\ninterface LinkFormTypes {\n  link: string;\n  text: string;\n\n  onChange(...args: unknown[]): unknown;\n}\n\nfunction LinkForm({ link, text, onChange }: LinkFormTypes) {\n  text = text || I18n.t(\"js.administration.navigation_items.default_text\");\n  return (\n    <input\n      className=\"input-text form-control\"\n      value={link}\n      onChange={(e) => onChange({ link: e.target.value, text })}\n      placeholder={I18n.t(\"js.administration.navigation_items.url_placeholder\")}\n    />\n  );\n}\n\nexport default LinkForm;\n","import React from \"react\";\n\n// Method gets default menu-item-name from selected page, app or standard-site.\nconst getDefaultName = (target) => {\n  const selectedIndex = target.selectedIndex;\n  return target[selectedIndex].text;\n};\n\ninterface SelectContentTypes {\n  data: {\n    label?: string;\n    link?: string;\n  }[];\n  link: string;\n\n  onChange(...args: unknown[]): unknown;\n}\n\nfunction SelectContent({ data, link, onChange }: SelectContentTypes) {\n  return (\n    <select\n      className=\"input-text form-control\"\n      onChange={(e) =>\n        onChange({ link: e.target.value, text: getDefaultName(e.target) })\n      }\n      value={link}\n    >\n      <option value=\"\">\n        {I18n.t(\"js.administration.navigation_items.select_option\")}\n      </option>\n      {data.map((item, index) => (\n        <option value={item.link} key={index}>\n          {item.label}\n        </option>\n      ))}\n    </select>\n  );\n}\n\nexport default SelectContent;\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\n\ninterface MainFieldsTypes {\n  onChangeOption(...args: unknown[]): unknown;\n\n  hasChildren: boolean;\n  option: string;\n  items: {\n    apps?: Array<unknown>;\n    pages?: Array<unknown>;\n    standard?: Array<unknown>;\n  };\n}\n\nfunction MainFields({\n  hasChildren,\n  option,\n  onChangeOption,\n  items,\n}: MainFieldsTypes) {\n  let optionLink = [\n    {\n      label: I18n.t(\"js.administration.navigation_items.link.option_label\"),\n      name: \"link\",\n    },\n    //{ label: \"Folder\", name: \"folder\" },\n    //{ label: \"Group\", name: \"group\" },\n    {\n      label: I18n.t(\"js.administration.navigation_items.page.option_label\"),\n      name: \"pages\",\n    },\n    {\n      label: I18n.t(\"js.administration.navigation_items.app.option_label\"),\n      name: \"apps\",\n    },\n    {\n      label: I18n.t(\"js.administration.navigation_items.standard.option_label\"),\n      name: \"standard\",\n    },\n  ];\n\n  // filter out Apps and Pages from the Dropdown if there are none present\n  optionLink = optionLink.filter(\n    (item) => !isEmpty(items[item.name]) || item.name == \"link\",\n  );\n\n  return (\n    <div>\n      {!hasChildren && (\n        <div>\n          <label>\n            {I18n.t(\"js.administration.navigation_items.link_input_label\")}\n          </label>\n          <select\n            className=\"input-text form-control\"\n            name=\"option\"\n            onChange={onChangeOption}\n            value={option}\n          >\n            {optionLink.map((item, index) => (\n              <option value={item.name} key={index}>\n                {item.label}\n              </option>\n            ))}\n          </select>\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default MainFields;\n","import React from \"react\";\n\ninterface CheckboxesTypes {\n  newWindow?: boolean;\n\n  onChangeNewWindow(...args: unknown[]): unknown;\n\n  isPublic?: boolean;\n\n  onChangePublic(...args: unknown[]): unknown;\n}\n\nfunction Checkboxes({\n  newWindow,\n  onChangeNewWindow,\n  isPublic,\n  onChangePublic,\n}: CheckboxesTypes) {\n  return (\n    <div>\n      <label>\n        {I18n.t(\"js.administration.navigation_items.option_input_label\")}\n      </label>\n      <div className=\"checkbox-container\">\n        <label className=\"checkbox flex gap-2\">\n          <span>{I18n.t(\"js.administration.navigation_items.new_window\")}</span>\n          <input\n            type=\"checkbox\"\n            name=\"new_window\"\n            checked={newWindow}\n            onChange={(e) => onChangeNewWindow(e.target.checked)}\n          />\n        </label>\n        <label className=\"checkbox flex gap-2\">\n          <span>\n            {I18n.t(\"js.administration.navigation_items.visible_for_guests\")}\n          </span>\n          <input\n            type=\"checkbox\"\n            name=\"public\"\n            checked={isPublic}\n            onChange={(e) => onChangePublic(e.target.checked)}\n          />\n        </label>\n      </div>\n    </div>\n  );\n}\n\nexport default Checkboxes;\n","import type { ChangeEvent } from \"react\";\nimport type { TreeItem } from \"react-sortable-tree\";\nimport React from \"react\";\nimport \"../navigationManager.css\";\nimport { isEmpty, findKey, isEqual, find } from \"lodash\";\nimport { connect } from \"react-redux\";\nimport LinkForm from \"./LinkForm\";\nimport SelectContent from \"./SelectContent\";\nimport MainFields from \"./MainFields\";\nimport Checkboxes from \"./Checkboxes\";\nimport { State } from \"../../../@types\";\n\nfunction findOption(items, link) {\n  const keyName = findKey(items, (value) =>\n    find(value, (item) => isEqual(item.link, link)),\n  );\n  if (!isEmpty(keyName)) return keyName;\n  return \"link\";\n}\n\ntype items = {\n  apps?: Array<unknown>;\n  pages?: Array<unknown>;\n};\n\ninterface ItemFormTypes {\n  option: string;\n  items: items;\n  link: string;\n  text: string;\n\n  onChange(...args: unknown[]): unknown;\n}\n\nfunction ItemForm({ option, items, link, text, onChange }: ItemFormTypes) {\n  if (items[option]) {\n    return (\n      <SelectContent data={items[option]} onChange={onChange} link={link} />\n    );\n  }\n  return <LinkForm link={link} text={text} onChange={onChange} />;\n}\n\ninterface NavigationManagerFormTypes {\n  node: TreeItem | null;\n\n  onChangeNode(...args: unknown[]): unknown;\n\n  items: items;\n}\n\nfunction NavigationManagerForm({\n  node,\n  onChangeNode,\n  items,\n}: NavigationManagerFormTypes) {\n  if (isEmpty(node)) {\n    return null;\n  }\n  const hasChildren = !isEmpty((node as TreeItem).children);\n  const option = (node as TreeItem).option\n    ? (node as TreeItem).option\n    : findOption(items, (node as TreeItem).link);\n  return (\n    <div className=\"navigation-manager-form\">\n      <form>\n        <MainFields\n          hasChildren={hasChildren}\n          items={items}\n          option={option}\n          onChangeOption={(e: ChangeEvent<HTMLInputElement>) => {\n            onChangeNode({ ...node, option: e.target.value });\n          }}\n        />\n        {!hasChildren && [\n          <ItemForm\n            option={option}\n            link={(node as TreeItem).link}\n            text={(node as TreeItem).text}\n            onChange={({ link, text }) => onChangeNode({ ...node, link, text })}\n            items={items}\n            key=\"options\"\n          />,\n        ]}\n        <label>\n          {I18n.t(\"js.administration.navigation_items.name_input_label\")}\n        </label>\n        <input\n          className=\"input-text form-control\"\n          value={(node as TreeItem).text}\n          onChange={(e) => {\n            onChangeNode({ ...node, text: e.target.value });\n          }}\n        />\n        {!hasChildren && [\n          <Checkboxes\n            newWindow={(node as TreeItem).new_window}\n            isPublic={(node as TreeItem).public}\n            onChangeNewWindow={(new_window) =>\n              onChangeNode({ ...node, new_window })\n            }\n            onChangePublic={(p) => onChangeNode({ ...node, public: p })}\n            key=\"checkboxes\"\n          />,\n        ]}\n      </form>\n    </div>\n  );\n}\n\nexport default connect(\n  (\n    state,\n    { items, groupSlug }: { items: items; groupSlug: string | null },\n  ) => ({\n    items: {\n      ...items,\n      standard: groupSlug\n        ? []\n        : [\n            {\n              link: \"/\",\n              label: I18n.t(\n                \"js.administration.navigation_items.standard.start.option_label\",\n              ),\n            },\n            {\n              link: \"/members\",\n              label: I18n.t(\n                \"js.administration.navigation_items.standard.user-folder.option_label\",\n              ),\n            },\n          ].concat(\n            (state as State).network.group_categories.map(\n              ({ slug, plural_name }) => ({\n                link: `/directory/${slug}`,\n                label: plural_name,\n              }),\n            ),\n          ),\n    },\n  }),\n)(NavigationManagerForm);\n","import React from \"react\";\n\ninterface ItemButtonTypes {\n  onClick?(...args: unknown[]): unknown;\n\n  buttonClass?: string;\n  icon?: string;\n}\n\nfunction ItemButton({ onClick, buttonClass, icon }: ItemButtonTypes) {\n  return (\n    <button onClick={onClick} className={`btn btn-sm ${buttonClass}`}>\n      <i className={icon} />\n    </button>\n  );\n}\n\nexport default ItemButton;\n","import type { TreeItem } from \"react-sortable-tree\";\nimport React, { Component } from \"react\";\nimport SortableTree, {\n  changeNodeAtPath,\n  addNodeUnderParent,\n  removeNodeAtPath,\n  getNodeAtPath,\n  walk,\n} from \"react-sortable-tree\";\nimport { isEqual, isEmpty } from \"lodash\";\nimport classNames from \"classnames\";\n\nimport \"react-sortable-tree/style.css\";\nimport NavigationManagerForm from \"./navigationManager/NavigationManagerForm\";\nimport ItemButton from \"./navigationManager/ItemButton\";\nimport Flash from \"../shared/Flash\";\nimport PageTitle from \"../layout/PageTitle\";\nimport GroupNavigation from \"../layout/GroupNavigation\";\nimport \"./navigationManager.css\";\nimport { queryClient } from \"helpers/queryClient\";\n\nconst getNodeKey = ({ treeIndex }) => treeIndex;\n\nconst countAllNodes = (treeData) => {\n  let sum = 0;\n  walk({\n    treeData,\n    getNodeKey,\n    callback: () => {\n      sum = sum + 1;\n    },\n  });\n  return sum;\n};\n\n// Validation of empty item-name and url fields in data-object (see state.treeData). Used in:\n// - \"isValidTree\" method\n// - \"generateNodeProps\" method in SortableTree component to set css-class of item with empty field\nconst isValidNode = (node) => {\n  if (isEmpty(node.text)) return false;\n  if (isEmpty(node.link) && isEmpty(node.children)) return false;\n  return true;\n};\n\n// Method returns true if every node in the tree is valid\n// Used in \"sendData\" method as validation before data sending\nconst isValidTree = (treeData) => {\n  const result: Array<string> = [];\n  walk({\n    treeData,\n    getNodeKey,\n    ignoreCollapsed: false,\n    callback: ({ node, path }) => {\n      if (!isValidNode(node)) result.push(path);\n    },\n  });\n  return isEmpty(result);\n};\n\n// Validation of drop possibility. Maximal depth of Tree Data is 2,\n// means: main-parent-item + sub-children-items (sub-children-items cannot have children)\nconst canDrop = ({ node, nextPath }) => {\n  if (nextPath.length > 2) return false;\n  if (node.children.length > 0 && nextPath.length > 1) return false;\n  return true;\n};\n\nconst reloadNavbar = (groupSlug: null | string) => {\n  queryClient.invalidateQueries([\"groupNavigationItems\", groupSlug]);\n};\n\nconst navigationItemsUrl = ({ groupSlug }) =>\n  groupSlug ? `/groups/${groupSlug}/administration` : \"/administration\";\n\ntype State = {\n  treeData: Array<TreeItem>;\n  activePath: Array<number | string>;\n  apps: Array<unknown>;\n  pages: Array<unknown>;\n  isLoading: boolean;\n  loadError: boolean;\n  isSaving: boolean;\n  saveError: boolean;\n  saveSuccess: boolean;\n};\n\ninterface NavigationManagerTypes {\n  groupSlug: string | null;\n}\n\nclass NavigationManager extends Component<NavigationManagerTypes> {\n  treeRef: React.RefObject<HTMLDivElement>;\n\n  constructor(props: NavigationManagerTypes) {\n    super(props);\n\n    this.state = {\n      treeData: [],\n      activePath: [],\n      apps: [],\n      pages: [],\n      isLoading: false,\n      loadError: false,\n      isSaving: false,\n      saveError: false,\n      saveSuccess: false,\n    };\n\n    this.treeRef = React.createRef();\n  }\n\n  onChangeTree = (treeData) => this.setState({ treeData });\n\n  onMoveNode = (event) => {\n    this.setState({ activePath: event.path });\n  };\n\n  onChangeActiveNode = (newNode) =>\n    this.setState(({ activePath, treeData }: State) => ({\n      treeData: changeNodeAtPath({\n        treeData,\n        path: activePath,\n        getNodeKey,\n        newNode,\n      }),\n    }));\n\n  // Method sends a request with data-object (see state.treeData) to backend,\n  // reloads site when catches no errors.\n  // Has also a validation of empty fields.\n  sendData = async () => {\n    this.setState({ isSaving: true, saveError: false, saveSuccess: false });\n\n    if (!isValidTree((this.state as State).treeData)) {\n      toastr.error(\n        I18n.t(\"js.administration.navigation_items.edit.message_empty_fields\"),\n      );\n      this.setState({\n        isSaving: false,\n      });\n      return;\n    }\n\n    try {\n      const response = await fetch(\n        `${navigationItemsUrl(this.props)}/navigation`,\n        {\n          method: \"PUT\",\n          body: JSON.stringify({\n            navigation_items: this.serializeTree(\n              (this.state as State).treeData,\n            ),\n          }),\n          headers: {\n            \"Content-Type\": \"application/json\",\n          },\n          credentials: \"include\",\n        },\n      );\n      const responseData = await response.json();\n\n      this.setState({\n        treeData: responseData.map(this.parseNavigationItems),\n        isSaving: false,\n        saveSuccess: true,\n      });\n      reloadNavbar(this.props.groupSlug);\n      // groupSlug ? reloadGroupNavbar(groupSlug) : null;\n    } catch (error) {\n      console.error(error);\n      this.setState({\n        isSaving: false,\n        saveError: true,\n      });\n    }\n  };\n\n  async componentDidMount() {\n    this.setState({ isLoading: true });\n    try {\n      const navResponse = await fetch(\n        `${navigationItemsUrl(this.props)}/navigation.json`,\n        { credentials: \"include\" },\n      );\n      const navData = await navResponse.json();\n      const pagesResponse = await fetch(\n        `${navigationItemsUrl(this.props)}/pages.json`,\n        { credentials: \"include\" },\n      );\n      const pagesData = await pagesResponse.json();\n      const appsResponse = await fetch(\n        `${navigationItemsUrl(this.props)}/apps.json`,\n        { credentials: \"include\" },\n      );\n      const appsData = await appsResponse.json();\n      const { groupSlug } = this.props;\n      this.setState({\n        treeData: navData.map(this.parseNavigationItems),\n        pages: pagesData.map((item) => ({\n          label: item.name,\n          link: groupSlug\n            ? `/groups/${groupSlug}/pages/${item.slug}`\n            : `/pages/${item.slug}`,\n        })),\n        apps:\n          appsResponse.status == 200\n            ? appsData.map((item) => ({\n                label: item.name,\n                link: groupSlug\n                  ? `/groups/${groupSlug}/apps/${item.slug}`\n                  : `/apps/${item.slug}`,\n              }))\n            : [],\n        isLoading: false,\n      });\n    } catch (error) {\n      console.error(error);\n      this.setState({\n        isLoading: false,\n        loadError: true,\n      });\n    }\n  }\n\n  // Method adapts keys in data-object received from backend to data-object processed in \"SortableTree\" component.\n  // Adds new option key.\n  // Used by component mounting in lifecycle method \"componentDidMount\"\n  // and sending data in \"sendData\" method.\n  parseNavigationItems = (data) => {\n    data.expanded = true;\n\n    if (!isEmpty(data.children)) data.link = \"\";\n    if (data.navigation_items) {\n      data.children = data.navigation_items.map(this.parseNavigationItems);\n      delete data.navigation_items;\n    }\n\n    return data;\n  };\n\n  // Method adapts keys in data-object (see state.treeData) to data-object processed in backend.\n  // Used by sending data in \"sendData\" method.\n  serializeTree = (treeData) => treeData.map(this.serializeNode);\n\n  serializeNode = ({ text, link, public: isPublic, new_window, children }) => {\n    const result = { text, link, public: isPublic, new_window };\n    if (children && children.length > 0) {\n      result.link = \"#\";\n      Reflect.set(result, \"navigation_items\", children.map(this.serializeNode));\n    }\n    return result;\n  };\n\n  getActiveNode = () => {\n    const node = getNodeAtPath({\n      treeData: (this.state as State).treeData,\n      path: (this.state as State).activePath,\n      getNodeKey,\n    });\n    return node ? node.node : null;\n  };\n\n  buildNewNode = () => ({\n    text: I18n.t(\"js.administration.navigation_items.default_text\"),\n    link: \"\",\n    option: \"link\",\n    new_window: false,\n    public: false,\n    children: [],\n  });\n\n  // Method adds new node in tree data. Used as onClick-handler in \"itemButtons\" method, where adds new nodes as sub-items (children).\n  // \"Add new item\" blue button (see in browser on the bottom of \"Tree\") uses also this method as onClick-handler.\n  // In this case method calls the function \"scrollToBottom\"\n  addNodeAt = (path) => (e) => {\n    e.stopPropagation();\n\n    const { treeData, treeIndex } = addNodeUnderParent({\n      treeData: (this.state as State).treeData,\n      parentKey: path[path.length - 1],\n      expandParent: true,\n      getNodeKey,\n      newNode: this.buildNewNode(),\n      addAsFirstChild: false,\n    });\n\n    // Select nodeIndex under current parent or last node without parent\n    const activePath =\n      path.length > 0\n        ? path.concat([treeIndex])\n        : [countAllNodes(treeData) - 1];\n\n    this.setState({\n      treeData,\n      activePath,\n    });\n    if (isEmpty(path)) this.scrollToBottom();\n  };\n\n  removeItemAt = (path) => (e) => {\n    e.stopPropagation();\n\n    this.setState((state: State) => ({\n      treeData: removeNodeAtPath({\n        treeData: state.treeData,\n        path,\n        getNodeKey,\n      }),\n    }));\n  };\n\n  // Method shows specific buttons on every items.\n  // On parent-items: \"add\" and \"remove\" buttons, on child-items only \"remove\" buttons.\n  itemButtons(path) {\n    const buttons: Array<React.ReactNode> = [];\n\n    if (path.length <= 1) {\n      buttons.push(\n        <ItemButton\n          onClick={this.addNodeAt(path)}\n          icon=\"fa fa-plus\"\n          buttonClass=\"btn-primary add-navigation-child-button\"\n        />,\n      );\n    }\n\n    buttons.push(\n      <ItemButton\n        onClick={this.removeItemAt(path)}\n        icon=\"fa-regular fa-trash\"\n        buttonClass=\"btn-danger\"\n      />,\n    );\n\n    return buttons;\n  }\n\n  scrollToBottom = () => {\n    window.scrollTo({\n      top: this.treeRef.current?.clientHeight,\n      behavior: \"smooth\",\n    });\n  };\n\n  render() {\n    const items = {\n      apps: (this.state as State).apps,\n      pages: (this.state as State).pages,\n    };\n    const {\n      saveSuccess,\n      isLoading,\n      loadError,\n      saveError,\n      treeData,\n      activePath,\n      isSaving,\n    } = this.state as State;\n    const { groupSlug } = this.props;\n    return (\n      <div>\n        <PageTitle\n          title={I18n.t(\"js.administration.navigation_items.page_title\")}\n        />\n\n        <div className=\"btn-toolbar justify-end mb-4\">\n          <button\n            className=\"btn btn-success\"\n            type=\"submit\"\n            onClick={this.sendData}\n            disabled={isSaving}\n          >\n            {I18n.t(\"js.administration.navigation_items.edit.save\")}\n          </button>\n        </div>\n        {groupSlug ? <GroupNavigation groupSlug={groupSlug} /> : null}\n        {saveSuccess ? (\n          <Flash alert=\"success\">\n            {I18n.t(\"js.administration.navigation_items.edit.success\")}\n          </Flash>\n        ) : null}\n        {saveError ? (\n          <Flash alert=\"error\">\n            {I18n.t(\"js.administration.navigation_items.edit.error\")}\n          </Flash>\n        ) : null}\n        <div className=\"row\">\n          <div className=\"navigation-manager\">\n            {isLoading ? (\n              <p className=\"message\">\n                {I18n.t(\"js.administration.navigation_items.loading\")}\n              </p>\n            ) : loadError ? (\n              <p className=\"message error-message\">\n                {I18n.t(\n                  \"js.administration.navigation_items.error_while_loading\",\n                )}\n              </p>\n            ) : null}\n            <div className=\"navigation-column\" ref={this.treeRef}>\n              {!isEmpty(treeData) ? (\n                <SortableTree\n                  treeData={treeData}\n                  isVirtualized={false}\n                  maxDepth={2}\n                  canDrop={canDrop}\n                  onChange={this.onChangeTree}\n                  onMoveNode={this.onMoveNode}\n                  generateNodeProps={({ node, path }) => ({\n                    onClick: () => {\n                      this.setState({\n                        activePath: path,\n                      });\n                    },\n                    className: classNames(\n                      {\n                        \"selected move-item\": isEqual(activePath, path),\n                        \"not-empty-field\": isValidNode(node) || isSaving,\n                        \"empty-field\": !isValidNode(node) && !isSaving,\n                      },\n                      \"content-item\",\n                    ),\n                    title: node.text,\n                    buttons: this.itemButtons(path),\n                  })}\n                />\n              ) : null}\n              {!isLoading && !loadError ? (\n                <button\n                  className=\"btn btn-primary add-new-item-button\"\n                  onClick={this.addNodeAt([])}\n                >\n                  <i className=\"fa fa-plus\" />\n                  {I18n.t(\"js.administration.navigation_items.edit.add_link\")}\n                </button>\n              ) : null}\n            </div>\n            <div className=\"input-column\">\n              {!isEmpty(activePath) ? (\n                <NavigationManagerForm\n                  node={this.getActiveNode()}\n                  groupSlug={groupSlug}\n                  items={items}\n                  onChangeNode={this.onChangeActiveNode}\n                />\n              ) : null}\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default NavigationManager;\n","import { DragSource, DropTarget } from \"react-dnd\";\nimport React, { Component, createRef } from \"react\";\nimport flow from \"lodash/flow\";\nimport classNames from \"classnames\";\n\nconst cardSource = {\n  beginDrag(props) {\n    return {\n      id: props.id,\n      index: props.index,\n    };\n  },\n};\n\nconst cardTarget = {\n  hover(props, monitor, component) {\n    const dragIndex = monitor.getItem().index;\n    const hoverIndex = props.index;\n\n    // Don't replace items with themselves\n    if (dragIndex === hoverIndex) {\n      return;\n    }\n\n    // Determine rectangle on screen\n    const hoverBoundingRect =\n      component.hoverRef.current.getBoundingClientRect();\n\n    // Get vertical middle\n    const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n\n    // Determine mouse position\n    const clientOffset = monitor.getClientOffset();\n\n    // Get pixels to the top\n    const hoverClientY = clientOffset.y - hoverBoundingRect.top;\n\n    // Only perform the move when the mouse has crossed half of the items height\n    // When dragging downwards, only move when the cursor is below 50%\n    // When dragging upwards, only move when the cursor is above 50%\n\n    // Dragging downwards\n    if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) {\n      return;\n    }\n\n    // Dragging upwards\n    if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {\n      return;\n    }\n\n    props.moveCard(dragIndex, hoverIndex);\n    monitor.getItem().index = hoverIndex;\n  },\n};\n\ninterface CardTypes {\n  connectDragSource(...args: unknown[]): unknown;\n  connectDropTarget(...args: unknown[]): unknown;\n  index: number;\n  isDragging: boolean;\n  id: string;\n  text: string;\n  customBackgroundColor?: string;\n  moveCard(...args: unknown[]): unknown;\n}\n\nclass Card extends Component<CardTypes> {\n  hoverRef: React.RefObject<HTMLLIElement>;\n\n  constructor(props: CardTypes) {\n    super(props);\n    this.hoverRef = createRef();\n  }\n\n  render() {\n    const {\n      text,\n      isDragging,\n      customBackgroundColor,\n      connectDragSource,\n      connectDropTarget,\n    } = this.props;\n\n    return connectDragSource(\n      connectDropTarget(\n        <li\n          className={classNames(\n            \"group-category-sorter border-box p-3 cursor-pointer\",\n            {\n              \"drag-card\": isDragging,\n            },\n          )}\n          ref={this.hoverRef}\n        >\n          <i\n            className=\"fa-regular fa-ellipsis-vertical fa-lg pr-3 text-neutral\"\n            aria-hidden=\"true\"\n          />\n          <span\n            style={{\n              color: customBackgroundColor ? customBackgroundColor : undefined,\n            }}\n          >\n            {text}\n          </span>\n        </li>,\n      ),\n    ) as React.ReactNode;\n  }\n}\n\nexport default flow([\n  DragSource(\"card\", cardSource, (connect, monitor) => ({\n    connectDragSource: connect.dragSource(),\n    isDragging: monitor.isDragging(),\n  })),\n  DropTarget(\"card\", cardTarget, (connect) => ({\n    connectDropTarget: connect.dropTarget(),\n  })),\n])(Card);\n","import React, { useState } from \"react\";\nimport { DragDropContext } from \"react-dnd\";\nimport { useSelector } from \"react-redux\";\nimport HTML5Backend from \"react-dnd-html5-backend\";\nimport { pick, sortBy } from \"lodash\";\n\nimport Flash from \"../shared/Flash\";\nimport PageTitle from \"../layout/PageTitle\";\nimport Card from \"./groupCategorySorter/Card\";\nimport \"./groupCategorySorter.css\";\nimport { State } from \"../../@types\";\n\nfunction GroupCategorySorter() {\n  const groupCategories = useSelector((state: State) =>\n    state.network.group_categories.map((model) =>\n      pick(model, \"plural_name\", \"id\", \"color\", \"order\", \"slug\"),\n    ),\n  );\n  const [state, setState] = useState({\n    cards: sortBy(groupCategories, \"order\"),\n    isSaving: false,\n    saveSuccess: false,\n    saveError: false,\n  });\n\n  async function sendData() {\n    setState((curr) => ({\n      ...curr,\n      isSaving: true,\n      saveError: false,\n      saveSuccess: false,\n    }));\n\n    const response = await fetch(\"/administration/group-categories/order\", {\n      method: \"PUT\",\n      headers: { \"Content-Type\": \"application/json\" },\n      credentials: \"include\",\n      body: JSON.stringify({\n        order: state.cards.map((x) => x.slug),\n      }),\n    });\n\n    response.status == 204\n      ? setState((curr) => ({ ...curr, isSaving: false, saveSuccess: true }))\n      : setState((curr) => ({ ...curr, isSaving: false, saveError: true }));\n  }\n\n  function moveCard(dragIndex, hoverIndex) {\n    const dragCard = state.cards[dragIndex];\n    const newCards = [...state.cards];\n    newCards.splice(dragIndex, 1);\n    newCards.splice(hoverIndex, 0, dragCard);\n    setState((curr) => ({ ...curr, cards: newCards }));\n  }\n\n  return (\n    <div>\n      <PageTitle\n        title={I18n.t(\n          \"js.administration.group_manager.categories_order_edit.title\",\n        )}\n      />\n\n      <div className=\"btn-toolbar mb-6\">\n        <a\n          className=\"btn btn-light\"\n          href=\"#\"\n          onClick={(e) => {\n            e.preventDefault();\n            window.history.back();\n          }}\n        >\n          <i className=\"fa-regular fa-arrow-left\" />\n        </a>\n        <a\n          className=\"btn btn-primary\"\n          href=\"/administration/group-categories/new\"\n        >\n          {I18n.t(\"js.administration.group_manager.new_category\")}\n        </a>\n      </div>\n\n      {state.saveSuccess ? (\n        <Flash alert=\"success\">\n          {I18n.t(\n            \"js.administration.group_manager.categories_order_edit.success\",\n          )}\n        </Flash>\n      ) : null}\n      {state.saveError ? (\n        <Flash alert=\"error\">\n          {I18n.t(\n            \"js.administration.group_manager.categories_order_edit.error\",\n          )}\n        </Flash>\n      ) : null}\n      <div className=\"boxed-form-fields form-horizontal group-category-sorter\">\n        <p className=\"text-sm\">\n          {I18n.t(\"js.administration.group_manager.categories_order_edit.help\")}\n        </p>\n        <div className=\"sortable-region\">\n          <ul className=\"sortable-view unstyled flex flex-col gap-2\">\n            {state.cards.map((category, i) => (\n              <Card\n                key={category.id}\n                index={i}\n                id={category.id}\n                text={category.plural_name}\n                moveCard={moveCard}\n                customBackgroundColor={category.color}\n              />\n            ))}\n          </ul>\n        </div>\n      </div>\n\n      <fieldset className=\"actions flex justify-end gap-2 mt-4\">\n        <a className=\"btn btn-light\" href=\"/administration/groups\">\n          {I18n.t(\"js.cancel\")}\n        </a>\n        <button\n          className=\"btn btn-primary\"\n          onClick={sendData}\n          disabled={state.isSaving}\n        >\n          {I18n.t(\"js.administration.group_manager.categories_order_edit.save\")}\n        </button>\n      </fieldset>\n    </div>\n  );\n}\n\n// getting the data from the Backbone Model because Card colors\n// do not get directly saved to the store, when editing/creating a category\n// store alternative : groupCategories: state.network.group_categories\nexport default DragDropContext(HTML5Backend)(GroupCategorySorter);\n","import { createApiAction } from \"helpers/api\";\n\nexport const createMembership = createApiAction({\n  method: \"POST\",\n  endpoint: () => `/administration/members`,\n  baseType: `administration/CREATE_MEMBERSHIP`,\n});\n\nexport const updateMembership = createApiAction({\n  method: \"PUT\",\n  endpoint: ({ membershipId }) => `/administration/members/${membershipId}`,\n  baseType: `administration/UPDATE_MEMBERSHIP`,\n});\n","import React from \"react\";\nimport { useStore, useSelector } from \"react-redux\";\nimport { SubmissionError } from \"redux-form\";\nimport { get } from \"lodash\";\nimport MembershipForm from \"components/memberships/MembershipForm\";\nimport persistItem from \"helpers/items/persistItem\";\nimport { selectNetworkId } from \"selectors/environment\";\nimport { updateMembership } from \"actions/administration/memberships\";\nimport ControlGroup from \"../shared/fields/ControlGroup\";\nimport SimpleInput from \"components/appCreator/items/form/SimpleInput\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { useMembershipProfile } from \"./api\";\nimport { useLoadApp } from \"components/appCreator/api\";\n\ntype MemberEditFieldsProps = {\n  membershipId?: string;\n};\n\nfunction MemberEditFields({ membershipId }: MemberEditFieldsProps) {\n  const { data: membership, isLoading: loading } =\n    useMembershipProfile(membershipId);\n\n  return (\n    <ControlGroup\n      name=\"membership_email\"\n      label={I18n.t(\"js.administration.members.new.email\")}\n      htmlFor=\"membership-email\"\n    >\n      {loading ? (\n        <i className=\"fa fa-spin fa-spinner\" />\n      ) : (\n        <SimpleInput\n          meta={{}}\n          input={{\n            type: \"text\",\n            name: \"membership_email\",\n            id: \"membership-email\",\n            value: get(membership, [\"email\"]),\n            disabled: true,\n          }}\n        />\n      )}\n    </ControlGroup>\n  );\n}\n\nfunction MembershipEdit() {\n  const { membershipId } = useParams();\n  const networkId = useSelector(selectNetworkId);\n  const externalAppId = `profile:${networkId}`;\n  const externalItemId = membershipId;\n  const store = useStore();\n  const { data: app } = useLoadApp({\n    appId: undefined,\n    externalAppId,\n  });\n\n  const onSubmit = async (values, dispatch) => {\n    await persistItem(app, store.dispatch, {\n      externalAppId,\n      externalItemId,\n      values,\n    });\n\n    const membershipResult = await dispatch(updateMembership({ membershipId }));\n    if (membershipResult.error)\n      throw new SubmissionError(membershipResult.error);\n  };\n\n  const onSubmitSuccess = () => {\n    location.replace(`/administration/members`);\n    toastr.success(I18n.t(\"js.saving_successful\"));\n  };\n\n  return (\n    <MembershipForm\n      key={membershipId}\n      externalAppId={externalAppId}\n      externalItemId={externalItemId}\n      onSubmit={onSubmit}\n      renderExtraFields={() => <MemberEditFields membershipId={membershipId} />}\n      onSubmitSuccess={onSubmitSuccess}\n      title={I18n.t(\"js.administration.members.edit.page_title\")}\n    />\n  );\n}\n\nexport default MembershipEdit;\n","import React, { Fragment } from \"react\";\nimport { useStore, useSelector } from \"react-redux\";\nimport { Field, SubmissionError, formValues } from \"redux-form\";\nimport { selectNetworkId } from \"selectors/environment\";\nimport { createMembership } from \"actions/administration/memberships\";\nimport persistItem from \"helpers/items/persistItem\";\nimport MembershipForm from \"components/memberships/MembershipForm\";\nimport ControlGroup from \"../shared/fields/ControlGroup\";\nimport Hint from \"../shared/fields/Hint\";\nimport EmailField from \"../appCreator/properties/edit/EmailField\";\nimport CheckboxField from \"../shared/fields/CheckboxField\";\nimport { useLoadApp } from \"components/appCreator/api\";\n\nconst MemberCreateFields = formValues(\"send_welcome_mail\")((props) => {\n  const { send_welcome_mail } = props as React.PropsWithChildren<\n    { send_welcome_mail?: boolean } & string\n  >;\n  return (\n    <Fragment>\n      <Hint hint={I18n.t(\"js.administration.members.new.hint\")} />\n\n      <ControlGroup\n        name=\"email\"\n        label={I18n.t(\"js.administration.members.new.email\")}\n        htmlFor=\"new-membership-email\"\n        required\n      >\n        <EmailField name=\"email\" id=\"new-membership-email\" required />\n      </ControlGroup>\n\n      <ControlGroup>\n        <CheckboxField\n          name=\"send_welcome_mail\"\n          label={I18n.t(\"js.administration.members.new.user_chooses_pwd\")}\n        />\n        <Hint hint={I18n.t(\"js.administration.members.new.help\")} />\n      </ControlGroup>\n\n      {!send_welcome_mail ? (\n        <ControlGroup\n          name=\"password\"\n          label={I18n.t(\"js.administration.members.new.password\")}\n          htmlFor=\"new-membership-email\"\n          required\n        >\n          <Field\n            name=\"password\"\n            id=\"new-membership-password\"\n            type=\"password\"\n            component=\"input\"\n            required\n          />\n        </ControlGroup>\n      ) : null}\n      <hr />\n    </Fragment>\n  );\n}) as React.ComponentClass<unknown>;\n\nfunction MembershipNew() {\n  const networkId = useSelector(selectNetworkId);\n  const externalAppId = `profile:${networkId}`;\n  const store = useStore();\n  const { data: app } = useLoadApp({\n    appId: undefined,\n    externalAppId,\n  });\n\n  const onSubmit = async (values, dispatch) => {\n    const { email, password, send_welcome_mail, ...profile } = values;\n    const { id: itemId } = await persistItem(app, store.dispatch, {\n      externalAppId,\n      values: profile,\n    });\n\n    const membershipResult = await dispatch(\n      createMembership({\n        body: {\n          user: {\n            email,\n            password,\n            send_welcome_mail,\n            profile_id: itemId,\n          },\n        },\n      }),\n    );\n    if (membershipResult.error)\n      throw new SubmissionError(membershipResult.error);\n  };\n\n  const onSubmitSuccess = () => {\n    location.replace(`/administration/members`);\n    toastr.success(I18n.t(\"js.saving_successful\"));\n  };\n\n  return (\n    <MembershipForm\n      externalAppId={externalAppId}\n      onSubmit={onSubmit}\n      onSubmitSuccess={onSubmitSuccess}\n      title={I18n.t(\"js.administration.members.new.page_title\")}\n      renderExtraFields={() => <MemberCreateFields />}\n      initialValues={{ send_welcome_mail: true }}\n    />\n  );\n}\n\nexport default MembershipNew;\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { change } from \"redux-form\";\nimport ReduxForm from \"components/shared/reduxForm\";\nimport TextField from \"../../shared/fields/TextField\";\nimport MarkdownEditorAdapter from \"../../shared/markdownEditor/MarkdownEditorAdapter\";\nimport ControlGroup from \"../../shared/fields/ControlGroup\";\nimport { Field } from \"redux-form\";\nimport { replace } from \"lodash\";\n\ninterface LegalTextFormTypes {\n  onSubmit(...args: unknown[]): unknown;\n\n  initialValues?: Record<PropertyKey, unknown>;\n  name?: string;\n  statement?: string;\n  handle?: string;\n  isEditing?: boolean;\n\n  updateField?(...args: unknown[]): unknown;\n}\n\nfunction LegalTextForm({\n  onSubmit,\n  initialValues,\n  isEditing,\n  updateField,\n}: LegalTextFormTypes) {\n  return (\n    <ReduxForm\n      form=\"editLegalText\"\n      className={\"form-horizontal\"}\n      initialValues={initialValues}\n      onSubmit={onSubmit}\n      allowSaveWithoutChange={false}\n    >\n      <TextField\n        label={I18n.t(\"js.administration.legal_texts.edit.name\")}\n        name=\"name\"\n        onChange={isEditing ? undefined : updateField}\n        required\n      />\n      <TextField\n        label={I18n.t(\"js.administration.legal_texts.edit.statement\")}\n        name=\"statement\"\n        hint={I18n.t(\"js.administration.legal_texts.edit.statement_hint_md\")}\n        required\n      />\n      <TextField\n        label={I18n.t(\"js.administration.legal_texts.edit.handle\")}\n        name=\"handle\"\n        disabled={isEditing}\n        hint={I18n.t(\"js.administration.legal_texts.edit.handle_hint_md\")}\n        required\n      />\n      <ControlGroup\n        name=\"text\"\n        label={I18n.t(\"js.administration.legal_texts.edit.legal_text\")}\n        className=\"text-property\"\n        required\n      >\n        <Field component={MarkdownEditorAdapter} name=\"text\" />\n      </ControlGroup>\n    </ReduxForm>\n  );\n}\n\nexport default connect(null, {\n  updateField: (_, data) =>\n    change(\n      \"editLegalText\",\n      \"handle\",\n      replace(data, /[^a-zA-Z0-9\\- ]/g, \"\")\n        .replace(/ +/g, \"-\")\n        .toLowerCase(),\n    ),\n})(LegalTextForm);\n","import React from \"react\";\nimport { isEmpty, get } from \"lodash\";\nimport LegalTextForm from \"components/administration/legalTexts/LegalTextForm\";\nimport { useUpdateLegalText, useLegalText } from \"./api\";\nimport PageTitle from \"../../layout/PageTitle\";\nimport { useNavigate, useParams } from \"helpers/tixxt-router\";\n\nfunction LegalTextEdit() {\n  const { legalTextId } = useParams();\n  const navigate = useNavigate();\n  const { isLoading: loading, data: legalText } = useLegalText(legalTextId);\n  const { mutate: updateLegalText } = useUpdateLegalText({\n    onSuccess: () => {\n      navigate(`/administration/legal_texts`);\n      navigate(0);\n      toastr.success(I18n.t(\"js.saving_successful\"));\n    },\n    onError: () => {\n      toastr.error(I18n.t(\"js.saving_failure\"));\n    },\n  });\n\n  return (\n    <>\n      <PageTitle\n        title={I18n.t(\"js.administration.legal_texts.edit.title\", {\n          name: get(legalText, \"name\", \"\"),\n        })}\n      />\n      <div className=\"btn-toolbar mb-10\">\n        <a\n          className=\"btn btn-light backButton\"\n          onClick={(e) => {\n            e.preventDefault();\n            navigate(`/administration/legal_texts`);\n          }}\n        >\n          <i className=\"fa fa-arrow-left\" />\n        </a>\n      </div>\n      <div className=\"\">\n        <div className=\"flex flex-col gap-4 mt-8\">\n          {loading || isEmpty(legalText) ? (\n            <div>\n              <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n            </div>\n          ) : (\n            <>\n              <div\n                className=\"alert alert-warning\"\n                dangerouslySetInnerHTML={{\n                  __html: Application.markdown(\n                    I18n.t(\"js.administration.legal_texts.edit.hint_md\"),\n                  ),\n                }}\n              />\n              <LegalTextForm\n                initialValues={legalText}\n                key={legalTextId}\n                onSubmit={(values) => updateLegalText(values)}\n                isEditing\n              />\n            </>\n          )}\n        </div>\n      </div>\n    </>\n  );\n}\n\nexport default LegalTextEdit;\n","import React from \"react\";\nimport { useNavigate } from \"helpers/tixxt-router\";\n\nimport LegalTextForm from \"components/administration/legalTexts/LegalTextForm\";\nimport { useCreateLegalText } from \"./api\";\nimport PageTitle from \"../../layout/PageTitle\";\n\nfunction LegalTextNew() {\n  const navigate = useNavigate();\n  const { mutate: createLegalText } = useCreateLegalText({\n    onSuccess: () => {\n      navigate(`/administration/legal_texts`);\n      navigate(0);\n      toastr.success(I18n.t(\"js.saving_successful\"));\n    },\n    onError: () => {\n      toastr.error(I18n.t(\"js.saving_failure\"));\n    },\n  });\n\n  return (\n    <>\n      <PageTitle title={I18n.t(\"js.administration.legal_texts.new.title\")} />\n      <div className=\"btn-toolbar mb-10\">\n        <a\n          className=\"btn btn-light backButton\"\n          href=\"#\"\n          onClick={(e) => {\n            e.preventDefault();\n            navigate(`/administration/legal_texts`);\n          }}\n        >\n          <i className=\"fa fa-arrow-left\" />\n        </a>\n      </div>\n      <div className=\"row\">\n        <div className=\"span10\">\n          <LegalTextForm\n            onSubmit={(values) => createLegalText(values)}\n            isEditing={false}\n          />\n        </div>\n      </div>\n    </>\n  );\n}\n\nexport default LegalTextNew;\n","import React from \"react\";\nimport moment from \"moment-timezone\";\nimport { get } from \"lodash\";\nimport classnames from \"classnames\";\n\ninterface LegalTextVersionTypes {\n  onClick?(...args: unknown[]): unknown;\n\n  isOpened?: boolean;\n  isCurrent?: boolean;\n  version?: {\n    created_at?: string;\n    text?: string;\n  };\n}\n\nfunction LegalTextVersion({\n  version,\n  isCurrent,\n  isOpened,\n  onClick,\n}: LegalTextVersionTypes) {\n  return (\n    <div className=\"accordion-group\">\n      <div className=\"accordion-heading\">\n        <a className=\"accordion-toggle\" onClick={onClick} href=\"#\">\n          {I18n.t(\"js.administration.legal_texts.last_updated_at\", {\n            last_updated_at: moment(get(version, \"created_at\")).format(\n              I18n.t(\"plugins.Locale.Formats.valid_datetime\"),\n            ),\n          })}{\" \"}\n          {isCurrent\n            ? I18n.t(\"js.administration.legal_text.currently_used\")\n            : null}\n        </a>\n      </div>\n      <div\n        className={classnames(\"accordion-body\", {\n          collapse: !isOpened,\n        })}\n      >\n        <div\n          className=\"accordion-inner pt-4\"\n          dangerouslySetInnerHTML={{\n            __html: get(version, \"html_text\") || \"\",\n          }}\n        />\n      </div>\n    </div>\n  );\n}\n\nexport default LegalTextVersion;\n","import React, { Fragment, useState } from \"react\";\nimport { isEmpty, map, get } from \"lodash\";\nimport { useParams } from \"helpers/tixxt-router\";\n\nimport PageTitle from \"../../layout/PageTitle\";\nimport LegalTextVersion from \"./LegalTextVersion\";\nimport { useLegalText } from \"./api\";\n\nfunction LegalTextVersions() {\n  const { legalTextId } = useParams();\n\n  const { isLoading: loading, data: legalText } = useLegalText(legalTextId);\n\n  const [openedText, setOpenedText] = useState(0);\n\n  return (\n    <Fragment>\n      <PageTitle title={I18n.t(\"js.administration.legal_texts.versions\")} />\n      <div className=\"btn-toolbar\">\n        <button\n          className=\"btn btn-light backButton\"\n          onClick={(e) => {\n            e.preventDefault();\n            Backbone.history.navigate(`/administration/legal_texts`, {\n              trigger: true,\n            });\n          }}\n        >\n          <i className=\"fa fa-arrow-left\" />\n        </button>\n      </div>\n      {loading || isEmpty(legalText) ? (\n        <div>\n          <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.loading\")}\n        </div>\n      ) : (\n        <Fragment>\n          <div id=\"legal-texts\" className=\"accordion\">\n            {map(get(legalText, \"versions\"), (version, index: number) => (\n              <LegalTextVersion\n                version={version}\n                isCurrent={index === 0}\n                isOpened={openedText === index}\n                onClick={(e: MouseEvent) => {\n                  e.preventDefault();\n                  setOpenedText(index);\n                }}\n              />\n            ))}\n          </div>\n        </Fragment>\n      )}\n    </Fragment>\n  );\n}\n\nexport default LegalTextVersions;\n","import { createApiAction } from \"helpers/api\";\n\nexport const updateAppNavigation = createApiAction({\n  method: \"PUT\",\n  endpoint: () => \"/administration/app_navigation\",\n  baseType: \"ADMINISTRATION/APP_NAVIGATION/UPDATE\",\n});\n","import { useQuery, useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nimport {\n  AppNavigationItemsResponse,\n  Item,\n  Pages,\n} from \"../../@types/appNavigation\";\nimport { updateAppNavigation } from \"actions/administration/appNavigation\";\nimport { useDispatch } from \"react-redux\";\n\nexport function useAppNavigationItems() {\n  return useQuery<AppNavigationItemsResponse, Error>(\n    [\"appNavigationItems\"],\n    () => fetchApi(\"/administration/app_navigation.json\"),\n  );\n}\n\nexport function usePages() {\n  return useQuery<Pages, Error>([\"pages\"], () =>\n    fetchApi(\"/administration/pages.json\"),\n  );\n}\n\nexport function useUpdateAppNavigation() {\n  const dispatch = useDispatch();\n  const dispatchUpdateAppNavigation: (meta) => Promise<any> = (meta: {\n    body: { items: Item[] };\n  }) => dispatch(updateAppNavigation(meta));\n\n  return useMutation(dispatchUpdateAppNavigation, {\n    onSuccess: (data) => {\n      if (data.error) {\n        toastr.error(I18n.t(\"js.saving_failure\"));\n      } else {\n        toastr.success(I18n.t(\"js.saving_successful\"));\n      }\n    },\n  });\n}\n\nexport { useActivitystreams, type Activitystream } from \"api/activitystreams\";\n","import React, { useEffect, useState } from \"react\";\nimport { find, map } from \"lodash\";\nimport { Item } from \"../../../../../@types/appNavigation\";\n\ntype Props = {\n  unusedDefaults: Item[];\n  onChange: (item: Item) => void;\n  changedToDefault?: boolean;\n} & Item;\n\nfunction Default({\n  unusedDefaults,\n  onChange,\n  changedToDefault = false,\n  ...item\n}: Props) {\n  const defaults =\n    item && item?.isDefault ? [item, ...unusedDefaults] : unusedDefaults;\n  const [selected, select] = useState<Item | undefined>(\n    item?.isDefault && !changedToDefault ? item : defaults[0],\n  );\n\n  useEffect(() => {\n    selected && onChange(selected);\n  }, []);\n\n  return (\n    <select\n      className=\"input-text\"\n      name=\"default\"\n      onChange={(e) => {\n        const item = find(defaults, { id: e.target.value });\n\n        if (item) {\n          select(item);\n          onChange(item);\n        }\n      }}\n      value={selected?.id}\n    >\n      {map(defaults, (item: Item) => (\n        <option value={item.id} key={item.id}>\n          {item.label}\n        </option>\n      ))}\n    </select>\n  );\n}\n\nexport default Default;\n","import React, { useState, useEffect } from \"react\";\nimport { LinkOptions } from \"../../../../../@types/appNavigation\";\nimport classNames from \"classnames\";\n\ntype Props = {\n  options: LinkOptions;\n  onChange: (props: { options: LinkOptions }) => void;\n};\n\nfunction Link({ options, onChange }: Props) {\n  const [openIn, setOpenIn] = useState<\"browser\" | \"webview\">(\n    options?.open_in || \"webview\",\n  );\n  const [link, setLink] = useState(options?.url || \"\");\n  const [isInvalidUrl, setIsInvalidUrl] = useState(false);\n  const [openInDisabled, setOpenInDisabled] = useState(false);\n\n  useEffect(() => {\n    onChange({ options: { url: link, open_in: openIn } });\n  }, [openIn, link]);\n\n  function onLinkChange(value: string) {\n    setLink(value);\n\n    try {\n      const url = new URL(value);\n\n      setIsInvalidUrl(false);\n\n      if (url.host === location.host) {\n        setOpenInDisabled(true);\n        setOpenIn(\"webview\");\n      } else setOpenInDisabled(false);\n    } catch (error) {\n      setIsInvalidUrl(true);\n    }\n  }\n\n  return (\n    <>\n      <label>\n        {I18n.t(\"js.administration.app_navigation_items.edit.link_url_label\")}\n      </label>\n      <input\n        className=\"input-text\"\n        value={options.url}\n        onChange={(e) => onLinkChange(e.target.value)}\n      />\n      {isInvalidUrl && (\n        <div className=\"text-danger text-sm\">\n          {I18n.t(\n            \"js.administration.app_navigation_items.edit.link_invalid_hint\",\n          )}\n        </div>\n      )}\n      <label\n        className={classNames(\"checkbox\", {\n          \"text-muted\": openInDisabled || isInvalidUrl,\n        })}\n      >\n        <input\n          type=\"checkbox\"\n          name=\"entry_point\"\n          className=\"ml-3\"\n          checked={options?.open_in === \"browser\"}\n          onChange={(e) => setOpenIn(e.target.checked ? \"browser\" : \"webview\")}\n          disabled={openInDisabled || isInvalidUrl}\n        />\n        {I18n.t(\n          \"js.administration.app_navigation_items.edit.link_open_in_browser\",\n        )}\n      </label>\n      {openInDisabled && !isInvalidUrl && (\n        <div className=\"help-block mt-1\">\n          {I18n.t(\n            \"js.administration.app_navigation_items.edit.link_intern_hint\",\n          )}\n        </div>\n      )}\n    </>\n  );\n}\n\nexport default Link;\n","// extracted by mini-css-extract-plugin\nexport default {\"iconSelectionContainer\":\"jMVuPyzwR8w63yAABSoQ\",\"iconButton\":\"fv5lxkjnT8wfDy39Co0P\",\"active\":\"YKciGnDIOIhCjBEhI24K\",\"icon\":\"cbCewtlQBVX4dgMFOsdQ\"};","import React, { useEffect, useState } from \"react\";\nimport classnames from \"classnames\";\nimport { map } from \"lodash\";\n\nimport styles from \"./iconSelection.module.css\";\n\nexport const ICONS = {\n  globe: \"fa fa-globe\",\n  \"envelope-o\": \"fa-regular fa-envelope\",\n  \"comments-o\": \"fa-regular fa-comments\",\n  calendar: \"fa fa-calendar\",\n  \"folder-open-o\": \"fa-regular fa-folder-open\",\n  \"list-alt\": \"fa fa-list-alt\",\n  \"file-o\": \"fa-regular fa-file\",\n  cog: \"fa fa-cog\",\n  link: \"fa fa-link\",\n  \"external-link\": \"fa fa-external-link\",\n  \"user-circle-o\": \"fa-regular fa-user-circle\",\n  users: \"fa fa-users\",\n  \"folder-o\": \"fa-regular fa-folder\",\n  \"file-text-o\": \"fa-regular fa-file-text\",\n  columns: \"fa fa-columns\",\n  paperclip: \"fa fa-paperclip\",\n  book: \"fa fa-book\",\n  bullhorn: \"fa fa-bullhorn\",\n  certificate: \"fa fa-certificate\",\n  \"bookmark-o\": \"fa-regular fa-bookmark\",\n  flag: \"fa fa-flag\",\n  \"handshake-o\": \"fa-regular fa-handshake\",\n};\n\ntype Props = {\n  icon: string;\n  changeIcon: (icon: string) => void;\n  disabled: boolean;\n};\n\nfunction IconSelection({ icon, changeIcon, disabled }: Props) {\n  const [selectedIcon, selectIcon] = useState(icon);\n\n  // update icon if its changed from e.g. changing the link type\n  useEffect(() => {\n    selectIcon(icon);\n  }, [icon]);\n\n  return (\n    <>\n      <label>\n        {I18n.t(\"js.administration.app_navigation_items.edit.icon\")}\n      </label>\n      <div className={styles.iconSelectionContainer}>\n        {map(ICONS, (iconClass, iconName) => (\n          <button\n            className={classnames(\"btn\", styles.iconButton, {\n              active: selectedIcon == iconName,\n            })}\n            disabled={disabled}\n            onClick={(e) => {\n              e.preventDefault();\n              selectIcon(iconName);\n              changeIcon(iconName);\n            }}\n            key={iconName}\n          >\n            <i className={classnames(iconClass, styles.icon)} />\n          </button>\n        ))}\n      </div>\n    </>\n  );\n}\n\nexport default IconSelection;\n","import React, { useEffect, useState } from \"react\";\nimport { map, isEmpty } from \"lodash\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { usePages } from \"../../../../hooks/administration/appNavigation\";\n\nconst OPTIONS = {\n  link: {\n    label: \"js.administration.navigation_items.link.option_label\",\n    type: \"link\",\n    icon: \"link\",\n  },\n  activitystream: {\n    label: \"js.administration.app_navigation_items.edit.activity_stream\",\n    type: \"activitystream\",\n    icon: \"globe\",\n  },\n  page: {\n    label: \"js.administration.app_navigation_items.edit.page\",\n    type: \"page\",\n    icon: \"file-o\",\n  },\n  default: {\n    label: \"js.administration.app_navigation_items.edit.default_module\",\n    type: \"default\",\n    icon: \"globe\",\n  },\n};\n\ntype Props = {\n  isDefault: boolean;\n  type: string;\n  changeType: (props: {\n    id: string;\n    type: string;\n    icon: string;\n    isDefault: boolean;\n    changedToDefault: boolean;\n  }) => void;\n};\n\nfunction TypeSelector({ isDefault, type, changeType }: Props) {\n  const [selectedOption, selectOption] = useState(isDefault ? \"default\" : type);\n  const { data: pages } = usePages();\n\n  useEffect(() => {\n    selectOption(isDefault ? \"default\" : type);\n  }, [type]);\n\n  return (\n    <>\n      <label>\n        {I18n.t(\n          \"js.administration.app_navigation_items.edit.target_link_label\",\n        )}\n      </label>\n      <select\n        className=\"input-text\"\n        name=\"type\"\n        onChange={(e) => {\n          const newType = e.target.value;\n          const newItem = {\n            id: uuidv4(),\n            type: newType,\n            icon: OPTIONS[newType].icon,\n            isDefault: false,\n          };\n\n          selectOption(newType);\n          changeType({\n            ...newItem,\n            changedToDefault: type !== \"default\" && newType === \"default\",\n          });\n        }}\n        value={OPTIONS[selectedOption]?.type}\n      >\n        {map(OPTIONS, (option) => {\n          if (option.type === \"page\" && isEmpty(pages)) return null;\n          return (\n            <option value={option.type} key={option.type}>\n              {I18n.t(option.label)}\n            </option>\n          );\n        })}\n      </select>\n    </>\n  );\n}\n\nexport default TypeSelector;\n","import React, { useEffect, useState } from \"react\";\n\nimport More from \"./form/types/More\";\nimport Default from \"./form/types/Default\";\nimport Link from \"./form/types/Link\";\nimport IconSelection from \"./IconSelection\";\nimport TypeSelector from \"./form/TypeSelector\";\nimport Page from \"./form/types/Page\";\nimport { Item } from \"../../../@types/appNavigation\";\nimport Activitystream from \"./form/types/Activitystream\";\nimport { TreeItem } from \"react-sortable-tree\";\n\ntype TypeComponentLookup = {\n  [moduleName: string]: ((any) => JSX.Element) | undefined;\n};\nconst TYPE_LOOKUP: TypeComponentLookup = {\n  more: More,\n  files: Default,\n  messages: Default,\n  appointments: Default,\n  pages: Default,\n  activitystreams: Default,\n  search: Default,\n  directory: Default,\n  settings: Default,\n  link: Link,\n  page: Page,\n  activitystream: Activitystream,\n  default: Default,\n};\n\ntype Props = {\n  item: TreeItem & {\n    changedToDefault?: boolean;\n    type: any;\n    options: { items: (TreeItem | Item)[] };\n  };\n  unusedDefaults: (TreeItem | Item)[];\n  changeActiveNode: (item: TreeItem) => void;\n  changeEntryPoint: (item: TreeItem, checked: boolean) => void;\n};\n\nfunction ItemForm({\n  item,\n  unusedDefaults,\n  changeActiveNode,\n  changeEntryPoint,\n}: Props) {\n  const TypeForm = TYPE_LOOKUP[item.type] || Default;\n  const [entryPoint, setEntryPoint] = useState(item?.isEntryPoint || false);\n\n  useEffect(() => {\n    setEntryPoint(item?.isEntryPoint || false);\n  }, [item]);\n\n  return item ? (\n    <div className=\"navigation-manager-form\">\n      <form>\n        {item.type != \"more\" && (\n          <TypeSelector\n            type={item.type}\n            isDefault={item.isDefault}\n            changeType={(changedItem) => {\n              changeActiveNode({\n                ...item,\n                ...changedItem,\n              });\n            }}\n          />\n        )}\n        <TypeForm\n          {...item}\n          unusedDefaults={unusedDefaults as any}\n          onChange={(props: any) => changeActiveNode({ ...item, ...props })}\n        />\n        <label>\n          {I18n.t(\"js.administration.app_navigation_items.edit.title\")}\n        </label>\n        <input\n          className=\"input-text\"\n          value={item.label}\n          disabled={item.isDefault}\n          onChange={(e) => changeActiveNode({ ...item, label: e.target.value })}\n        />\n        {item?.isDefault && (\n          <p>\n            {I18n.t(\"js.administration.app_navigation_items.edit.hint_no_edit\")}\n          </p>\n        )}\n        {!item?.isDefault && (\n          <IconSelection\n            icon={item.icon}\n            changeIcon={(icon: string) => changeActiveNode({ ...item, icon })}\n            disabled={item.isDefault}\n          />\n        )}\n        {item.type !== \"more\" && item.type !== \"link\" && (\n          <label className=\"checkbox\">\n            <input\n              type=\"checkbox\"\n              name=\"entry_point\"\n              checked={entryPoint}\n              onChange={(e) => {\n                setEntryPoint(e.target.checked);\n                changeEntryPoint(item, e.target.checked);\n              }}\n            />\n            {I18n.t(\"js.administration.app_navigation_items.edit.entry_point\")}\n          </label>\n        )}\n      </form>\n    </div>\n  ) : (\n    <p>{I18n.t(\"js.administration.app_navigation_items.edit.hint\")}</p>\n  );\n}\n\nexport default ItemForm;\n","import { map } from \"lodash\";\nimport React from \"react\";\nimport { MoreOptions } from \"../../../../../@types/appNavigation\";\n\nfunction More({ options }: { options?: MoreOptions }) {\n  return (\n    <div>\n      <p>{I18n.t(\"js.administration.app_navigation_items.edit.more.label\")}</p>\n      <ul>\n        {map(options?.items, (i) => (\n          <li key={i.id}>{i.label}</li>\n        ))}\n      </ul>\n      <p>{I18n.t(\"js.administration.app_navigation_items.edit.more.hint\")}</p>\n    </div>\n  );\n}\n\nexport default More;\n","import React, { useEffect, useState } from \"react\";\nimport { find, isEmpty, map } from \"lodash\";\nimport { usePages } from \"../../../../../hooks/administration/appNavigation\";\nimport {\n  Page as PageType,\n  PageOptions,\n} from \"../../../../../@types/appNavigation\";\n\ntype Props = {\n  options: PageOptions;\n  onChange: (props: { label: string; options: PageOptions }) => void;\n};\n\nfunction Page({ options, onChange }: Props) {\n  const { data: pages, isLoading } = usePages();\n  const [selectedPage, selectPage] = useState<PageType>(options?.page);\n\n  useEffect(() => {\n    if (pages && isEmpty(options?.page)) {\n      onChange({\n        label: pages[0].name,\n        options: { page: pages[0] },\n      });\n    }\n  }, [pages]);\n\n  return (\n    <>\n      {isLoading ? (\n        <p className=\"input-text\">\n          <i className=\"fa fa-spinner spin\" />{\" \"}\n          {I18n.t(\"js.administration.app_navigation_items.edit.loading_pages\")}\n        </p>\n      ) : (\n        <select\n          className=\"input-text\"\n          name=\"page\"\n          onChange={(e) => {\n            const page = find(pages, { slug: e.target.value });\n\n            if (page) {\n              selectPage(page);\n              onChange({\n                label: page.name,\n                options: { page },\n              });\n            }\n          }}\n          value={selectedPage?.slug}\n        >\n          {map(pages, (page: PageType) => (\n            <option value={page.slug} key={page.id}>\n              {page.name}\n            </option>\n          ))}\n        </select>\n      )}\n      <p>\n        {I18n.t(\"js.administration.app_navigation_items.edit.hint_group_page\")}\n      </p>\n    </>\n  );\n}\n\nexport default Page;\n","import React, { useEffect, useState } from \"react\";\nimport { filter, find, isEmpty, map } from \"lodash\";\n\nimport {\n  useActivitystreams,\n  type Activitystream as ActivitystreamType,\n} from \"../../../../../hooks/administration/appNavigation\";\n\ntype Props = {\n  options: { activitystream: ActivitystreamType };\n  onChange: (props: {\n    label: string;\n    options: { activitystream: ActivitystreamType };\n  }) => void;\n};\n\nfunction Activitystream({ options, onChange }: Props) {\n  const { data, isLoading } = useActivitystreams();\n  const streams = filter(\n    data,\n    (stream: ActivitystreamType) => stream?.slug !== \"all\",\n  );\n  const [selectedStream, selectStream] = useState<ActivitystreamType>(\n    options?.activitystream,\n  );\n\n  useEffect(() => {\n    if (streams && isEmpty(options?.activitystream)) {\n      onChange({\n        label: streams[0]?.name,\n        options: { activitystream: streams[0] },\n      });\n    }\n  }, [data]);\n\n  return (\n    <>\n      {isLoading ? (\n        <p className=\"input-text\">\n          <i className=\"fa fa-spinner spin\" />\n          {I18n.t(\n            \"js.administration.app_navigation_items.edit.loading_activitystreams\",\n          )}\n        </p>\n      ) : (\n        <select\n          className=\"input-text\"\n          name=\"stream\"\n          onChange={(e) => {\n            const activitystream = find(streams, {\n              slug: e.target.value,\n            });\n\n            if (activitystream) {\n              selectStream(activitystream);\n              onChange({\n                label: activitystream?.name,\n                options: { activitystream },\n              });\n            }\n          }}\n          value={selectedStream?.slug}\n        >\n          {map(streams, (stream: ActivitystreamType) => (\n            <option value={stream.slug} key={stream.slug}>\n              {stream.name}\n            </option>\n          ))}\n        </select>\n      )}\n      <p>\n        Hinweis: Wird ein Activity Stream einer Gruppe als Startseite gesetzt,\n        müssen alle Nutzer Mitglied dieser Gruppe sein, da sonst eine\n        Fehlermeldung bei Aufruf der Startseite erscheint.\n      </p>\n    </>\n  );\n}\n\nexport default Activitystream;\n","import { useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nexport type Activitystream = {\n  slug: string;\n  name: string;\n  group_slug?: string;\n  meta?: boolean;\n  can?: {\n    create?: boolean;\n    email_recommend_activity_internally?: boolean;\n    email_recommend_activity_externally?: boolean;\n    create_appointment_activity?: boolean;\n  };\n};\n\n/*\n * This hook is currently not used in activitystreams/Userbar to deduplicate the /activitystreams.json request\n * that is issued from app/assets/javascripts/activitystreams/index.js.coffee:23 too\n */\nexport function useActivitystreams() {\n  return useQuery<Activitystream[], Error>(\n    \"activitystreams\",\n    () => fetchApi(\"/activitystreams.json\"),\n    { staleTime: Infinity },\n  );\n}\n","import React from \"react\";\nimport { Item } from \"../../../@types/appNavigation\";\nimport { ICONS } from \"components/administration/appNavigationManager/IconSelection\";\n\nfunction NodeTitle({ node }: { node: Item }) {\n  return (\n    <div>\n      <i className={node.icon && ICONS[node.icon]} /> {node.label}{\" \"}\n      {node.isEntryPoint && <i className=\"fa fa-arrow-left entry-point\" />}\n    </div>\n  );\n}\n\nexport default NodeTitle;\n","import classNames from \"classnames\";\nimport {\n  findIndex,\n  isEmpty,\n  isEqual,\n  last,\n  map,\n  pullAllBy,\n  pullAt,\n} from \"lodash\";\nimport React, { useEffect, useState } from \"react\";\nimport SortableTree, {\n  changeNodeAtPath,\n  getNodeAtPath,\n  removeNodeAtPath,\n  TreeItem,\n} from \"react-sortable-tree\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport { Item, MoreItem } from \"../../../@types/appNavigation\";\nimport {\n  useAppNavigationItems,\n  useUpdateAppNavigation,\n} from \"../../../hooks/administration/appNavigation\";\nimport PageTitle from \"../../layout/PageTitle\";\nimport \"../navigationManager.css\";\nimport ItemButton from \"../navigationManager/ItemButton\";\nimport ItemForm from \"./ItemForm\";\nimport NodeTitle from \"./NodeTitle\";\n\nfunction AppNavigationManager() {\n  const { data, isLoading } = useAppNavigationItems();\n\n  const [more, setMore] = useState<MoreItem>({\n    options: { items: [] },\n    type: \"more\",\n  });\n  const [treeData, setTreeData] = useState<(TreeItem | Item)[]>([]);\n  const [activePath, setActivePath] = useState<(number | string)[]>([]);\n  const { mutate: updateItems, isLoading: isSaving } = useUpdateAppNavigation();\n\n  useEffect(() => {\n    if (!isEmpty(treeData)) return;\n    if (!data || isEmpty(data)) return;\n\n    setTreeData(data);\n\n    const moreCandidate = last(data);\n    if (moreCandidate?.type == \"more\") setMore(moreCandidate);\n  }, [data]);\n\n  function removeItemAt(\n    _e: unknown,\n    path: (string | number)[],\n    node: TreeItem,\n  ) {\n    setActivePath([]);\n    const newTreeData = removeNodeAtPath({\n      treeData: treeData,\n      path,\n      getNodeKey,\n    });\n\n    if (node.isEntryPoint) {\n      changeEntryPoint(node, false, newTreeData);\n    } else {\n      setTreeData(newTreeData);\n    }\n\n    moveItemToMore(node);\n  }\n\n  function changeActiveNode(newNode: TreeItem) {\n    const activeNode = getActiveNode();\n\n    if (activeNode?.id !== newNode.id) {\n      setActivePath([newNode.id]);\n\n      if (newNode.isDefault) {\n        removeItemFromMore(newNode);\n      }\n\n      if (activeNode?.isDefault) {\n        moveItemToMore(activeNode);\n      }\n    }\n\n    const newTreeData = changeNodeAtPath({\n      treeData,\n      path: activePath,\n      getNodeKey,\n      newNode,\n    });\n\n    if (activeNode?.isEntryPoint && newNode.type === \"link\") {\n      changeEntryPoint(activeNode, false, newTreeData);\n    } else {\n      // set entry point if none of the other items is\n      if (\n        findIndex(\n          newTreeData,\n          (data) => data.isEntryPoint && data.id !== newNode.id,\n        ) === -1\n      ) {\n        changeEntryPoint(newNode, true, newTreeData);\n      } else {\n        setTreeData(newTreeData);\n      }\n    }\n  }\n\n  function moveItemToMore(item: TreeItem) {\n    if (item?.isDefault) {\n      const newMore = more;\n      newMore.options.items.push({ ...item, isEntryPoint: false });\n\n      setMore(newMore);\n    }\n  }\n\n  function removeItemFromMore(item: TreeItem) {\n    const newMore = more;\n\n    pullAllBy(newMore.options.items, [{ id: item.id }], \"id\");\n\n    setMore(newMore);\n  }\n\n  function addItem() {\n    const data = treeData;\n    const more = pullAt(data, [treeData.length - 1]);\n\n    const newItem = {\n      id: uuidv4(),\n      label: I18n.t(\"js.administration.app_navigation_items.edit.new_link\"),\n      type: \"link\",\n      icon: \"link\",\n      isEntryPoint: false,\n      isDefault: false,\n      options: { url: \"\" },\n    };\n\n    setTreeData([...data, newItem, ...more]);\n\n    const path = [newItem.id];\n    setActivePath(path);\n  }\n\n  function itemButtons(node: TreeItem, path: (number | string)[]) {\n    const buttons: JSX.Element[] = [];\n\n    if (node.type !== \"more\") {\n      buttons.push(\n        <ItemButton\n          onClick={(e) => removeItemAt(e, path, node)}\n          icon=\"fa-regular fa-trash\"\n          buttonClass=\"btn-danger\"\n        />,\n      );\n    }\n\n    return buttons;\n  }\n\n  const getNodeKey = ({ node }: { node: TreeItem }) => node.id;\n\n  function getActiveNode() {\n    const node = getNodeAtPath({\n      treeData: treeData,\n      path: activePath,\n      getNodeKey,\n    });\n    return node && node.treeIndex > -1 ? node.node : null;\n  }\n\n  function changeEntryPoint(\n    item: TreeItem,\n    checked: boolean,\n    changedTreeData?: TreeItem[],\n  ) {\n    const newTreeData = map(changedTreeData || treeData, (data, index) => ({\n      ...data,\n      isEntryPoint:\n        checked && item.id === data.id // set item as entry point if it is checked\n          ? true\n          : !checked &&\n              index ===\n                findIndex(\n                  changedTreeData || treeData,\n                  (data) =>\n                    data.type !== \"link\" &&\n                    data.type !== \"more\" &&\n                    data.id !== item.id,\n                ) // set first item (not link or more) as entry point if item is unchecked\n            ? true\n            : false, // reset all others to false (to avoid more than one entry point)\n    }));\n\n    setTreeData(newTreeData);\n  }\n\n  function submit() {\n    updateItems({ body: { items: treeData } });\n  }\n\n  const hasNoEntryPointItem =\n    findIndex(treeData, { isEntryPoint: true }) === -1;\n\n  const activeNode = getActiveNode();\n\n  return (\n    <div>\n      <PageTitle\n        title={I18n.t(\"js.administration.app_navigation_items.edit.page_title\")}\n      />\n      <div className=\"btn-toolbar justify-end mb-4\">\n        <button\n          className=\"btn btn-success\"\n          type=\"submit\"\n          onClick={submit}\n          disabled={treeData.length < 5 || hasNoEntryPointItem}\n        >\n          {I18n.t(\"js.administration.navigation_items.edit.save\")}\n        </button>\n      </div>\n      {isLoading ? (\n        <p>\n          <i className=\"fa fa-spinner spin\" /> ...Lade App-Navigation\n        </p>\n      ) : (\n        <div className=\"row\">\n          <div className=\"navigation-manager\">\n            <div className=\"navigation-column\">\n              <SortableTree\n                treeData={treeData}\n                onChange={(treeData: Item[]) => setTreeData(treeData)}\n                getNodeKey={getNodeKey}\n                isVirtualized={false}\n                maxDepth={1}\n                canDrag={({ node }) => node.type !== \"more\"}\n                onMoveNode={(e) => setActivePath(e.path)}\n                generateNodeProps={({ node, path }) => ({\n                  title: NodeTitle,\n                  key: node.type,\n                  onClick: () => setActivePath(path),\n                  buttons: itemButtons(node, path),\n                  className: classNames(\n                    {\n                      \"selected move-item\": isEqual(activePath, path),\n                      \"not-empty-field\": node.label || isSaving,\n                      \"empty-field\": !node.label && !isSaving,\n                    },\n                    \"content-item\",\n                  ),\n                })}\n              />\n              <button\n                className=\"btn btn-primary add-new-item-button\"\n                disabled={treeData.length === 5 || isSaving}\n                onClick={addItem}\n              >\n                <i className=\"fa fa-plus\" />\n                {I18n.t(\"js.administration.navigation_items.edit.add_link\")}\n              </button>\n              {hasNoEntryPointItem && (\n                <p className=\"hint\">\n                  {I18n.t(\n                    \"js.administration.app_navigation_items.edit.hint_entry_point_needed\",\n                  )}\n                </p>\n              )}\n              {treeData.length < 5 && (\n                <p className=\"hint\">\n                  {I18n.t(\n                    \"js.administration.app_navigation_items.edit.hint_five_navigation_items_needed\",\n                  )}\n                </p>\n              )}\n            </div>\n            <div className=\"input-column\">\n              {activeNode && (\n                <ItemForm\n                  item={activeNode as any}\n                  unusedDefaults={more?.options?.items}\n                  changeActiveNode={changeActiveNode}\n                  changeEntryPoint={changeEntryPoint}\n                />\n              )}\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default AppNavigationManager;\n","import React from \"react\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { ContextPageTitle } from \"components/layout/PageTitle\";\nimport GroupNavigation from \"components/layout/GroupNavigation\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../@types\";\nimport MarkdownTranslation from \"components/shared/MarkdownTranslation\";\n\nexport default function GroupAdministrationMainPage() {\n  const { groupSlug } = useParams();\n  const group = useSelector((state: State) =>\n    groupSlug ? state.groups.bySlug[groupSlug] : null,\n  );\n\n  return (\n    <>\n      <ContextPageTitle groupSlug={groupSlug} />\n      <GroupNavigation groupSlug={groupSlug} />\n      {group?.hidden_main_group ? (\n        <MarkdownTranslation\n          translation={\"js.administration.main.category_message_md\"}\n        />\n      ) : (\n        <MarkdownTranslation\n          translation={\"js.administration.main.group_message_md\"}\n        />\n      )}\n    </>\n  );\n}\n","import React, { lazy, Suspense } from \"react\";\nimport { RouteObject, useParams } from \"helpers/tixxt-router\";\nimport NetworkSettings from \"./networkSettings\";\nimport NavigationManager from \"./NavigationManager\";\nimport GroupCategorySorter from \"./GroupCategorySorter\";\nimport MembershipEdit from \"./MembershipEdit\";\nimport MembershipNew from \"./MembershipNew\";\nimport LegalTextEdit from \"../administration/legalTexts/LegalTextEdit\";\nimport LegalTextIndex from \"../administration/legalTexts/LegalTextIndex\";\nimport LegalTextNew from \"../administration/legalTexts/LegalTextNew\";\nimport LegalTextVersions from \"../administration/legalTexts/LegalTextVersions\";\nimport ImprintEdit from \"../administration/imprints/ImprintEdit\";\nimport AppNavigationManager from \"./appNavigationManager\";\nimport { convertRoutes } from \"components/tixxt/BackboneFeature\";\nimport GroupAdministrationMainPage from \"components/administration/GroupAdministrationMainPage\";\n\nconst DesignsOverviewPage = lazy(\n  () => import(\"./designManager/DesignsOverviewPage\"),\n);\nconst DesignsOverviewLightPage = lazy(\n  () => import(\"./designManagerLight/DesignsOverviewLightPage\"),\n);\nconst DesignManagerPage = lazy(\n  () => import(\"./designManager/DesignManagerPage\"),\n);\nconst DesignManagerLightPage = lazy(\n  () => import(\"./designManagerLight/DesignManagerLightPage\"),\n);\n\nconst StatisticsPage = lazy(() => import(\"./statistics/StatisticsPage\"));\nconst TagsManagerPage = lazy(() => import(\"./tags/TagsManagerPage\"));\n\nfunction Params({ children }) {\n  const params = useParams();\n  return children(params);\n}\n\nconst backboneRoutes: RouteObject[] = convertRoutes({\n  feature: \"Administration\",\n  featureRoutes: {\n    \"group-categories/:group_category_id/administration/groups\":\n      \"editSectionGroups\",\n    \"administration/groups\": \"editGroups\",\n    \"(groups/:group_slug/)administration/members\": \"editMembers\",\n    \"administration/members/:id/group-memberships\":\n      \"editMemberGroupMemberships\",\n    \"(groups/:group_slug/)administration/membership_roles\":\n      \"manageMembershipRoles\",\n    \"(groups/:group_slug/)administration/consumers\": \"consumers\",\n    \"administration/consumers/new\": \"newConsumer\",\n    \"administration/consumers/:id/edit\": \"editConsumer\",\n    \"administration/consumers/:id/group-memberships\":\n      \"editConsumerGroupMemberships\",\n    \"administration/group-categories/new\": \"newGroupCategory\",\n    \"administration/group-categories/:id/edit\": \"editGroupCategory\",\n    \"administration/abbreviations\": \"abbreviations\",\n    \"administration/abbreviations/new\": \"newAbbreviation\",\n    \"administration/abbreviations/:id/edit\": \"editAbbreviation\",\n    \"(groups/:group_slug/)administration/widgetbars\": \"widgetbarIndex\",\n    \"(groups/:group_slug/)administration/widgetbars/:slug/edit\":\n      \"widgetbarEdit\",\n    \"groups/:group_slug/administration/organisation\": \"organisationMain\",\n    \"groups/:group_slug/administration/organisation/group-memberships\":\n      \"organisationGroups\",\n    \"groups/:group_slug/administration/organisation/group-memberships/:id\":\n      \"organisationGroupMemberships\",\n    \"groups/:group_slug/administration/organisation/members\":\n      \"organisationMembers\",\n    \"groups/:group_slug/administration/organisation/members/new\":\n      \"newOrganisationMember\",\n    \"groups/:group_slug/administration/organisation/edit\":\n      \"organisationProfile\",\n    \"groups/:group_slug/administration/organisation/feedback\":\n      \"organisationFeedback\",\n    \"administration/industrials\": \"industrials\",\n    \"administration/industrials/new\": \"newIndustrial\",\n    \"administration/industrials/:id/edit\": \"editIndustrial\",\n  },\n});\n\nconst reactRoutes: RouteObject[] = [\n  { path: \"/administration/settings/edit\", element: <NetworkSettings /> },\n  {\n    path: \"/administration/navigation/edit\",\n    element: <NavigationManager groupSlug={null} />,\n  },\n  {\n    path: \"/administration/app_navigation/edit\",\n    element: <AppNavigationManager />,\n  },\n  {\n    path: \"/administration/group-categories-order/edit\",\n    element: <GroupCategorySorter />,\n  },\n  {\n    path: \"/administration/members/:membershipId/edit\",\n    element: <MembershipEdit />,\n  },\n  { path: \"/administration/members/new\", element: <MembershipNew /> },\n  { path: \"/administration/legal_texts\", element: <LegalTextIndex /> },\n  {\n    path: \"/administration/legal_texts/:legalTextId/edit\",\n    element: <LegalTextEdit />,\n  },\n  { path: \"/administration/legal_texts/new\", element: <LegalTextNew /> },\n  {\n    path: \"/administration/legal_texts/:legalTextId\",\n    element: <LegalTextVersions />,\n  },\n  { path: \"/administration/imprint/edit\", element: <ImprintEdit /> },\n  {\n    path: \"/administration/statistics\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <StatisticsPage />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/administration/designs\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <DesignsOverviewPage themeType={\"network\"} />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/administration/designs/:id/edit\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <DesignManagerPage themeType={\"network\"} />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/group-categories/:groupCategoryId/administration/designs\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <DesignsOverviewLightPage themeType={\"groupCategory\"} />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/group-categories/:groupCategoryId/administration/designs/:designId/edit\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <DesignManagerLightPage themeType={\"groupCategory\"} />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/administration/tags\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <TagsManagerPage />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/groups/:groupSlug/administration\",\n    element: <GroupAdministrationMainPage />,\n  },\n  {\n    path: \"/groups/:groupSlug/administration/designs\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <DesignsOverviewLightPage themeType={\"group\"} />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/groups/:groupSlug/administration/designs/:designId/edit\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <DesignManagerLightPage themeType={\"group\"} />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/groups/:groupSlug/administration/navigation/edit\",\n    element: (\n      <Params>\n        {({ groupSlug }) => <NavigationManager groupSlug={groupSlug} />}\n      </Params>\n    ),\n  },\n  {\n    path: \"/groups/:groupSlug/administration/statistics\",\n    element: (\n      <Suspense fallback={\"Loading...\"}>\n        <StatisticsPage />\n      </Suspense>\n    ),\n  },\n];\nexport default backboneRoutes.concat(reactRoutes);\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport BackboneFeature from \"components/tixxt/BackboneFeature\";\n\nconst directoryRoutes: RouteObject[] = [\n  {\n    path: \"/directory\",\n    element: (\n      <BackboneFeature\n        feature=\"Directory\"\n        action=\"showList\"\n        paramKeys={[\"group_id\", \"category_id\"]}\n      />\n    ),\n  },\n  {\n    path: \"/directory/:category_id\",\n    element: (\n      <BackboneFeature\n        feature=\"Directory\"\n        action=\"showList\"\n        paramKeys={[\"group_id\", \"category_id\"]}\n      />\n    ),\n  },\n  {\n    path: \"/members\",\n    element: (\n      <BackboneFeature\n        feature=\"Directory\"\n        action=\"showList\"\n        paramKeys={[\"group_id\"]}\n      />\n    ),\n  },\n  {\n    path: \"/groups/:group_id/directory\",\n    element: (\n      <BackboneFeature\n        feature=\"Directory\"\n        action=\"showList\"\n        paramKeys={[\"group_id\", \"category_id\"]}\n      />\n    ),\n  },\n  {\n    path: \"/groups/:group_id/directory/:category_id\",\n    element: (\n      <BackboneFeature\n        feature=\"Directory\"\n        action=\"showList\"\n        paramKeys={[\"group_id\", \"category_id\"]}\n      />\n    ),\n  },\n  {\n    path: \"/groups/:group_id/members\",\n    element: (\n      <BackboneFeature\n        feature=\"Directory\"\n        action=\"showList\"\n        paramKeys={[\"group_id\"]}\n      />\n    ),\n  },\n];\n\nexport default directoryRoutes;\n","import React from \"react\";\nimport { useStore, useSelector } from \"react-redux\";\nimport { SubmissionError } from \"redux-form\";\nimport { useParams } from \"helpers/tixxt-router\";\n\nimport { selectNetworkId } from \"selectors/environment\";\nimport { updateMembership } from \"actions/memberships\";\nimport persistItem from \"helpers/items/persistItem\";\n\nimport MembershipForm from \"./MembershipForm\";\nimport { useLoadApp } from \"../appCreator/api\";\n\nexport default function EditMembership() {\n  const { membershipId } = useParams();\n  const networkId = useSelector(selectNetworkId);\n  const externalAppId = `profile:${networkId}`;\n  const externalItemId = membershipId;\n  const store = useStore();\n  const { data: app } = useLoadApp({\n    externalAppId,\n  });\n\n  const onSubmit = async (values, dispatch) => {\n    await persistItem(app, store.dispatch, {\n      externalAppId,\n      externalItemId,\n      values,\n    });\n\n    const membershipResult = await dispatch(updateMembership({ membershipId }));\n    if (membershipResult.error) throw new SubmissionError();\n  };\n\n  const onSubmitSuccess = () => {\n    location.replace(`/members/${membershipId}`);\n    toastr.success(I18n.t(\"js.saving_successful\"));\n  };\n\n  return (\n    <MembershipForm\n      externalAppId={externalAppId}\n      externalItemId={externalItemId}\n      onSubmit={onSubmit}\n      onSubmitSuccess={onSubmitSuccess}\n      title={I18n.t(\"js.apps.profile.edit.title\")}\n    />\n  );\n}\n","import React, { useCallback } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { includes, mapValues, pickBy } from \"lodash\";\nimport { selectNetworkId } from \"selectors/environment\";\nimport MembershipForm from \"./MembershipForm\";\nimport { fetchApi } from \"../../helpers/reactQueryApi\";\n\nconst changeRequestsProfileFields =\n  window.Preload.current_network.config.memberships?.change_requests\n    ?.profile_fields;\n\nexport default function NewChangeRequest() {\n  const membershipId = window.Preload.current_member.id;\n  const networkId = useSelector(selectNetworkId);\n  const externalAppId = `profile:${networkId}`;\n  const externalItemId = membershipId;\n  const filterProperties = useCallback(\n    ({ name }) => includes(changeRequestsProfileFields, name),\n    [],\n  );\n  const mapProperties = useCallback(\n    (prop) => ({ ...prop, can: { update: true } }),\n    [],\n  );\n  const transformItem = useCallback(\n    (item) => ({ ...item, can: mapValues(item.can, () => true) }),\n    [],\n  );\n\n  const onSubmit = async (values) => {\n    const body = pickBy(values, (value, name) => filterProperties({ name }));\n    return fetchApi(`/change_requests`, {\n      method: \"POST\",\n      body,\n    });\n  };\n\n  const onSubmitSuccess = () => {\n    location.replace(`/members/${membershipId}`);\n    toastr.success(I18n.t(\"js.saving_successful\"));\n  };\n\n  return (\n    <MembershipForm\n      externalAppId={externalAppId}\n      externalItemId={externalItemId}\n      onSubmit={onSubmit}\n      onSubmitSuccess={onSubmitSuccess}\n      title={I18n.t(\"js.memberships.change_requests.title\")}\n      filterProperties={filterProperties}\n      mapProperties={mapProperties}\n      transformItem={transformItem}\n    />\n  );\n}\n","import React from \"react\";\nimport { map, startsWith } from \"lodash\";\nimport classnames from \"classnames\";\n\nimport ControlGroup from \"./ControlGroup\";\nimport CheckboxField from \"./CheckboxField\";\nimport Hint from \"components/shared/fields/Hint\";\n\ninterface CheckboxFieldsProps {\n  name: string;\n  label?: string;\n  required?: boolean;\n  options: Array<{\n    value: boolean | string;\n    label: string;\n    disabled?: boolean;\n    hint?: string;\n  }>;\n  multiple?: boolean;\n  hint?: string;\n  disabled?: boolean;\n}\n\nfunction CheckboxFields({\n  name,\n  label,\n  required,\n  options,\n  multiple,\n  hint,\n  disabled,\n}: CheckboxFieldsProps) {\n  return (\n    <ControlGroup\n      name={name}\n      label={label}\n      required={required}\n      className=\"radio_buttons border-box p-3\"\n    >\n      {map(options, (option) => {\n        return (\n          <CheckboxField\n            name={multiple ? `${name}[${option.value}]` : name}\n            key={String(option.value)}\n            type={multiple ? \"checkbox\" : \"radio\"}\n            className={classnames({ radio: !multiple, checkbox: multiple })}\n            disabled={disabled || option.disabled}\n            label={\n              startsWith(option.label, \"js.\")\n                ? I18n.t(option.label)\n                : option.label\n            }\n            value={option.value}\n            labelHint={option.hint}\n          />\n        );\n      })}\n      <Hint hint={hint} />\n    </ControlGroup>\n  );\n}\n\nexport default CheckboxFields;\n","import { change, formValueSelector } from \"redux-form\";\nimport { connect } from \"react-redux\";\nimport React, { Fragment, useEffect, useRef } from \"react\";\nimport CheckboxFields from \"../../shared/fields/CheckboxFields\";\nimport SelectionField from \"../../appCreator/properties/edit/SelectionField\";\nimport PropTypes from \"prop-types\";\nimport InfoText from \"../../shared/InfoText\";\nimport CheckboxField from \"../../shared/fields/CheckboxField\";\nimport { get } from \"lodash\";\n\nconst selector = formValueSelector(\"editMembershipSettings\");\nconst DigestSettings = connect((state, { configCategory }) => ({\n  switchValue: selector(state, `${configCategory}.switch`),\n}))(({ configCategory, switchValue, conditions, dispatch }) => {\n  const isMounted = useRef(false);\n  const groupOptions = Tixxt.currentMember\n    .groups()\n    .map((group) => ({\n      value: group.get(\"id\"),\n      label: group.get(\"name\"),\n    }))\n    .sort((a, b) => a.label.localeCompare(b.label));\n\n  useEffect(() => {\n    if (isMounted.current) {\n      if (switchValue === \"selected_groups\") {\n        dispatch(\n          change(\n            \"editMembershipSettings\",\n            `${configCategory}.group_ids`,\n            groupOptions.map((group) => group.value),\n          ),\n        );\n      }\n    } else {\n      isMounted.current = true;\n    }\n  }, [switchValue, configCategory]);\n\n  return (\n    <Fragment>\n      <h3>{I18n.t(`js.memberships.settings.${configCategory}.title`)}</h3>\n      {get(conditions, [\"email_daily_digests\", \"include_network_level\"]) &&\n      configCategory === \"email_daily_digests\" ? (\n        <p>\n          {I18n.t(\n            `js.memberships.settings.${configCategory}.description_with_network`,\n          )}\n        </p>\n      ) : (\n        <p>{I18n.t(`js.memberships.settings.${configCategory}.description`)}</p>\n      )}\n      <CheckboxFields\n        name={`${configCategory}.switch`}\n        options={[\n          {\n            label: `js.memberships.settings.${configCategory}.checkboxes.disabled`,\n            value: \"disabled\",\n          },\n          {\n            label: `js.memberships.settings.${configCategory}.checkboxes.all`,\n            value: \"all\",\n          },\n          {\n            label: `js.memberships.settings.${configCategory}.checkboxes.selected_groups`,\n            value: \"selected_groups\",\n          },\n        ]}\n        multiple={false}\n      />\n      {switchValue === \"selected_groups\" ? (\n        <div className=\"mt-3 \">\n          <InfoText\n            translation={\n              \"js.memberships.settings.email_digests.selected_groups.info\"\n            }\n          />\n          <label htmlFor={`group-select-${configCategory}-input`}>\n            {I18n.t(`js.memberships.settings.${configCategory}.include_groups`)}\n          </label>\n          <div className=\"pt-3\">\n            <SelectionField\n              select\n              name={`${configCategory}.group_ids`}\n              options={groupOptions}\n              multiple\n            />\n          </div>\n        </div>\n      ) : null}\n      {get(conditions, [\"email_daily_digests\", \"include_network_level\"]) &&\n      configCategory === \"email_daily_digests\" &&\n      switchValue !== \"disabled\" ? (\n        <div className=\"control-group input property-email_daily_digests.include_network_level mt-3\">\n          <div className=\"controls radio_buttons border-box p-3\">\n            <CheckboxField\n              name={`${configCategory}.include_network_level`}\n              type=\"checkbox\"\n              className=\"checkbox\"\n              label={I18n.t(\n                `js.memberships.settings.email_daily_digests.checkboxes.include_network_level`,\n              )}\n              value=\"true\"\n            />\n          </div>\n        </div>\n      ) : null}\n    </Fragment>\n  );\n});\n\nDigestSettings.propTypes = {\n  configCategory: PropTypes.string,\n};\n\nexport default DigestSettings;\n","import React, { Fragment } from \"react\";\nimport CheckboxFields from \"../../shared/fields/CheckboxFields\";\nimport { compact, includes, get, map } from \"lodash\";\nimport PropTypes from \"prop-types\";\n\nconst mapOptions =\n  (configCategory, disabled, conditions) => (_value, config) =>\n    get(conditions, [configCategory, config], true)\n      ? {\n          label: `js.memberships.settings.${configCategory}.checkboxes.${config}`,\n          value: config,\n          disabled: includes(disabled[configCategory], config),\n        }\n      : null;\n\nfunction EmailConfigList({ settings, configCategory, conditions, disabled }) {\n  return (\n    <Fragment>\n      <h3>{I18n.t(`js.memberships.settings.${configCategory}.title`)}</h3>\n      <p>{I18n.t(`js.memberships.settings.${configCategory}.description`)}</p>\n      <CheckboxFields\n        name={configCategory}\n        options={compact(\n          map(\n            settings[configCategory],\n            mapOptions(configCategory, disabled, conditions),\n          ),\n        )}\n        multiple\n      />\n    </Fragment>\n  );\n}\n\nEmailConfigList.propTypes = {\n  settings: PropTypes.object,\n  configCategory: PropTypes.string,\n  conditions: PropTypes.object,\n  disabled: PropTypes.object,\n};\n\nexport default EmailConfigList;\n","import React, { useEffect, useState } from \"react\";\nimport { isEmpty, map } from \"lodash\";\nimport CheckboxFields from \"components/shared/fields/CheckboxFields\";\nimport {\n  useFetchDeviceSettings,\n  updateDeviceSettings,\n} from \"components/memberships/api\";\nimport ReduxForm from \"components/shared/reduxForm\";\n\nexport default function PushNotificationSettingsForm() {\n  const [deviceId, setDeviceUniqueId] = useState(\"\");\n  const [deviceName, setDeviceName] = useState(\"\");\n\n  const { data, refetch } = useFetchDeviceSettings(deviceId);\n\n  function getDeviceUniqueId() {\n    window.bridge?.getDeviceUniqueId(({ id, name }) => {\n      setDeviceUniqueId(id);\n      setDeviceName(name);\n    });\n  }\n\n  useEffect(() => {\n    getDeviceUniqueId();\n  });\n\n  useEffect(() => {\n    deviceId !== \"\" && refetch();\n  }, [deviceId]);\n\n  function retryDeviceLoading() {\n    if (deviceId != \"\" && isEmpty(data)) {\n      window.bridge?.askToRegisterDevice();\n    } else {\n      getDeviceUniqueId();\n    }\n  }\n\n  function onSubmit(values, dispatch) {\n    dispatch(updateDeviceSettings({ deviceId, notifications: values })).then(\n      () => Promise.resolve(\"Submission successful\"),\n    );\n  }\n\n  return deviceId != \"\" && !isEmpty(data) ? (\n    <ReduxForm\n      form=\"editMemberPushNotificationSettings\"\n      className={\"form-horizontal\"}\n      initialValues={data?.notifications}\n      onSubmit={onSubmit}\n      onSubmitSuccess={() => toastr.success(I18n.t(\"js.saving_successful\"))}\n      onSubmitFail={() => toastr.error(I18n.t(\"js.saving_failure\"))}\n      allowSaveWithoutChange={true}\n      onCancel={window.isApp ? () => window.bridge?.goBack() : undefined}\n    >\n      <div>\n        <h3>{I18n.t(\"js.memberships.settings.push_notifications.tab\")}</h3>\n        <div\n          className=\"markdown-content prose break-words max-w-prose mb-3\"\n          dangerouslySetInnerHTML={{\n            __html: I18n.t(\n              \"js.memberships.settings.push_notifications.description\",\n              { deviceName },\n            ),\n          }}\n        ></div>\n        {map(data.notifications, (settings, label) => {\n          return (\n            <div className=\"mb-3\">\n              <CheckboxFields\n                key={label}\n                name={label}\n                label={I18n.t(\n                  `js.memberships.settings.push_notifications.${label}.label`,\n                )}\n                options={map(settings, (setting, key) => ({\n                  label: I18n.t(\n                    `js.memberships.settings.push_notifications.${label}.${key}`,\n                  ),\n                  value: key,\n                }))}\n                multiple\n              />\n            </div>\n          );\n        })}\n      </div>\n    </ReduxForm>\n  ) : (\n    <div className=\"flex flex-col\">\n      <p>{I18n.t(\"js.memberships.settings.push_notifications.no_settings\")}</p>\n      <button\n        className=\"btn btn-primary flex justify-center\"\n        onClick={retryDeviceLoading}\n      >\n        {I18n.t(\"js.generic_try_again\")}\n      </button>\n    </div>\n  );\n}\n","import { useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nexport function useFetchDeviceSettings(deviceId: string, options = {}) {\n  return useQuery(\n    [\"deviceSettings\", deviceId],\n    () => fetchApi(`/api/v1/devices/${deviceId}/settings`),\n    options,\n  );\n}\n\nexport function updateDeviceSettings({ deviceId, ...body }) {\n  return fetchApi(`/api/v1/devices/${deviceId}/settings`, {\n    method: \"POST\",\n    body,\n  });\n}\n","import React, { Fragment, useState, useEffect } from \"react\";\nimport {\n  isEmpty,\n  map,\n  pickBy,\n  keys,\n  get,\n  cloneDeep,\n  snakeCase,\n  compact,\n  includes,\n  filter,\n} from \"lodash\";\nimport { SubmissionError } from \"redux-form\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { useQuery } from \"react-query\";\nimport Loading from \"components/shared/Loading\";\nimport classNames from \"classnames\";\nimport { updateMembershipSettings } from \"actions/memberships\";\n\nimport ReduxForm from \"components/shared/reduxForm\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport DigestSettings from \"components/memberships/membershipSettings/DigestSettings\";\nimport EmailConfigList from \"components/memberships/membershipSettings/EmailConfigList\";\nimport PushNotificationSettingsForm from \"components/memberships/PushNotificationSettingsForm\";\n\nconst transform2FrontendState = (state) => {\n  const newState = cloneDeep(state);\n  map([\"email_digests\", \"email_daily_digests\"], (key) => {\n    if (newState[key].enabled) {\n      if (newState[key].group_ids === \"all\") {\n        newState[key].switch = \"all\";\n      } else {\n        newState[key].switch = \"selected_groups\";\n      }\n    } else {\n      newState[key].switch = \"disabled\";\n    }\n  });\n\n  return newState;\n};\n\nconst transform2BackendState = (state) => {\n  const newState = cloneDeep(state);\n  map([\"email_digests\", \"email_daily_digests\"], (key) => {\n    switch (newState[key].switch) {\n      case \"all\":\n        newState[key].enabled = true;\n        newState[key].group_ids = [\"all\"];\n        break;\n      case \"selected_groups\":\n        newState[key].enabled = true;\n        break;\n      case \"disabled\":\n        newState[key].enabled = false;\n        break;\n    }\n  });\n  map(\n    [\"email_subscriptions\", \"email_notifications\", \"email_admin_notifications\"],\n    (key) => {\n      newState[key] = keys(pickBy(newState[key]));\n    },\n  );\n\n  return newState;\n};\n\nconst createOnSubmit =\n  (membershipId, notificationsWereDeactivated) => async (values, dispatch) => {\n    const membershipSettingsResult = await dispatch(\n      updateMembershipSettings({\n        membershipId,\n        body: transform2BackendState(values),\n      }),\n    );\n\n    if (notificationsWereDeactivated) location.reload();\n    if (membershipSettingsResult.error)\n      throw new SubmissionError(membershipSettingsResult.error);\n  };\n\nconst onSubmitSuccess = () => {\n  toastr.success(I18n.t(\"js.saving_successful\"));\n};\n\nexport default function EditMembershipSettings() {\n  const { membershipId } = useParams();\n\n  const { isLoading: loading, data } = useQuery(\n    `/members/${membershipId}/settings`,\n  );\n\n  const { settings, conditions, disabled } = (data || {}) as any;\n\n  const showEmailDigests =\n    get(conditions, [\"email_digests\", \"enabled\"], true) &&\n    get(conditions, [\"email_digests\", \"set\"], true);\n\n  const showEmailDailyDigests = get(\n    conditions,\n    [\"email_daily_digests\", \"enabled\"],\n    true,\n  );\n\n  useEffect(() => {\n    if (!showEmailDigests && !showEmailDailyDigests) {\n      setActiveTab(\"email-subscriptions\");\n    }\n  }, [showEmailDigests, showEmailDailyDigests]);\n\n  const [activeTab, setActiveTab] = useState(\"email-digests\");\n\n  const notificationsDeactivated = get(\n    conditions,\n    [\"email_notifications_disabled\"],\n    false,\n  );\n\n  const styles = {\n    overflow: \"visible\",\n    marginBottom: \"18px\",\n  };\n\n  let tabs = [\n    \"email-digests\",\n    \"email-daily-digests\",\n    \"email-subscriptions\",\n    \"email-notifications\",\n    \"email-newsletter\",\n    \"email-admin-notifications\",\n    \"push-notifications\",\n  ];\n\n  tabs = compact(\n    map(tabs, (tab) => {\n      if (validateTab(tab)) return tab;\n    }),\n  );\n\n  function validateTab(tab) {\n    switch (tab) {\n      case \"email-digests\":\n        return showEmailDigests;\n      case \"email-daily-digests\":\n        return showEmailDailyDigests;\n      case \"email-newsletter\":\n        return get(conditions, [\"email_newsletter\", \"enabled\"], false);\n      case \"email-admin-notifications\":\n        return get(conditions, [\"email_admin_notifications\", \"enabled\"], true);\n      case \"push-notifications\":\n        return window.isApp;\n      default:\n        return true;\n    }\n  }\n\n  if (loading || !data) return <Loading />;\n\n  return (\n    <Fragment>\n      <PageTitle title={I18n.t(\"js.memberships.settings.title\")} />\n      {loading || isEmpty(settings) ? (\n        <div>\n          <i className=\"fa fa-spinner fa-spin\" />\n          {I18n.t(\"js.loading\")}\n        </div>\n      ) : (\n        <div>\n          <ul className=\"nav nav-tabs\">\n            {/**** Header ****/}\n            {notificationsDeactivated ? (\n              <p className=\"text-sm\">\n                {I18n.t(\n                  \"js.memberships.settings.email_notifications.bouncelist_hint\",\n                )}\n              </p>\n            ) : (\n              map(tabs, (tab, index) => (\n                <li\n                  key={index}\n                  className={classNames({\n                    active: activeTab === tab,\n                  })}\n                >\n                  <a\n                    href={`#${tab}`}\n                    data-toggle=\"tab\"\n                    onClick={(e) => {\n                      e.preventDefault();\n                      setActiveTab(tab);\n                    }}\n                  >\n                    {I18n.t(`js.memberships.settings.${snakeCase(tab)}.tab`)}\n                  </a>\n                </li>\n              ))\n            )}\n          </ul>\n          {activeTab != \"push-notifications\" && (\n            <ReduxForm\n              form=\"editMembershipSettings\"\n              className={\"form-horizontal\"}\n              initialValues={transform2FrontendState(settings)}\n              onSubmit={createOnSubmit(membershipId, notificationsDeactivated)}\n              onSubmitSuccess={onSubmitSuccess}\n              onSubmitFail={() => toastr.error(I18n.t(\"js.saving_failure\"))}\n              submitText={\n                notificationsDeactivated\n                  ? I18n.t(\n                      \"js.memberships.settings.email_notifications.activate\",\n                    )\n                  : undefined\n              }\n              allowSaveWithoutChange={notificationsDeactivated}\n              onCancel={\n                window.isApp ? () => window.bridge?.goBack() : undefined\n              }\n            >\n              {notificationsDeactivated ? (\n                <p className=\"text-sm\">\n                  {I18n.t(\n                    \"js.memberships.settings.email_notifications.bouncelist_hint\",\n                  )}\n                </p>\n              ) : (\n                <div style={styles} className=\"tab-content mt-4\">\n                  {/**** Content ****/}\n                  {map(\n                    filter(tabs, (t) => t !== \"push-notifications\"),\n                    (tab) => (\n                      <div\n                        key={tab}\n                        id={tab}\n                        className={classNames(\"tab-pane\", {\n                          active: activeTab === tab,\n                        })}\n                      >\n                        {includes(\n                          [\"email-digests\", \"email-daily-digests\"],\n                          tab,\n                        ) ? (\n                          <DigestSettings\n                            conditions={conditions}\n                            disabled={disabled}\n                            configCategory={snakeCase(tab)}\n                          />\n                        ) : (\n                          <EmailConfigList\n                            conditions={conditions}\n                            disabled={disabled}\n                            settings={settings}\n                            configCategory={snakeCase(tab)}\n                          />\n                        )}\n                      </div>\n                    ),\n                  )}\n                </div>\n              )}\n            </ReduxForm>\n          )}\n          {window.isApp && activeTab == \"push-notifications\" && (\n            <div style={styles} className=\"tab-content mt-4\">\n              <div\n                id=\"push-notifications\"\n                className={classNames(\"tab-pane\", {\n                  active: activeTab === \"push-notifications\",\n                })}\n              >\n                <PushNotificationSettingsForm />\n              </div>\n            </div>\n          )}\n        </div>\n      )}\n    </Fragment>\n  );\n}\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport EditMembership from \"./EditMembership\";\nimport NewChangeRequest from \"./NewChangeRequest\";\nimport EditMembershipSettings from \"./EditMembershipSettings\";\nimport BackboneFeature from \"components/tixxt/BackboneFeature\";\n\nconst membershipRoutes: RouteObject[] = [\n  {\n    path: \"/members/:membershipId/edit\",\n    element: <EditMembership />,\n    forceTurbo: true,\n  },\n  {\n    path: \"/members/:membershipId/change_requests/new\", // deprecated\n    element: <NewChangeRequest />,\n  },\n  {\n    path: \"/change_requests/new\",\n    element: <NewChangeRequest />,\n  },\n  {\n    path: \"/members/:membershipId/settings/edit\",\n    element: <EditMembershipSettings />,\n  },\n  {\n    path: \"/members/:id/activities\",\n    element: (\n      <BackboneFeature\n        feature=\"Memberships\"\n        action=\"showActivities\"\n        paramKeys={[\"id\"]}\n      />\n    ),\n  },\n  {\n    path: \"/members/:id/likes\",\n    element: (\n      <BackboneFeature\n        feature=\"Memberships\"\n        action=\"showLikedActivities\"\n        paramKeys={[\"id\"]}\n      />\n    ),\n  },\n];\n\nexport default membershipRoutes;\n","import React from \"react\";\nimport { Field, FormSection } from \"redux-form\";\nimport PropTypes from \"prop-types\";\n\nimport BasicItemForm from \"../../appCreator/items/form/BasicItemForm\";\nimport TextField from \"../../shared/fields/TextField\";\n\nfunction BasicSettings({\n  externalAppId,\n  externalItemId,\n  initialize,\n  initialValues,\n}) {\n  return (\n    <div className=\"form-horizontal\">\n      <h3>{I18n.t(\"js.groups.edit.basic_settings\")}</h3>\n      <Field type=\"hidden\" component=\"input\" name=\"group_category_id\" />\n      <TextField\n        name=\"name\"\n        label={I18n.t(\"js.groups.form.name.label\")}\n        placeholder={I18n.t(\"groups.form.name.placeholder\")}\n        required\n      />\n\n      <FormSection name=\"profile\">\n        <BasicItemForm\n          externalAppId={externalAppId}\n          externalItemId={externalItemId}\n          initialize={(profile, options) =>\n            initialize({ ...initialValues, profile }, options)\n          }\n        />\n      </FormSection>\n    </div>\n  );\n}\n\nexport default BasicSettings;\n\nBasicSettings.propTypes = {\n  externalAppId: PropTypes.string,\n  externalItemId: PropTypes.string,\n  initialize: PropTypes.func,\n  initialValues: PropTypes.object,\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useSelector } from \"react-redux\";\nimport { formValueSelector } from \"redux-form\";\n\nimport CheckboxField from \"components/shared/fields/CheckboxField\";\nimport CheckboxFields from \"components/shared/fields/CheckboxFields\";\nimport { Controls } from \"components/shared/fields/ControlGroup\";\n\nfunction GroupAccess({\n  sensitive,\n  active_main_group,\n  formName,\n  can_create_hidden,\n}) {\n  const accessValue = useSelector((state) =>\n    formValueSelector(formName)(state, \"access\"),\n  );\n\n  const access_options = [\n    {\n      value: \"open\",\n      label: I18n.t(\"js.groups.form.open\"),\n      disabled: sensitive,\n    },\n  ];\n  if (!active_main_group) {\n    access_options.push({\n      value: \"closed\",\n      label: I18n.t(\"js.groups.form.closed\"),\n    });\n  }\n  if (can_create_hidden) {\n    access_options.push({\n      value: \"hidden\",\n      label: I18n.t(\"js.groups.form.hidden\"),\n    });\n  }\n\n  return (\n    <div className=\"form-horizontal\">\n      <CheckboxFields\n        name=\"access\"\n        label={I18n.t(\"js.groups.form.access\")}\n        disabled={active_main_group}\n        hint={\n          active_main_group\n            ? I18n.t(\"js.groups.form.access_change_disabled\")\n            : null\n        }\n        options={access_options}\n      />\n      {accessValue !== \"open\" ? (\n        <div className=\"access-options control-group\">\n          <div className=\"controls border-box p-3\">\n            <Controls wrapperClassName=\"moderated-join input boolean\">\n              {accessValue == \"hidden\" ? null : (\n                <CheckboxField\n                  name=\"moderated_join\"\n                  label={I18n.t(\"js.groups.form.moderated_join\")}\n                  type=\"checkbox\"\n                  multiple\n                />\n              )}\n            </Controls>\n            <Controls wrapperClassName=\"members-can-invite input boolean\">\n              <CheckboxField\n                name=\"members_can_invite\"\n                label={I18n.t(\"js.groups.form.members_can_invite\")}\n                type=\"checkbox\"\n                multiple\n              />\n            </Controls>\n          </div>\n          {accessValue == \"hidden\" ? null : (\n            <span className=\"controls help-block text-sm -mt-4\">\n              {I18n.t(\"js.groups.form.moderated_membership\")}\n            </span>\n          )}\n        </div>\n      ) : null}\n    </div>\n  );\n}\nGroupAccess.propTypes = {\n  access: PropTypes.string,\n  sensitive: PropTypes.bool,\n  formName: PropTypes.string,\n  active_main_group: PropTypes.bool,\n  can_create_hidden: PropTypes.bool,\n};\n\nexport default GroupAccess;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport GroupAccess from \"./GroupAccess\";\n\nfunction JoinSettings({ active_main_group, access, sensitive, can, formName }) {\n  return (\n    <>\n      <h3>{I18n.t(\"js.groups.edit.join_settings\")}</h3>\n      <GroupAccess\n        active_main_group={active_main_group}\n        access={access}\n        sensitive={sensitive}\n        can_create_hidden={can.create_hidden}\n        formName={formName}\n      />\n    </>\n  );\n}\n\nexport default JoinSettings;\n\nJoinSettings.propTypes = {\n  active_main_group: PropTypes.bool,\n  can: PropTypes.shape({\n    create_hidden: PropTypes.bool,\n  }),\n  access: PropTypes.string,\n  sensitive: PropTypes.bool,\n  formName: PropTypes.string,\n};\n","import React, { ReactNode, Children } from \"react\";\n\ninterface MiscSettingsProps {\n  settings: ReactNode[];\n}\n\nfunction MiscSettings({ settings }: MiscSettingsProps) {\n  return (\n    <>\n      <h3>{I18n.t(\"js.groups.edit.misc_settings\")}</h3>\n      {Children.map(settings, (setting) => (\n        <>{setting}</>\n      ))}\n    </>\n  );\n}\n\nexport default MiscSettings;\n","import React from \"react\";\nimport CheckboxFields from \"../../shared/fields/CheckboxFields\";\n\nfunction ChatSettings() {\n  return (\n    <CheckboxFields\n      key=\"chat\"\n      name=\"chat\"\n      label={I18n.t(`js.groups.form.chat`)}\n      options={[\n        { value: \"enabled\", label: \"js.groups.form.chat_enabled\" },\n        { value: \"disabled\", label: \"js.groups.form.chat_disabled\" },\n      ]}\n    />\n  );\n}\n\nexport default ChatSettings;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useSelector } from \"react-redux\";\nimport { get } from \"lodash\";\nimport ReduxForm from \"components/shared/reduxForm\";\nimport classNames from \"classnames\";\nimport { selectNetworkId } from \"selectors/environment\";\nimport BasicSettings from \"./BasicSettings\";\nimport JoinSettings from \"./JoinSettings\";\nimport MiscSettings from \"./MiscSettings\";\nimport ChatSettings from \"./ChatSettings\";\n\nfunction GroupForm({\n  id,\n  name,\n  group_category_id,\n  access,\n  sensitive,\n  active_main_group,\n  can,\n  moderated_join,\n  members_can_invite,\n  chat,\n  onSubmit,\n  formName,\n  groupCategoryName,\n}) {\n  const [activeTab, setActiveTab] = useState(\"basic\");\n  const networkId = useSelector(selectNetworkId);\n  const externalAppId = `network_${networkId}:group_category_${group_category_id}:group_profile`;\n  const externalItemId = id;\n  const miscSettings = [];\n\n  if (chat) {\n    miscSettings.push(<ChatSettings />);\n  }\n\n  return (\n    <ReduxForm\n      form={formName}\n      initialValues={{\n        group_category_id,\n        name,\n        access,\n        moderated_join,\n        members_can_invite,\n        chat,\n      }}\n      onSubmit={(values, dispatch, props) =>\n        onSubmit(values, dispatch, {\n          ...props,\n          id,\n          externalAppId,\n          externalItemId,\n        })\n      }\n      onSubmitSuccess={({ payload, meta }) => {\n        toastr.success(\n          I18n.t(id ? \"js.groups.update.success\" : \"js.groups.create.success\", {\n            group: get(meta, [\"body\", \"group\", \"name\"]),\n          }),\n        );\n        location.replace(\n          `/groups/${payload.groupSlug}/activitystreams/${payload.groupSlug}`,\n        );\n      }}\n      onSubmitFail={() =>\n        toastr.error(\n          I18n.t(id ? \"js.groups.update.failure\" : \"js.groups.create.failure\", {\n            group: name || groupCategoryName,\n          }),\n        )\n      }\n      className=\"form-horizontal\"\n      renderChildren={({ initialize, initialValues }) => (\n        <>\n          <ul className=\"nav nav-tabs\">\n            <li className={classNames({ active: activeTab === \"basic\" })}>\n              <a\n                href=\"#\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  setActiveTab(\"basic\");\n                }}\n              >\n                {I18n.t(\"js.groups.edit.basic_settings\")}\n              </a>\n            </li>\n            <li className={classNames({ active: activeTab === \"join\" })}>\n              <a\n                href=\"#\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  setActiveTab(\"join\");\n                }}\n              >\n                {I18n.t(\"js.groups.edit.join_settings\")}\n              </a>\n            </li>\n            {miscSettings.length > 0 && (\n              <li className={classNames({ active: activeTab === \"misc\" })}>\n                <a\n                  href=\"#\"\n                  onClick={(e) => {\n                    e.preventDefault();\n                    setActiveTab(\"misc\");\n                  }}\n                >\n                  {I18n.t(\"js.groups.edit.misc_settings\")}\n                </a>\n              </li>\n            )}\n          </ul>\n          <div className=\"tab-content group-settings\">\n            <div\n              id=\"#basic_settings\"\n              className={classNames(\"tab-pane\", {\n                active: activeTab === \"basic\",\n              })}\n            >\n              <BasicSettings\n                {...{\n                  externalAppId,\n                  externalItemId,\n                  initialize,\n                  initialValues,\n                }}\n              />\n            </div>\n            <div\n              id=\"#join_settings\"\n              className={classNames(\"tab-pane\", {\n                active: activeTab === \"join\",\n              })}\n            >\n              <JoinSettings\n                {...{\n                  active_main_group,\n                  access,\n                  sensitive,\n                  can,\n                  formName,\n                }}\n              />\n            </div>\n            {miscSettings.length > 0 && (\n              <div\n                id=\"#misc_settings\"\n                className={classNames(\"tab-pane\", {\n                  active: activeTab === \"misc\",\n                })}\n              >\n                <MiscSettings settings={miscSettings} />\n              </div>\n            )}\n          </div>\n        </>\n      )}\n    />\n  );\n}\n\nGroupForm.propTypes = {\n  id: PropTypes.string,\n  name: PropTypes.string,\n  group_category_id: PropTypes.string.isRequired,\n  active_main_group: PropTypes.bool,\n  can: PropTypes.shape({\n    create_hidden: PropTypes.bool,\n  }),\n  access: PropTypes.string,\n  sensitive: PropTypes.bool,\n  members_can_invite: PropTypes.bool,\n  moderated_join: PropTypes.bool,\n  profile: PropTypes.shape({\n    id: PropTypes.string,\n    app_id: PropTypes.string,\n    values: PropTypes.shape({\n      profile_image: PropTypes.object,\n      teaser: PropTypes.string,\n      description: PropTypes.string,\n    }),\n  }),\n  chat: PropTypes.string,\n  formName: PropTypes.string,\n  onSubmit: PropTypes.func,\n  groupCategoryName: PropTypes.string,\n};\n\nexport default GroupForm;\n","import { fetchApi } from \"helpers/reactQueryApi\";\n\nexport const fetchGroup = async (groupSlug) => {\n  return await fetchApi(`/api/v1/groups/${groupSlug}`);\n};\n\nexport const fetchGroupDefaults = async (groupCategorySlug) => {\n  return await fetchApi(\n    `/api/v1/groups/new?group_category_slug=${groupCategorySlug}`,\n  );\n};\nexport const deleteGroup = async ({ slug }) => {\n  const response = await fetchApi(`/groups/${slug}`, {\n    method: \"DELETE\",\n  });\n\n  return response;\n};\n\nexport const archiveGroup = async ({ slug, archived }) => {\n  const response = await fetchApi(`/groups/${slug}/archive`, {\n    method: archived ? \"DELETE\" : \"PUT\",\n  });\n\n  return response;\n};\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useMutation } from \"react-query\";\nimport { archiveGroup, deleteGroup } from \"./api\";\n\nfunction EditGroupActions({ archived, can, slug, name }) {\n  const { mutate: onDeleteGroup } = useMutation(deleteGroup, {\n    onSuccess: ({ redirect }) => {\n      toastr.success(I18n.t(\"groups.destroy.success\", { group: name }));\n      // eslint-disable-next-line no-undef\n      Turbo.visit(redirect, {\n        action: \"replace\",\n        target: document.documentElement,\n        historyChanged: true,\n      });\n    },\n  });\n\n  const { mutate: onArchiveGroup } = useMutation(archiveGroup, {\n    onSuccess: ({ archived, redirect }) => {\n      toastr.success(\n        I18n.t(\n          archived\n            ? \"js.groups.group.successfully_archived\"\n            : \"js.groups.group.successfully_unarchived\",\n          { group_name: name },\n        ),\n      );\n      // eslint-disable-next-line no-undef\n      Turbo.visit(redirect, {\n        action: \"replace\",\n        target: document.documentElement,\n        historyChanged: true,\n      });\n    },\n  });\n\n  return (\n    <div className={\"alert alert-danger flex gap-4\"}>\n      <div>\n        <i className=\"fa fa-5x fa-archive\" />\n      </div>\n      <div className={\"grow space-y-2\"}>\n        <h3 className={\"text-lg font-semibold\"}>\n          {I18n.t(\n            archived\n              ? \"js.groups.edit.is_archived\"\n              : \"js.groups.edit.do_archive\",\n          )}\n        </h3>\n        <p>\n          {I18n.t(\n            archived\n              ? \"js.groups.edit.help_do_unarchive\"\n              : \"js.groups.edit.help_do_archive\",\n          )}\n        </p>\n        <div className={\"flex gap-2\"}>\n          <a\n            className={\"btn btn-light\"}\n            href=\"#\"\n            onClick={(e) => {\n              e.preventDefault();\n              window.bridge.confirm(\n                I18n.t(\n                  archived\n                    ? \"js.groups.edit.confirm_unarchive\"\n                    : \"js.groups.edit.confirm_archive\",\n                ),\n                () => onArchiveGroup({ slug, archived }),\n              );\n            }}\n          >\n            {I18n.t(\n              archived ? \"js.groups.edit.unarchive\" : \"js.groups.edit.archive\",\n            )}\n          </a>\n          {can.destroy ? (\n            <a\n              className=\"btn btn-danger\"\n              href=\"#\"\n              onClick={(e) => {\n                e.preventDefault();\n                window.bridge.confirm(\n                  I18n.t(\"js.groups.edit.confirm_delete\"),\n                  () => onDeleteGroup({ slug }),\n                );\n              }}\n            >\n              {I18n.t(\"js.groups.edit.delete\")}\n            </a>\n          ) : null}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nEditGroupActions.propTypes = {\n  archived: PropTypes.bool,\n  can: PropTypes.shape({\n    archive: PropTypes.bool,\n    destroy: PropTypes.bool,\n  }),\n  slug: PropTypes.string,\n};\n\nexport default EditGroupActions;\n","import React from \"react\";\nimport { SubmissionError } from \"redux-form\";\nimport { useSelector, useStore } from \"react-redux\";\nimport { isEmpty } from \"lodash\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport GroupForm from \"./form\";\nimport EditGroupActions from \"./EditGroupActions\";\nimport { updateGroup } from \"actions/groups\";\nimport persistItem from \"helpers/items/persistItem\";\nimport TixxtPageTitle from \"../layout/TixxtPageTitle\";\nimport { fetchGroup } from \"./api\";\nimport { useQuery } from \"react-query\";\nimport { selectNetworkId } from \"../../selectors/environment\";\nimport { useLoadApp } from \"../appCreator/api\";\n\nexport default function EditGroup() {\n  const { groupSlug } = useParams();\n\n  const { data: group } = useQuery([\"group\", groupSlug], () =>\n    fetchGroup(groupSlug),\n  );\n  const store = useStore();\n  const networkId = useSelector(selectNetworkId);\n  const externalAppId = `network_${networkId}:group_category_${group?.group_category_id}:group_profile`;\n  const { data: app } = useLoadApp(\n    { externalAppId },\n    { enabled: !!group?.group_category_id },\n  );\n\n  const onSubmit = async (\n    values,\n    dispatch,\n    { externalAppId, externalItemId },\n  ) => {\n    const { profile, ...group } = values;\n\n    await persistItem(app, store.dispatch, {\n      externalAppId,\n      externalItemId,\n      values: profile,\n    });\n\n    const groupResult = await dispatch(\n      updateGroup({ groupSlug, body: { group } }),\n    );\n    if (groupResult.error) throw new SubmissionError();\n\n    return groupResult;\n  };\n\n  return (\n    <>\n      <TixxtPageTitle />\n      {!isEmpty(group) ? (\n        <>\n          {group.can.archive ? <EditGroupActions {...group} /> : null}\n          {!group.archived ? (\n            <GroupForm\n              {...group}\n              onSubmit={onSubmit}\n              formName={`group-${group.id}`}\n            />\n          ) : null}\n        </>\n      ) : null}\n    </>\n  );\n}\n","import React, { Fragment } from \"react\";\nimport { useSelector, useStore } from \"react-redux\";\nimport { isEmpty } from \"lodash\";\nimport { SubmissionError } from \"redux-form\";\nimport { useParams } from \"helpers/tixxt-router\";\n\nimport PageTitle from \"components/layout/PageTitle\";\nimport GroupForm from \"./form\";\nimport { groupCategorySelector, selectNetworkId } from \"selectors/environment\";\nimport { createGroup } from \"actions/groups\";\n\nimport persistItem from \"helpers/items/persistItem\";\nimport { fetchGroupDefaults } from \"./api\";\nimport { useQuery } from \"react-query\";\nimport { useLoadApp } from \"../appCreator/api\";\n\nexport default function NewGroup() {\n  const networkId = useSelector(selectNetworkId);\n  const { groupCategorySlug } = useParams();\n  const category = useSelector((state) =>\n    groupCategorySelector(state, groupCategorySlug),\n  );\n  const store = useStore();\n\n  const { data: groupDefaults, isLoading: loading } = useQuery(\n    [\"groupDefaults\", groupCategorySlug],\n    () => fetchGroupDefaults(groupCategorySlug),\n  );\n  const externalAppId = `network_${networkId}:group_category_${category.id}:group_profile`;\n  const { data: app } = useLoadApp({\n    externalAppId,\n  });\n\n  const onSubmit = async (values, dispatch, { externalAppId }) => {\n    const { profile, ...group } = values;\n    const { id: itemId } = await persistItem(app, store.dispatch, {\n      externalAppId,\n      values: profile,\n    });\n\n    const groupResult = await dispatch(\n      createGroup({\n        body: { group: { ...group, profile_id: itemId } },\n      }),\n    );\n    if (groupResult.error) throw new SubmissionError();\n\n    return groupResult;\n  };\n\n  return (\n    <Fragment>\n      <PageTitle\n        title={category.name}\n        subtitle={I18n.t(\"js.groups.new.create\")}\n      />\n      {!isEmpty(groupDefaults) && !loading ? (\n        <GroupForm\n          {...groupDefaults}\n          onSubmit={onSubmit}\n          group_category_id={category.id}\n          groupCategoryName={category.name}\n          formName={`group-new`}\n        />\n      ) : loading ? (\n        <i className=\"fa-regular fa-spinner fa-spin\" />\n      ) : null}\n    </Fragment>\n  );\n}\n","import React, { useState } from \"react\";\nimport { get, map } from \"lodash\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { useQuery } from \"react-query\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { solid } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { useDispatch } from \"react-redux\";\nimport { declineInvite, acceptInvite } from \"../../actions/invites\";\n\ntype Invitable = {\n  id: string;\n  slug: string;\n  name: string;\n  access: string;\n  teaser?: string;\n  images?: string;\n  member_count?: number;\n  activity_count?: number;\n};\n\ntype Author = {\n  id: string;\n  name: string;\n  detection_profile_field?: string;\n};\n\ntype GroupInvite = {\n  id: string;\n  invitable: Invitable;\n  author: Author;\n  additional_message: string;\n};\n\ntype GroupInvites = {\n  groupInvites: GroupInvite[];\n};\n\nfunction useFetchGroupInvites(options = {}) {\n  return useQuery<GroupInvites[]>(\n    [\"groupInvites\"],\n    () => fetchApi(\"/api/v1/invites?filter=groups&status=open&limit=50\"),\n    options,\n  );\n}\n\nfunction GroupInviteActions({ groupInviteId }: { groupInviteId: string }) {\n  const [inviteStatus, setInviteStatus] = useState(\"open\");\n  const dispatch = useDispatch();\n\n  const buttons = (\n    <div className=\"btn-group\">\n      <button\n        onClick={() =>\n          dispatch(acceptInvite({ inviteId: groupInviteId })) &&\n          setInviteStatus(\"accepted\")\n        }\n        className=\"btn btn-success\"\n        aria-label=\"accept invite\"\n      >\n        <i className=\"fa fa-plus mr-1\" />\n        {I18n.t(\"js.invites.actions.accept\")}\n      </button>\n      <button\n        onClick={() =>\n          dispatch(declineInvite({ inviteId: groupInviteId })) &&\n          setInviteStatus(\"rejected\")\n        }\n        className=\"btn btn-danger\"\n        aria-label=\"reject invite\"\n      >\n        <i className=\"fa fa-xmark mr-1\" />\n        {I18n.t(\"js.invites.actions.reject\")}\n      </button>\n    </div>\n  );\n\n  const hint = (\n    <div className=\"group-invite-reaction\">\n      {[\"accepted\", \"rejected\"].includes(inviteStatus)\n        ? I18n.t(`js.calendars.groups.invite.${inviteStatus}`)\n        : null}\n    </div>\n  );\n\n  if (inviteStatus === \"open\") {\n    return buttons;\n  } else {\n    return hint;\n  }\n}\n\nfunction GroupInvite({\n  id,\n  invitable,\n  author,\n  additional_message,\n}: GroupInvite) {\n  function checkIfPresent(value) {\n    return value !== undefined && value !== null;\n  }\n\n  return (\n    <li key={id} className=\"media space-x-5 py-6 px-1.5 justify-between \">\n      <div className=\"media-object h-16 w-16\">\n        {invitable.images ? (\n          <img\n            className=\"w-[inherit] h-[inherit]\"\n            src={get(invitable.images, [1, \"url\"])}\n            alt=\"group logo\"\n          />\n        ) : (\n          <FontAwesomeIcon\n            icon={solid(\"users\")}\n            className=\"fa-2xl text-gray-400 mx-auto block\"\n          />\n        )}\n      </div>\n      <div className=\"media-body -mt-1\">\n        {invitable.access === \"hidden\" ? (\n          <div className=\"text-lg\">{invitable.name}</div>\n        ) : (\n          <a\n            className=\"media-heading\"\n            href={`/groups/${invitable.slug}`}\n            aria-label={`${invitable.name} link`}\n          >\n            <div className=\"flex gap-1 items-center\">\n              {invitable.access === \"closed\" ? (\n                <FontAwesomeIcon icon={solid(\"lock\")} />\n              ) : undefined}\n              <div className=\"text-lg\">{invitable.name}</div>\n            </div>\n          </a>\n        )}\n        {author.name ? (\n          <div>\n            {I18n.t(\"js.invites.show.invited_by\")}\n            <a\n              className=\"text-muted text-sm ml-1\"\n              href={`/members/${author.id}`}\n              aria-label={`${author.name} profile link`}\n            >\n              {author.name}\n              {author.detection_profile_field\n                ? ` ${author.detection_profile_field}`\n                : undefined}\n            </a>\n          </div>\n        ) : undefined}\n        {additional_message ? (\n          <div>\n            <div className=\"font-semibold mt-4 mb-1\">\n              {I18n.t(\"js.groups.group.personal_message\")}\n            </div>\n            <div className=\"my-1 markdown-content prose whitespace-pre-line break-words\">\n              {additional_message}\n            </div>\n          </div>\n        ) : undefined}\n        {checkIfPresent(invitable.member_count) &&\n        checkIfPresent(invitable.activity_count) ? (\n          <div className=\"text-muted text-sm mb-2\">\n            {`${\n              invitable.member_count === 1\n                ? I18n.t(\"js.directory.group_row.member_count.one\")\n                : I18n.t(\"js.directory.group_row.member_count.other\", {\n                    count: invitable.member_count,\n                  })\n            }, ${\n              invitable.activity_count === 1\n                ? I18n.t(\"js.directory.group_row.activity.one\")\n                : I18n.t(\"js.directory.group_row.activity.other\", {\n                    count: invitable.activity_count,\n                  })\n            }`}\n          </div>\n        ) : undefined}\n        {invitable.teaser ? (\n          <div className=\"my-5 markdown-content prose whitespace-pre-line break-words\">\n            {invitable.teaser}\n          </div>\n        ) : undefined}\n      </div>\n      <div className=\"shrink-0\">\n        <GroupInviteActions groupInviteId={id} />\n      </div>\n    </li>\n  );\n}\n\nexport default function GroupInvites() {\n  const { isLoading, data: groupInvites } = useFetchGroupInvites();\n\n  return (\n    <div className=\"group-invites\">\n      <div className=\"text-lg font-semibold tixxt__pagetitle\">\n        {I18n.t(\"js.groups.invites.title\")}\n      </div>\n      <div className=\"invites-content\">\n        {!isLoading && groupInvites && groupInvites.length > 0 ? (\n          <ul className=\"unstyled media-list groups-list -mt-5\">\n            {map(groupInvites, (groupInvite: GroupInvite) => (\n              <GroupInvite {...groupInvite} />\n            ))}\n          </ul>\n        ) : (\n          <div className=\"alert alert-info\">\n            {I18n.t(\"js.directory.group_row.no_invites\")}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport EditGroup from \"./EditGroup\";\nimport NewGroup from \"./NewGroup\";\nimport GroupInvites from \"./Invites\";\n\nconst groupRoutes: RouteObject[] = [\n  { path: \"/groups/:groupSlug/edit\", element: <EditGroup />, forceTurbo: true }, // groups#edit runs profile initialization and must thus be called when accessing this route\n  { path: \"/groups/new/:groupCategorySlug\", element: <NewGroup /> },\n  { path: \"/invites\", element: <GroupInvites /> },\n];\n\nexport default groupRoutes;\n","import { createApiAction } from \"helpers/api\";\n\nexport const updateProfileStep = createApiAction({\n  method: \"PUT\",\n  endpoint: () => `/onboarding/profile`,\n  baseType: `/ONBOARDING/PROFILE`,\n});\n","import React, { useState } from \"react\";\nimport { useSelector, useStore } from \"react-redux\";\nimport { SubmissionError } from \"redux-form\";\n\nimport persistItem from \"helpers/items/persistItem\";\nimport { updateProfileStep } from \"actions/onboarding\";\nimport { selectNetworkId, currentMemberSelector } from \"selectors/environment\";\nimport MembershipForm from \"components/memberships/MembershipForm\";\nimport { useLoadApp } from \"../appCreator/api\";\n\nfunction ProfileOnboarding() {\n  const networkId = useSelector(selectNetworkId);\n  const externalAppId = `profile:${networkId}`;\n  const membershipId = useSelector(currentMemberSelector).id;\n  const externalItemId = membershipId;\n  const store = useStore();\n  const [redirectUrl, setRedirectUrl] = useState(\"/\");\n  const { data: app } = useLoadApp({\n    externalAppId,\n  });\n\n  const onSubmit = async (values, dispatch) => {\n    await persistItem(app, store.dispatch, {\n      externalAppId,\n      externalItemId,\n      values,\n    });\n\n    const onboardingResult = await dispatch(updateProfileStep({}));\n    if (onboardingResult.error) throw new SubmissionError();\n    setRedirectUrl(onboardingResult.redirect_to);\n  };\n\n  const onSubmitSuccess = () => {\n    window.location.href = redirectUrl;\n    toastr.success(I18n.t(\"js.saving_successful\"));\n  };\n\n  return (\n    <MembershipForm\n      externalAppId={externalAppId}\n      externalItemId={externalItemId}\n      onSubmitSuccess={onSubmitSuccess}\n      onSubmit={onSubmit}\n      title={I18n.t(\"js.apps.profile.edit.title\")}\n      allowSaveWithoutChange\n    />\n  );\n}\n\nexport default ProfileOnboarding;\n","import ProfileOnboarding from \"./ProfileOnboarding\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport React from \"react\";\n\nconst onboardingRoutes: RouteObject[] = [\n  {\n    path: \"/onboarding/profile\",\n    element: <ProfileOnboarding />,\n    forceTurbo: true,\n  },\n];\n\nexport default onboardingRoutes;\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport BackboneFeature from \"components/tixxt/BackboneFeature\";\n\nconst invitesRoutes: RouteObject[] = [\n  {\n    path: \"/administration/invites/new\",\n    element: (\n      <BackboneFeature\n        feature=\"Invites\"\n        action=\"newInvite\"\n        paramKeys={[\"group_slug\"]}\n      />\n    ),\n  },\n  {\n    path: \"/groups/:group_slug/administration/invites/new\",\n    element: (\n      <BackboneFeature\n        feature=\"Invites\"\n        action=\"newInvite\"\n        paramKeys={[\"group_slug\"]}\n      />\n    ),\n  },\n  {\n    path: \"/groups/:group_slug/membership_invites/new\",\n    element: (\n      <BackboneFeature\n        feature=\"Invites\"\n        action=\"newInvite\"\n        paramKeys={[\"group_slug\"]}\n      />\n    ),\n  },\n];\n\n/*\n * /invites/sent is rendered in backend but requires backbone views to render modals i.e. to refresh invites\n */\nconst legacyInvitesRoutes: RouteObject[] = [\n  {\n    path: \"/groups/:group_slug/administration/invites/sent\",\n    element: (\n      <BackboneFeature\n        feature=\"Invites\"\n        action=\"sentInvites\"\n        paramKeys={[\"group_slug\"]}\n      />\n    ),\n  },\n  {\n    path: \"/administration/invites/sent\",\n    element: (\n      <BackboneFeature\n        feature=\"Invites\"\n        action=\"sentInvites\"\n        paramKeys={[\"group_slug\"]}\n      />\n    ),\n  },\n];\n\nexport default invitesRoutes;\nexport { legacyInvitesRoutes };\n","import React, { Suspense, lazy } from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\n\nconst MemberMapPage = lazy(() => import(\"./MemberMapPage\"));\n\nconst mapRoutes: RouteObject[] = [\n  {\n    path: \"/map\",\n    element: (\n      <Suspense fallback={<div>Loading...</div>}>\n        <MemberMapPage />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/members/map\",\n    element: (\n      <Suspense fallback={<div>Loading...</div>}>\n        <MemberMapPage />\n      </Suspense>\n    ),\n  },\n  {\n    path: \"/groups/:groupSlug/map\",\n    element: (\n      <Suspense fallback={<div>Loading...</div>}>\n        <MemberMapPage />\n      </Suspense>\n    ),\n  },\n];\n\nexport default mapRoutes;\n","import React, { useEffect } from \"react\";\nimport { get } from \"lodash\";\nimport { useSelector } from \"react-redux\";\nimport { useMaxHeight } from \"../../hooks/useMaxHeight\";\n\nimport ChatList from \"./ChatList\";\nimport ChatRoom from \"./ChatRoom\";\nimport ChatNew from \"./ChatNew\";\n\nimport store from \"../../store\";\nimport chatReducer from \"../../reducers/chat\";\nimport chatSaga from \"../../sagas/chat\";\n\nfunction launchChat() {\n  const host = window.location.host;\n  const networkUrl = `https://${host}`;\n  const tokenUrl = \"/api/v1/chat_token\";\n  const socketUrl = `wss://${host}/api/chat/socket`;\n\n  const fetchCredentials = async () => {\n    const response = await fetch(tokenUrl, {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n    return await response.json();\n  };\n\n  // Add chat reducer and init its state\n  store.addReducers({ chat: chatReducer });\n  store.dispatch({ type: \"chat/INIT\", payload: { networkUrl } });\n\n  // Run the chat saga\n  store.runSaga(chatSaga, { fetchCredentials, socketUrl });\n}\n\nfunction MobileAppChat() {\n  const navigation = useSelector((state) => get(state, [\"chat\", \"navigation\"]));\n  const connected = useSelector((state) =>\n    get(state, [\"chat\", \"session\", \"connected\"]),\n  );\n  const authorizationError = useSelector((state) =>\n    get(state, [\"chat\", \"session\", \"authorizationError\"]),\n  );\n\n  const style = useMaxHeight();\n  useEffect(launchChat, []);\n\n  window.bridge?.setPageTitle(\n    I18n.t(\"js.administration.app_navigation_items.defaults.chat.label\"),\n  );\n\n  return (\n    <div\n      style={style}\n      className=\"mobile_app_chat__content chat flex flex-col -m-6\"\n    >\n      {authorizationError ? (\n        <div className=\"alert alert-danger w-full z-20\">\n          {I18n.t(\"js.chat.connection_failed\")}\n        </div>\n      ) : connected ? null : connected === false ? (\n        <div className=\"alert alert-warning w-full z-20\">\n          {I18n.t(\"js.chat.reconnecting\")}\n        </div>\n      ) : (\n        <div className=\"alert alert-info z-20\">\n          {I18n.t(\"js.chat.connecting\")}\n        </div>\n      )}\n      {navigation?.route === \"root\" ? <ChatList /> : null}\n      {navigation?.route === \"showChat\" ? (\n        <ChatRoom chatId={navigation.params.chatId} />\n      ) : null}\n      {navigation?.route === \"newChat\" ? <ChatNew /> : null}\n    </div>\n  );\n}\n\nexport default MobileAppChat;\n","import { useNavigate } from \"helpers/tixxt-router\";\nimport { useSelector } from \"react-redux\";\nimport { useEffect } from \"react\";\n\n// TODO move to store.tsx\ntype RootState = {\n  network: {\n    start_page?: string;\n  };\n};\n\nexport default function RedirectToStartpage() {\n  const navigate = useNavigate();\n  const startPage = useSelector((state: RootState) => state.network.start_page);\n\n  useEffect(() => {\n    if (startPage) navigate(startPage, { replace: true });\n  }, []);\n\n  return null;\n}\n","import activitystreamsRoutes from \"components/activitystreams/routes\";\nimport appointmentsRoutes from \"components/appointments/routes\";\nimport messagesRoutes from \"components/messages/routes\";\nimport filesRoutes from \"components/files/routes\";\nimport tasksRoutes from \"components/tasks/routes\";\nimport globalSearchRoutes from \"components/globalSearch/routes\";\nimport administrationRoutes from \"components/administration/routes\";\nimport directoryRoutes from \"components/directory/routes\";\nimport membershipRoutes from \"components/memberships/routes\";\nimport groupRoutes from \"components/groups/routes\";\nimport onboardingRoutes from \"components/onboarding/routes\";\nimport invitesRoutes from \"components/invites/routes\";\nimport mapRoutes from \"components/memberMap/routes\";\nimport chatRoutes from \"components/chat/routes\";\nimport RedirectToStartpage from \"components/tixxt/RedirectToStartpage\";\nimport React from \"react\";\n\nexport default [\n  ...activitystreamsRoutes,\n  ...appointmentsRoutes,\n  ...messagesRoutes,\n  ...filesRoutes,\n  ...tasksRoutes,\n  ...globalSearchRoutes,\n  ...administrationRoutes,\n  ...directoryRoutes,\n  ...membershipRoutes,\n  ...groupRoutes,\n  ...onboardingRoutes,\n  ...invitesRoutes,\n  ...mapRoutes,\n  ...chatRoutes,\n  { path: \"/\", element: <RedirectToStartpage /> },\n];\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport MobileAppChat from \"./MobileAppChat\";\n\nconst membershipRoutes: RouteObject[] = [\n  { path: \"/chat\", element: <MobileAppChat /> },\n];\n\nexport default membershipRoutes;\n","import { useEffect } from \"react\";\nimport { NavigateFunction, useNavigate } from \"helpers/tixxt-router\";\nimport {\n  originalPushState,\n  originalReplaceState,\n} from \"helpers/tixxt-router/history-events\";\n\nlet originalNavigate;\n\nfunction shimBackboneNavigate(navigate: NavigateFunction) {\n  originalNavigate = Backbone.history.navigate;\n  Backbone.history.navigate = function reactRouterNavigate(\n    path: string,\n    options?: { replace?: boolean; trigger?: boolean },\n  ) {\n    const currentPath = [\n      location.pathname,\n      location.search,\n      location.hash,\n    ].join(\"\");\n    if (currentPath !== path) {\n      debug(\n        \"[BackboneHistoryShim] navigate(\",\n        path,\n        {\n          replace: !!options?.replace,\n          trigger: options?.trigger !== undefined && options.trigger,\n        },\n        \")\",\n      );\n\n      // Handle rare case when backbone wants to update the url without triggering anything\n      if (options?.trigger !== undefined && !options?.trigger) {\n        if (options?.replace) {\n          originalReplaceState.call(history, null, \"\", path);\n        } else {\n          originalPushState.call(history, null, \"\", path);\n        }\n      } else {\n        navigate(path, { replace: !!options?.replace });\n      }\n    }\n  };\n}\n\nfunction restoreBackboneNavigate() {\n  Backbone.history.navigate = originalNavigate;\n}\n\nexport default function BackboneHistoryShim() {\n  const navigate = useNavigate();\n  useEffect(() => {\n    shimBackboneNavigate(navigate);\n    return restoreBackboneNavigate;\n  }, []);\n\n  return null;\n}\n","import React, { useEffect } from \"react\";\nimport {\n  matchRoutes,\n  navigate,\n  RouteObject,\n  useRoutes,\n} from \"helpers/tixxt-router\";\nimport appRoutes from \"../../routes\";\nimport BackboneHistoryShim from \"components/tixxt/BackboneHistoryShim\";\nimport invariant from \"invariant\";\nimport { memoize } from \"lodash\";\nimport { getConfirmationMessage } from \"../../hooks/useInterceptorPrompt\";\n\nlet spaRoot: HTMLElement | null;\n\nconst routes = Preload.current_member ? appRoutes : [];\n\nexport default function TixxtContent() {\n  const element = useRoutes(routes);\n\n  useEffect(() => {\n    if (element) toggleFrontend(\"spa\", { source: \"routes\" });\n  }, [element]);\n\n  return (\n    <>\n      {element}\n      <div id={\"backbone-root\"} />\n      <BackboneHistoryShim />\n      <TurboCompat routes={routes} />\n    </>\n  );\n}\n\nfunction TurboCompat({ routes }: { routes: RouteObject[] }) {\n  useEffect(() => {\n    function spaNavigateInstead(event) {\n      // Cancel visit if confirmation is required but not given\n      const confirmationMessage = getConfirmationMessage();\n      if (confirmationMessage && !confirm(confirmationMessage)) {\n        event.preventDefault();\n        return;\n      }\n\n      // Turn turbo:visit into spa navigate\n      const url = new URL(event.detail.url);\n      const match = matchRoutes(routes, url.pathname);\n      if (match && !match.forceTurbo) {\n        event.preventDefault();\n        navigate(url);\n      }\n    }\n\n    window.addEventListener(\"turbo:before-visit\", spaNavigateInstead);\n    return () => {\n      window.removeEventListener(\"turbo:before-visit\", spaNavigateInstead);\n    };\n  }, []);\n  return null;\n}\n\nfunction toggleFrontend(type: \"spa\" | \"turbo\", meta?: { source?: string }) {\n  if (!spaRoot) {\n    spaRoot = document.getElementById(\"spa-root\");\n    invariant(spaRoot, \"spa-root missing\");\n  }\n\n  if (type == \"spa\") {\n    if (spaRoot.classList.contains(\"hidden\")) {\n      debug(`⚛️ toggleFrontend spa (source=${meta?.source})`);\n      spaRoot.classList.toggle(\"hidden\", false);\n    }\n    document.getElementById(\"turbo-root\")?.classList.toggle(\"hidden\", true);\n  } else if (type == \"turbo\") {\n    if (!spaRoot.classList.contains(\"hidden\")) {\n      debug(`⚡️ toggleFrontend turbo (source=${meta?.source})`);\n      spaRoot.classList.toggle(\"hidden\", true);\n    }\n    document.getElementById(\"turbo-root\")?.classList.toggle(\"hidden\", false);\n  }\n}\n\nconst frontendByLocation = memoize(function (path: string) {\n  if (matchRoutes(routes, path)) {\n    return \"spa\";\n  } else {\n    return \"turbo\";\n  }\n});\n\nwindow.addEventListener(\"popstate\", () => {\n  toggleFrontend(frontendByLocation(location.pathname), { source: \"popstate\" });\n});\nwindow.addEventListener(\"turbo:render\", () => {\n  toggleFrontend(frontendByLocation(location.pathname), {\n    source: \"turbo:render\",\n  });\n});\n\nfunction nativeLocaleLinks(event) {\n  // prevent turbo from handling this link click\n  const url = new URL(event[\"detail\"].url);\n  if (url.searchParams.get(\"locale\")) event.preventDefault();\n}\n\nwindow.addEventListener(\"turbo:click\", nativeLocaleLinks);\n","import React, { useEffect, useState } from \"react\";\n\nfunction useSelectNavigation(\n  elementRef: React.RefObject<HTMLElement>,\n  items: any,\n  onSelect: (any?) => void,\n) {\n  const [cursor, setCursor] = useState(0);\n\n  function upHandler(e) {\n    switch (e.key) {\n      case \"ArrowDown\":\n        e.preventDefault();\n        return setCursor((prevState) =>\n          prevState < items.length - 1 ? prevState + 1 : prevState,\n        );\n      case \"ArrowUp\":\n        e.preventDefault();\n        return setCursor((prevState) =>\n          prevState > 0 ? prevState - 1 : prevState,\n        );\n      case \"Enter\":\n        e.preventDefault();\n        return onSelect();\n      default:\n        return;\n    }\n  }\n\n  useEffect(() => {\n    elementRef.current?.addEventListener(\"keydown\", upHandler);\n\n    return () => {\n      elementRef.current?.removeEventListener(\"keydown\", upHandler);\n    };\n  });\n\n  return {\n    cursor,\n    setCursor,\n  };\n}\n\nexport default useSelectNavigation;\n","import React from \"react\";\nimport { split, find, includes } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n  regular,\n  duotone,\n} from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { Item } from \"../../../@types/searchBar\";\n\nconst MODULE_WHITELIST = [\n  \"activities\",\n  \"messages\",\n  \"files\",\n  \"appointments\",\n  \"calendars\",\n  \"pages\",\n  \"items\",\n];\n\nfunction getModule(module: string) {\n  switch (module) {\n    case \"activitystreams\":\n      return \"activities\";\n    case \"calendars\":\n      return \"appointments\";\n    case \"apps\":\n      return \"items\";\n    case \"search\":\n      return getModuleFromQueryParams();\n    default:\n      return module;\n  }\n}\n\nfunction getModuleFromQueryParams() {\n  const urlParams = new URLSearchParams(window.location.search);\n  const module = urlParams.get(\"module\");\n\n  // needed to make typescript happy\n  if (!module) return;\n\n  if (includes(MODULE_WHITELIST, module)) {\n    return module;\n  }\n}\n\nexport function getIcon({ module }: Item, duo?: boolean) {\n  switch (module) {\n    case \"activities\":\n      return (\n        <FontAwesomeIcon\n          className={\"\"}\n          icon={duo ? duotone(\"earth-europe\") : regular(\"earth-europe\")}\n        />\n      );\n    case \"messages\":\n      return (\n        <FontAwesomeIcon\n          className={\"\"}\n          icon={duo ? duotone(\"inbox\") : regular(\"inbox\")}\n        />\n      );\n    case \"files\":\n      return (\n        <FontAwesomeIcon\n          className={\"\"}\n          icon={duo ? duotone(\"folder-open\") : regular(\"folder-open\")}\n        />\n      );\n    case \"appointments\":\n      return (\n        <FontAwesomeIcon\n          className={\"\"}\n          icon={duo ? duotone(\"calendar-day\") : regular(\"calendar-day\")}\n        />\n      );\n    case \"items\":\n      return (\n        <FontAwesomeIcon\n          className={\"\"}\n          icon={duo ? duotone(\"table\") : regular(\"table\")}\n        />\n      );\n    default:\n      return (\n        <FontAwesomeIcon\n          className={\"\"}\n          icon={duo ? duotone(\"compass\") : regular(\"compass\")}\n        />\n      );\n  }\n}\n\nexport function generateItems() {\n  const location = split(window.location.pathname, \"/\");\n\n  let module = getModule(location[1]);\n\n  const items: Item[] = [{}];\n\n  if (location[1] === \"groups\" && Preload && Preload.my_groups) {\n    const groupSlug = location[2];\n    const group = find(Preload.my_groups, { slug: location[2] });\n    module = getModule(location[3]);\n\n    if (group) {\n      items.unshift({\n        parentName: group.name,\n        groupSlug,\n      });\n\n      if (includes(MODULE_WHITELIST, module)) {\n        items.unshift({\n          parentName: group.name,\n          module,\n          groupSlug,\n        });\n      }\n    }\n  } else {\n    if (includes(MODULE_WHITELIST, module)) {\n      items.unshift({ module });\n    }\n  }\n\n  return items;\n}\n","import React, { useRef, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n  solid,\n  regular,\n  duotone,\n} from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { isEmpty, map } from \"lodash\";\nimport classNames from \"classnames\";\nimport useSelectNavigation from \"../../hooks/useSelectNavigation\";\nimport { generateItems, getIcon } from \"./searchBar/helpers\";\nimport { Item } from \"../../@types/searchBar\";\nimport { useNavigate, useSearchParams } from \"helpers/tixxt-router\";\nimport { stringify } from \"query-string\";\n\nexport default function SearchBar({ duo }: { duo?: boolean }) {\n  const ref = useRef<HTMLFormElement>(null);\n  const [searchParams] = useSearchParams();\n  const [text, setText] = useState(searchParams.get(\"q\") || \"\");\n  const [searchIsFocused, setSearchIsFocused] = useState(false);\n  const navigate = useNavigate();\n\n  const items = generateItems();\n\n  function onSearch(e) {\n    if (e) e.preventDefault();\n    const item = items[cursor];\n    if (!item) return;\n\n    let url = \"/search\";\n    if (item.groupSlug) url = `/groups/${item.groupSlug}${url}`;\n    navigate(`${url}?${stringify({ module: item.module, q: text })}`);\n  }\n\n  const { setCursor, cursor } = useSelectNavigation(ref, items, onSearch);\n\n  if (!Preload.current_member) return null;\n\n  return (\n    <form\n      className=\"search-bar flex items-center relative max-w-lg mx-auto flex-1 px-4\"\n      ref={ref}\n      onSubmit={onSearch}\n    >\n      <div className=\"relative w-full\">\n        <FontAwesomeIcon\n          className={classNames(\n            \"search-bar__icon absolute left-3 top-2.5 pointer-events-none\",\n            {\n              \"search-bar__focus\": searchIsFocused,\n            },\n          )}\n          icon={duo ? duotone(\"magnifying-glass\") : regular(\"magnifying-glass\")}\n        />\n\n        <input\n          onFocus={() => setSearchIsFocused(true)}\n          onBlur={() => {\n            setTimeout(() => setSearchIsFocused(false), 250);\n          }}\n          onChange={(e) => setText(e.target.value)}\n          value={text}\n          className={classNames(\n            \"search-bar__input w-full rounded-full bg-transparent border border-solid py-1 px-9 text-white focus-visible:outline-none\",\n            {\n              \"rounded-b-none rounded-t-2xl\": !isEmpty(text) && searchIsFocused,\n            },\n          )}\n        />\n        <div\n          className={classNames(\n            \"bg-white border-box absolute rounded-t-none rounded-b-2xl w-full -mt-[1px]\",\n            {\n              hidden: isEmpty(text) || !searchIsFocused,\n            },\n          )}\n        >\n          <ul className=\"flex flex-col divide-y divide-neutral\">\n            {map(items, (item: Item, index: number) => (\n              <li\n                key={index}\n                className={classNames(\n                  \"flex justify-between gap-2 p-2 last:rounded-b-2xl cursor-pointer\",\n                  {\n                    \"bg-primary/25\": index === cursor,\n                  },\n                )}\n                onMouseEnter={() => setCursor(index)}\n                onClick={onSearch}\n              >\n                <span className=\"truncate\">\n                  <FontAwesomeIcon\n                    className={classNames(\"search-bar__focus mr-2 text-sm\")}\n                    icon={\n                      duo\n                        ? duotone(\"magnifying-glass\")\n                        : regular(\"magnifying-glass\")\n                    }\n                  />\n                  {text}\n                </span>\n                <div className=\"flex gap-1\">\n                  {item.groupSlug && (\n                    <span className=\"rounded-full bg-primary/50 px-3 py-1 text-xs whitespace-nowrap truncate max-w-[125px]\">\n                      <FontAwesomeIcon\n                        className={\"\"}\n                        icon={duo ? duotone(\"users\") : regular(\"users\")}\n                      />\n                      <span className=\"ml-1\">{item.parentName}</span>\n                    </span>\n                  )}\n                  {item.module || !item.groupSlug ? (\n                    <span className=\"rounded-full bg-primary/50 px-3 py-1 text-xs whitespace-nowrap truncate max-w-[125px]\">\n                      {getIcon(item, duo)}\n                      <span className=\"ml-1\">\n                        {[\n                          undefined,\n                          \"activities\",\n                          \"messages\",\n                          \"files\",\n                          \"appointments\",\n                          \"pages\",\n                          \"items\",\n                        ].includes(item.module)\n                          ? I18n.t(`js.searchbar.${item.module || \"global\"}`)\n                          : item.module}\n                      </span>\n                    </span>\n                  ) : null}\n                </div>\n              </li>\n            ))}\n          </ul>\n        </div>\n        <button\n          className={classNames(\n            \"search-bar__delete-button absolute right-3 top-1.5\",\n            { top: isEmpty(text), \"search-bar__focus\": searchIsFocused },\n          )}\n          onClick={() => setText(\"\")}\n          type=\"reset\"\n        >\n          <FontAwesomeIcon\n            className={classNames(\"text-gray-200\", {\n              \"text-muted\": searchIsFocused,\n              hidden: isEmpty(text),\n            })}\n            icon={regular(\"xmark\")}\n          />\n        </button>\n      </div>\n\n      <button\n        className={classNames(\n          \"search-bar__button btn btn-primary rounded-full w-8 h-8 shrink-0 ml-2 p-0\",\n          {\n            invisible: isEmpty(text),\n          },\n        )}\n        type=\"submit\"\n      >\n        <FontAwesomeIcon className={\"w-[6px]\"} icon={solid(\"chevron-right\")} />\n      </button>\n    </form>\n  );\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { light, duotone } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { useSelector } from \"react-redux\";\nimport Notification from \"components/chat/shared/Notification\";\nimport { getAggregatedUnreadCount } from \"selectors/chat/chat\";\nimport { toggleChatbar } from \"../../../layout/togglebar\";\n\nexport default function ChatButton({ duo }: { duo?: boolean }) {\n  const chatCount = useSelector(getAggregatedUnreadCount);\n\n  return (\n    <button className=\"header__link relative\" onClick={toggleChatbar}>\n      <FontAwesomeIcon\n        className=\"chat__icon fa-xl\"\n        icon={duo ? duotone(\"comments\") : light(\"comments\")}\n      />\n      <Notification counter={chatCount} className={\"!absolute top-3 right-2\"} />\n    </button>\n  );\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n  regular,\n  light,\n  duotone,\n} from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { useSelector } from \"react-redux\";\nimport {\n  currentMemberSelector,\n  groupCategoriesSelector,\n  networkSelector,\n} from \"selectors/environment\";\nimport { map, filter } from \"lodash\";\nimport DropDown, { DropDownItem } from \"../shared/DropDown\";\nimport UnreadBadge from \"components/shared/UnreadBadge\";\nimport { useFeaturesUnreads } from \"api/unreads\";\nimport ChatButton from \"components/layout/userCentral/ChatButton\";\nimport classNames from \"classnames\";\nimport { AvailableUpdatesPayload } from \"components/layout/CustomerCentralUpdateCheck\";\n\nfunction NotificationPing({ className }: { className?: string }) {\n  return (\n    <span className={classNames(\"absolute top-4 right-4\", className)}>\n      <span className=\"animate-ping absolute inline-flex h-2 w-2 rounded-full opacity-75 bg-unread\" />\n      <span className=\"rounded-full absolute h-2 w-2 bg-unread\" />\n    </span>\n  );\n}\n\nfunction NotificationDropDownItems({\n  unreads,\n  className,\n}: {\n  unreads?:\n    | {\n        Notifications: number;\n        GroupInvites: number;\n        Calendars: number;\n      }\n    | undefined;\n  className?: string;\n}) {\n  return (\n    <>\n      <DropDownItem\n        url=\"/notifications\"\n        icon={regular(\"newspaper\")}\n        text={I18n.t(\"js.activitystreams.userbar.filter.notifications\")}\n        additional={<UnreadBadge count={unreads?.Notifications} />}\n        className={className}\n      />\n      <DropDownItem\n        url=\"/invites\"\n        icon={regular(\"envelope-open-text\")}\n        text={I18n.t(\"groups.invites.title\")}\n        additional={<UnreadBadge count={unreads?.GroupInvites} />}\n        className={className}\n      />\n      <DropDownItem\n        url=\"/appointments/invites\"\n        icon={regular(\"calendar-circle-user\")}\n        text={I18n.t(\"calendars.invites.title\")}\n        additional={<UnreadBadge count={unreads?.Calendars} />}\n        className={className}\n      />\n    </>\n  );\n}\n\nexport default function UserCentral({\n  duo,\n  availableUpdates,\n}: {\n  duo?: boolean;\n  availableUpdates: AvailableUpdatesPayload;\n}) {\n  const currentMember = useSelector(currentMemberSelector);\n  const network = useSelector(networkSelector);\n  const groupCategories = useSelector(groupCategoriesSelector);\n  const { data: unreads } = useFeaturesUnreads();\n\n  const unreadCount = unreads\n    ? unreads?.GroupInvites + unreads?.Calendars + unreads?.Notifications\n    : 0;\n\n  if (!currentMember) return null;\n\n  const administratableGroupCategories = filter(\n    groupCategories,\n    (cat) => cat.can.administrate,\n  );\n\n  return (\n    <ul className=\"user-central flex\">\n      <li className={\"hidden sm:flex\"}>\n        <button\n          className=\"header__link notifications__link relative\"\n          data-bs-toggle=\"dropdown\"\n        >\n          <FontAwesomeIcon\n            title=\"Neues\"\n            className=\"notifications__icon fa-xl\"\n            icon={duo ? duotone(\"bell\") : light(\"bell\")}\n          />\n          {unreadCount > 0 ? <NotificationPing /> : null}\n        </button>\n        <DropDown>\n          <NotificationDropDownItems unreads={unreads} />\n        </DropDown>\n      </li>\n\n      <li className={\"flex\"}>\n        <button\n          className=\"header__link\"\n          data-bs-toggle=\"dropdown\"\n          title={I18n.t(\"js.memberships.my_profile\")}\n        >\n          <img\n            className=\"menu__profile-image rounded-full w-9\"\n            src={currentMember.images.medium}\n            alt={currentMember.displayName}\n          />\n          <FontAwesomeIcon\n            icon={duotone(\"circle-chevron-down\")}\n            className={\"menu__indicator absolute right-2.5 bottom-2.5\"}\n          />\n          {availableUpdates?.length > 0 ? (\n            <NotificationPing className={\"right-2\"} />\n          ) : null}\n        </button>\n        <DropDown\n          className={\"user-central__dropdown-menu max-h-96 overflow-y-auto\"}\n        >\n          <NotificationDropDownItems\n            unreads={unreads}\n            className={\"sm:hidden\"}\n          />\n          <li className=\"divider sm:hidden\" />\n          <DropDownItem\n            url={`/members/${currentMember.id}`}\n            icon={regular(\"id-badge\")}\n            text={I18n.t(\"js.memberships.my_profile\")}\n          />\n          {currentMember.can.update_profile && (\n            <DropDownItem\n              url={`/members/${currentMember.id}/edit`}\n              icon={regular(\"user-pen\")}\n              text={I18n.t(\"js.layouts.user_central.edit_profile\")}\n            />\n          )}\n          {currentMember.can.update_registration && (\n            <DropDownItem\n              url=\"/users/edit\"\n              icon={regular(\"pen-to-square\")}\n              text={I18n.t(\"js.layouts.user_central.edit_registration\")}\n            />\n          )}\n          {currentMember?.can.update_profile && (\n            <DropDownItem\n              url={`/members/${currentMember.id}/settings/edit`}\n              icon={regular(\"gears\")}\n              text={I18n.t(\"js.layouts.user_central.edit_membership_settings\")}\n            />\n          )}\n          {currentMember && (\n            <DropDownItem\n              url={`/members/${currentMember.id}/ignored`}\n              icon={regular(\"eye\")}\n              text={I18n.t(\"js.memberships.userbar.ignored_members\")}\n            />\n          )}\n          {network.config.memberships?.change_requests?.enabled && (\n            <DropDownItem\n              url={`/change_requests/new`}\n              icon={regular(\"chart-user\")}\n              text={I18n.t(\"js.layouts.user_central.change_request\")}\n            />\n          )}\n\n          {network.can.administrate ||\n          administratableGroupCategories.length > 0 ||\n          network.can.version_and_updates ? (\n            <li className=\"divider\" />\n          ) : null}\n\n          {network.can.administrate && (\n            <DropDownItem\n              url=\"/administration\"\n              icon={regular(\"screwdriver-wrench\")}\n              text={I18n.t(\"js.layouts.user_central.administration\")}\n            />\n          )}\n          {map(administratableGroupCategories, (cat) => (\n            <DropDownItem\n              key={cat.id}\n              url={`/group-categories/${cat.slug}/administration`}\n              text={I18n.t(\"js.layouts.user_central.group_categories\", {\n                name: cat.plural_name,\n              })}\n            />\n          ))}\n\n          {network.can.version_and_updates && (\n            <DropDownItem\n              url={`/administration/update-zentrale`}\n              icon={regular(\"gear\")}\n              text={I18n.t(\"js.layouts.user_central.versions_and_updates\")}\n              additional={<UnreadBadge count={availableUpdates?.length} />}\n            />\n          )}\n          <li className=\"divider\" />\n          <DropDownItem\n            linkStyle=\"user-central__logout-link !text-danger\"\n            url=\"/users/sign_out\"\n            icon={regular(\"arrow-right-from-bracket\")}\n            text={I18n.t(\"js.layouts.user_central.sign_out\")}\n            method=\"delete\"\n            data-turbo=\"false\"\n            className={\"user-central__logout\"}\n          />\n        </DropDown>\n      </li>\n      {Preload.current_member?.can.chat ? (\n        <li className={\"flex chat__link\"}>\n          <ChatButton duo={duo} />\n        </li>\n      ) : null}\n    </ul>\n  );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../@types\";\nimport { clamp, toInteger } from \"lodash\";\n\nconst LARGE_BREAKPOINT = 1024;\n\n// Proportionally shrink the extended logo in combination with image banners on smaller than large screens\n// To always shrink logo on scroll set the following custom css\n//   .header__logo { --shrink-breakpoint: 9999999px }\n// Also adds the .header__content--logo-shrunken class when the logo is fully shrunken\nexport default function useLogoScrollResize() {\n  const logoRef = useRef<HTMLDivElement | null>(null);\n  const { logoType, bannerType } = useSelector((state: State) => state.theme);\n  let logoResizeBreakpoint = LARGE_BREAKPOINT;\n  if (logoRef.current) {\n    const resizeBreakpoint = getComputedStyle(logoRef.current)\n      .getPropertyValue(\"--shrink-breakpoint\")\n      ?.trim();\n    if (resizeBreakpoint && resizeBreakpoint.match(/^\\d+px$/))\n      logoResizeBreakpoint = toInteger(resizeBreakpoint.replace(\"px\", \"\"));\n  }\n  const [active, setActive] = useState(\n    logoType == \"extended\" &&\n      bannerType == \"image\" &&\n      window.innerWidth < logoResizeBreakpoint,\n  );\n\n  // Toggle active if logo and/or banner type changes\n  // Toggle active after resizing\n  useEffect(() => {\n    function toggleActive() {\n      setActive(\n        logoType == \"extended\" &&\n          bannerType == \"image\" &&\n          window.innerWidth < logoResizeBreakpoint,\n      );\n    }\n\n    toggleActive();\n    window.addEventListener(\"resize\", toggleActive);\n    return function () {\n      window.removeEventListener(\"resize\", toggleActive);\n    };\n  }, [logoType, bannerType, logoResizeBreakpoint]);\n\n  // Resize logo on scroll if active, event handler is not bound otherwise\n  useEffect(() => {\n    const logoEl = logoRef.current;\n\n    const navEl = document.getElementById(\"main-navigation\") as\n      | HTMLDivElement\n      | undefined;\n    if (!navEl || !logoEl) return;\n\n    const maxHeight = logoEl.clientHeight;\n    const maxWidth = logoEl.clientWidth;\n    const minHeight = 60;\n    const startShrink = navEl.offsetTop - logoEl.clientHeight;\n    let r: number | null = null; // has value if animation frame has been requested\n\n    function cleanUp() {\n      if (!logoEl) return;\n\n      logoEl.removeAttribute(\"style\");\n      document.body.style.removeProperty(\"--header-logo-height\");\n      (logoEl.parentNode as HTMLDivElement).classList.remove(\n        \"header__content--logo-shrunken\",\n      );\n    }\n\n    function onScroll() {\n      if (r) return;\n      if (!logoEl) return;\n\n      if (logoEl.hasAttribute(\"style\") && scrollY < startShrink) {\n        cleanUp();\n      } else if (\n        logoEl.clientHeight > minHeight ||\n        logoEl.clientHeight < maxHeight\n      ) {\n        r = requestAnimationFrame(() => {\n          const newHeight = clamp(\n            maxHeight - (scrollY - startShrink),\n            minHeight,\n            maxHeight,\n          );\n          logoEl.style.width = `${(newHeight / maxHeight) * maxWidth}px`;\n          document.body.style.setProperty(\n            \"--header-logo-height\",\n            `${newHeight}px`,\n          );\n          (logoEl.parentNode as HTMLDivElement).classList.toggle(\n            \"header__content--logo-shrunken\",\n            newHeight == minHeight,\n          );\n\n          r = null;\n        });\n      }\n    }\n\n    if (active) {\n      document.addEventListener(\"scroll\", onScroll);\n      if (scrollY >= startShrink) onScroll();\n    } else {\n      cleanUp();\n    }\n    return function () {\n      document.removeEventListener(\"scroll\", onScroll);\n    };\n  }, [active]);\n\n  return logoRef;\n}\n","import React, { useEffect, useState } from \"react\";\nimport Modal from \"components/shared/Modal\";\nimport { useQuery } from \"react-query\";\nimport { every } from \"lodash\";\nimport { useSelector } from \"react-redux\";\nimport { networkSelector } from \"selectors/environment\";\n\nimport moment from \"moment\";\nimport MarkdownTranslation from \"components/shared/MarkdownTranslation\";\n\ntype Props = {\n  children: ({\n    availableUpdates,\n  }: {\n    availableUpdates: AvailableUpdatesPayload;\n  }) => React.ReactNode;\n};\n\nexport type AvailableUpdatesPayload = {\n  name: string;\n  deadline: string;\n  release_notes_url: string;\n}[];\n\nconst setDeploymentOfferSeenDate = (\n  availableUpdates: AvailableUpdatesPayload,\n) =>\n  availableUpdates?.forEach(({ name }) =>\n    localStorage.setItem(\n      `deploymentOfferSeenDate[${name}]`,\n      new Date().toISOString(),\n    ),\n  );\n\nconst allDeploymentOffersSeen = (availableUpdates: AvailableUpdatesPayload) =>\n  every(availableUpdates, ({ name }) => {\n    const deploymentOffer = localStorage.getItem(\n      `deploymentOfferSeenDate[${name}]`,\n    );\n\n    return moment(deploymentOffer).isSame(moment(), \"day\");\n  });\n\nconst EMPTY = [];\n\nexport default function CustomerCentralUpdateCheck({ children }: Props) {\n  const network = useSelector(networkSelector);\n  const [showModal, setShowModal] = useState(false);\n\n  const { data: availableUpdates } = useQuery<AvailableUpdatesPayload>({\n    queryFn: () =>\n      fetch(\n        `${network.config.customer_central_url}/api/v1/available_upgrades`,\n        {\n          method: \"GET\",\n          headers: {\n            Authorization: `Bearer ${network?.customer_central_jwt}`,\n          },\n        },\n      ).then((res) => res.json()),\n    refetchInterval: 60000 * 5,\n    refetchOnWindowFocus: false,\n    staleTime: 60000 * 5,\n    enabled: network.can.version_and_updates || false,\n    retry: false,\n  });\n\n  useEffect(() => {\n    if (!availableUpdates) return;\n\n    if (allDeploymentOffersSeen(availableUpdates)) return;\n    setShowModal(true);\n  }, [availableUpdates]);\n\n  return (\n    <>\n      {showModal && availableUpdates && availableUpdates.length > 0 ? (\n        <Modal\n          title={I18n.t(\"js.customer_central.deployment_offer.modal_title\")}\n          onClose={() => setDeploymentOfferSeenDate(availableUpdates)}\n        >\n          <div className=\"flex flex-col gap-4\">\n            <MarkdownTranslation\n              translation={\"js.customer_central.deployment_offer.modal_body_md\"}\n              options={{\n                release_notes_url: availableUpdates[0].release_notes_url,\n                days_till_deadline: moment(availableUpdates[0].deadline).diff(\n                  moment(),\n                  \"days\",\n                ),\n              }}\n            />\n            <a\n              className=\"btn btn-primary btn-lg mt-24\"\n              target=\"_blank\"\n              href=\"/administration/update-zentrale/login\"\n            >\n              {I18n.t(\n                \"js.customer_central.deployment_offer.open_customer_central\",\n              )}\n            </a>\n          </div>\n        </Modal>\n      ) : null}\n      {children({ availableUpdates: availableUpdates || EMPTY })}\n    </>\n  );\n}\n","import React, { useEffect, useState } from \"react\";\nimport Modal from \"components/shared/Modal\";\nimport { useSelector } from \"react-redux\";\nimport { networkSelector } from \"selectors/environment\";\nimport MarkdownTranslation from \"components/shared/MarkdownTranslation\";\n\nexport default function TeamsRenewOAuthCredentialsCheck() {\n  const network = useSelector(networkSelector);\n  const [showModal, setShowModal] = useState(false);\n\n  useEffect(() => {\n    setShowModal(!!network?.teams_configuration?.show_renew_secret_modal);\n  }, []);\n\n  return (\n    <>\n      {showModal ? (\n        <Modal title={I18n.t(\"js.teams.renew_oauth_credentials.modal_title\")}>\n          <div className=\"flex flex-col gap-4\">\n            <MarkdownTranslation\n              translation={\"js.teams.renew_oauth_credentials.modal_body_md\"}\n              options={{}}\n            />\n          </div>\n        </Modal>\n      ) : null}\n    </>\n  );\n}\n","import React from \"react\";\n\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { light, duotone } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { useSelector } from \"react-redux\";\nimport { networkSelector } from \"selectors/environment\";\nimport SearchBar from \"components/layout/SearchBar\";\nimport UserCentral from \"components/layout/UserCentral\";\nimport { useFeaturesUnreads } from \"api/unreads\";\nimport UnreadBadge from \"components/shared/UnreadBadge\";\nimport { map, omit, sum, values } from \"lodash\";\nimport { State } from \"../../@types\";\nimport useLogoScrollResize from \"./useLogoScrollResize\";\nimport CustomerCentralUpdateCheck from \"components/layout/CustomerCentralUpdateCheck\";\nimport TeamsRenewOAuthCredentialsCheck from \"components/layout/TeamsRenewOAuthCredentialsCheck\";\n\nexport default function TixxtHeader() {\n  const network = useSelector(networkSelector);\n  const theme = useSelector((state: State) => state.theme);\n  const groupCategoryTheme = useSelector(\n    (state: State) => state.groupCategoryTheme,\n  );\n  const groupTheme = useSelector((state: State) => state.groupTheme);\n  let logoUrl = theme.override\n    ? `/api/storage/assets/${theme.logoImage?.id}/preview`\n    : theme.logoUrl;\n  if (groupCategoryTheme?.logoUrl) logoUrl = groupCategoryTheme.logoUrl;\n  if (groupTheme?.logoUrl) logoUrl = groupTheme.logoUrl;\n\n  const duo = theme?.userbarIconType == \"duotone\";\n  const { data: unreads } = useFeaturesUnreads();\n\n  const unreadCount =\n    sum(\n      values(omit(unreads, [\"Invites\", \"Notifications\", \"GroupJoinRequests\"])),\n    ) + sum(map(unreads?.GroupJoinRequests, \"open_join_requests\"));\n\n  const logoRef = useLogoScrollResize();\n\n  return (\n    <>\n      <div className={\"header__content\"}>\n        <button className=\"header__burger relative\" data-togglebar={\"userbar\"}>\n          <FontAwesomeIcon\n            icon={duo ? duotone(\"bars\") : light(\"bars\")}\n            className={\"fa-xl\"}\n          />\n          <UnreadBadge\n            count={unreadCount}\n            className={\"absolute top-1 right-1\"}\n          />\n        </button>\n        <div className={\"header__logo\"} ref={logoRef}>\n          <a\n            className=\"header__logo-link\"\n            href={\"/\"}\n            data-turbo={\"false\"}\n            data-override={theme.override}\n          >\n            {logoUrl ? (\n              <img\n                className=\"header__logo-img\"\n                src={logoUrl}\n                alt={network.name}\n              />\n            ) : (\n              network.name\n            )}\n          </a>\n        </div>\n        <div className={\"header__home-icon\"}>\n          <a className=\"header__link relative\" href={\"/\"} data-turbo={\"false\"}>\n            <FontAwesomeIcon\n              title=\"Start\"\n              className=\"home-icon fa-xl\"\n              icon={duo ? duotone(\"house\") : light(\"house\")}\n            />\n          </a>\n        </div>\n        <div className={\"header__search\"}>\n          <SearchBar duo={duo} />\n        </div>\n        <div className={\"header__user-central\"}>\n          <CustomerCentralUpdateCheck>\n            {({ availableUpdates }) => (\n              <UserCentral duo={duo} availableUpdates={availableUpdates} />\n            )}\n          </CustomerCentralUpdateCheck>\n        </div>\n        <TeamsRenewOAuthCredentialsCheck />\n      </div>\n      <div className=\"header__banner\" />\n    </>\n  );\n}\n","import { useEffect, useRef } from \"react\";\nimport { omit } from \"lodash\";\nimport {\n  storeOverrideTheme,\n  useTheme,\n} from \"components/administration/designManager/useTheme\";\nimport { DerivedTheme } from \"components/administration/designManager/types\";\nimport themeToCss from \"components/administration/designManager/themeToCss\";\n\nfunction applyStyleOverride(\n  styleEl: React.MutableRefObject<HTMLStyleElement | undefined>,\n  theme: DerivedTheme,\n) {\n  /* Create style tag to apply theme overrides */\n  if (!styleEl.current) {\n    styleEl.current = document.createElement(\"style\");\n    styleEl.current.type = \"text/css\";\n    styleEl.current.setAttribute(\"data-theme-source\", \"override\");\n  }\n  styleEl.current.textContent = themeToCss(theme);\n  if (!styleEl.current.isConnected) document.head.appendChild(styleEl.current);\n}\n\nfunction applyFaviconOverride(\n  linkEl: React.MutableRefObject<HTMLLinkElement | undefined>,\n  theme: DerivedTheme,\n) {\n  /* Create link tag to apply favicon override */\n  if (!linkEl.current) {\n    linkEl.current = document.createElement(\"link\");\n    linkEl.current.setAttribute(\"data-theme-source\", \"override\");\n  }\n  if (theme.faviconImage) {\n    linkEl.current.href = `/api/storage/assets/${theme.faviconImage.id}/preview`;\n    if (theme.faviconImage.extension == \"ico\") {\n      linkEl.current.rel = \"shortcut icon\";\n      linkEl.current.type = \"image/x-icon\";\n    } else {\n      linkEl.current.rel = \"icon\";\n      linkEl.current.type = \"image/png\";\n    }\n    if (!linkEl.current.isConnected) document.head.appendChild(linkEl.current);\n  } else {\n    if (linkEl.current.isConnected) document.head.removeChild(linkEl.current);\n  }\n}\n\nfunction removeStyleOverride(\n  styleEl: React.MutableRefObject<HTMLStyleElement | undefined>,\n) {\n  if (styleEl.current) document.head.removeChild(styleEl.current);\n}\n\nexport default function ApplyOverrideTheme() {\n  const theme = useTheme();\n  const styleEl = useRef<HTMLStyleElement>();\n  const faviconEl = useRef<HTMLLinkElement>();\n\n  useEffect(() => {\n    if (theme.override) {\n      applyStyleOverride(styleEl, theme);\n      applyFaviconOverride(faviconEl, theme);\n      storeOverrideTheme(omit(theme, [\"derivedColors\"]));\n    } else if (styleEl.current?.isConnected) {\n      removeStyleOverride(styleEl);\n      storeOverrideTheme(null);\n    }\n\n    function toggleBodyClasses(event) {\n      event.detail.newBody.classList.toggle(\n        \"tixxt--full\",\n        theme?.fullWidth === true,\n      );\n    }\n\n    document.addEventListener(\"turbo:before-render\", toggleBodyClasses);\n    toggleBodyClasses({ detail: { newBody: document.body } });\n\n    return () => {\n      document.removeEventListener(\"turbo:before-render\", toggleBodyClasses);\n    };\n  }, [theme]);\n\n  return null;\n}\n","import React, { MutableRefObject, useContext, useEffect, useRef } from \"react\";\nimport { Theme } from \"components/administration/designManager/types\";\nimport { lightThemeToCss } from \"components/administration/designManager/themeToCss\";\nimport { compact, every, find, isEmpty, isEqual } from \"lodash\";\nimport { Group, GroupCategory, State } from \"../../../@types\";\nimport { useParams, useSearchParams } from \"helpers/tixxt-router\";\nimport invariant from \"invariant\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n  resetTheme as groupCategoryResetTheme,\n  setTheme as groupCategorySetTheme,\n} from \"components/administration/designManagerLight/groupCategoryThemeSlice\";\n\nimport {\n  setTheme as groupSetTheme,\n  resetTheme as groupResetTheme,\n} from \"components/administration/designManagerLight/groupThemeSlice\";\n\nconst themeSliceActions = {\n  group: {\n    setTheme: groupSetTheme,\n    resetTheme: groupResetTheme,\n  },\n  groupCategory: {\n    setTheme: groupCategorySetTheme,\n    resetTheme: groupCategoryResetTheme,\n  },\n};\n\nexport function applyStyleOverride(\n  styleEl: React.MutableRefObject<HTMLStyleElement | undefined>,\n  theme: Theme,\n) {\n  /* Create style tag to apply theme overrides */\n  if (!styleEl.current) {\n    styleEl.current = document.createElement(\"style\");\n    styleEl.current.type = \"text/css\";\n    styleEl.current.setAttribute(\"data-theme-source\", \"override\");\n  }\n  styleEl.current.textContent = lightThemeToCss({\n    ...theme,\n    override: true,\n  } as Theme);\n  if (!styleEl.current.isConnected) document.head.appendChild(styleEl.current);\n}\n\nexport function removeStyleOverride(\n  styleEl: React.MutableRefObject<HTMLStyleElement | undefined>,\n) {\n  if (styleEl.current && document.head.contains(styleEl.current))\n    document.head.removeChild(styleEl.current);\n}\n\nexport function appointmentIdToGroupSlugs(appointmentId): string[] {\n  const appointment = Tixxt.Calendars.Appointment.all().get(appointmentId);\n\n  const calendarParentIds =\n    appointment\n      ?.calendars()\n      .filter({ attributes: { type: \"group\" } })\n      .map((as) => as.get(\"parent_id\"))\n      .value() || [];\n\n  return compact(\n    calendarParentIds.map((ci) => find(Preload.my_groups, { id: ci })?.slug),\n  );\n}\n\nexport function fileIdToGroupSlugs(fileId): string[] {\n  return Tixxt.Files.File.all().get(fileId)?.attributes?.group_slugs;\n}\n\nexport function folderIdToGroupSlugs(folderId): string[] {\n  const group = groupFromId(\n    Tixxt.Files.Folder.all().get(folderId)?.attributes?.group_id,\n  );\n\n  return compact([group?.slug]);\n}\n\nexport function taskIdToGroupSlugs(taskId): string[] {\n  return compact([\n    Tixxt.Tasks.controller?.currentCollection?.get(taskId)?.attributes?.context\n      ?.first_stream_slug,\n  ]);\n}\n\nexport function groupFromId(id: string): Group | undefined {\n  return find(Preload.my_groups, { id });\n}\n\nexport function groupsFromSlugs(slugs: string[]): Group[] {\n  return compact(slugs.map((slug) => find(Preload.my_groups, { slug })));\n}\n\nexport function activityIdToGroupSlugs(activityId) {\n  const activity = Tixxt.Activitystreams.Activity.all().get(activityId);\n  const groupSlugs =\n    activity\n      ?.activitystreams()\n      .map((as) => as.get(\"group_slug\"))\n      .value() || [];\n\n  // returns empty array when the activity is also posted in a global activitystream\n  // if (groupSlugs.includes(undefined)) return [];\n  // TODO: Warum hatten wir das hier gemacht? Das sorgt dafür,\n  // dass bei einem Beitrag, welcher auch in einem globalen Aktivitystream liegt,\n  // das Gruppen-/ GruppenCategoryTheme nicht angezeigt wird\n\n  return groupSlugs;\n}\n\nexport function groupCategoriesFromGroups(groups: Group[]): GroupCategory[] {\n  return compact(\n    groups.map((group) =>\n      find(Preload.current_network.group_categories, {\n        id: group?.category_id,\n      }),\n    ),\n  );\n}\n\nexport function groupCategoriesFromSlugs(slugs: string[]): GroupCategory[] {\n  return compact(\n    slugs.map((slug) =>\n      find(Preload.current_network.group_categories, { slug }),\n    ),\n  );\n}\n\nexport function sameTheme(\n  themeParents: GroupCategory[] | Group[] | undefined,\n): boolean {\n  if (!themeParents) return false;\n  const isSameTheme = (themeParent) => {\n    return themeParents[0].active_theme == themeParent.active_theme;\n  };\n\n  return every(themeParents, isSameTheme);\n}\n\nexport type SlugsState = { slugs: string[]; previousSlug: string | null };\nexport const SlugsContext = React.createContext<\n  React.Dispatch<React.SetStateAction<SlugsState>>\n>(() => {\n  void 0;\n});\n\nexport function GroupsFromSlug() {\n  const { contextSlug } = useParams();\n  invariant(contextSlug, \"GroupsFromSlug used in route without :contextSlug\");\n\n  const setSlugsState = useContext(SlugsContext);\n\n  useEffect(() => {\n    setSlugsState({ slugs: [contextSlug], previousSlug: contextSlug });\n  }, [contextSlug]);\n\n  return null;\n}\n\nexport function GroupsFromActivityId() {\n  const { activityId } = useParams();\n  const setSlugsState = useContext(SlugsContext);\n\n  useEffect(() => {\n    const resolve = () =>\n      setSlugsState((state) => ({\n        ...state,\n        slugs: activityIdToGroupSlugs(activityId),\n      }));\n\n    resolve();\n    Tixxt.Activitystreams.Activity.all().on(\"sync\", resolve);\n    Tixxt.Activitystreams.Activitystream.all().on(\"sync\", resolve);\n\n    return () => {\n      Tixxt.Activitystreams.Activity.all().off(\"sync\", resolve);\n      Tixxt.Activitystreams.Activitystream.all().off(\"sync\", resolve);\n    };\n  }, [activityId]);\n\n  return null;\n}\n\nexport function GroupsFromAppointmentId() {\n  const { appointmentId } = useParams();\n  const setSlugsState = useContext(SlugsContext);\n\n  useEffect(() => {\n    const resolve = () => {\n      setSlugsState((state) => ({\n        ...state,\n        slugs: appointmentIdToGroupSlugs(appointmentId),\n      }));\n    };\n\n    resolve();\n    Tixxt.Calendars.Appointment.all().on(\"sync\", resolve);\n\n    return () => {\n      Tixxt.Calendars.Appointment.all().off(\"sync\", resolve);\n    };\n  }, [appointmentId]);\n\n  return null;\n}\n\nexport function GroupsFromTaskId() {\n  const { taskId } = useParams();\n  const setSlugsState = useContext(SlugsContext);\n\n  useEffect(() => {\n    setSlugsState((state) => ({\n      ...state,\n      slugs: taskIdToGroupSlugs(taskId),\n    }));\n  }, [taskId]);\n\n  return null;\n}\n\nexport function GroupsFromFolderId() {\n  const { paramsFolderId } = useParams();\n  const [searchParams] = useSearchParams();\n  const queryFolderId = searchParams.get(\"folder_id\");\n\n  const folderId = paramsFolderId || queryFolderId;\n  const setSlugsState = useContext(SlugsContext);\n\n  useEffect(() => {\n    const resolve = () => {\n      setSlugsState((state) => ({\n        ...state,\n        slugs: folderIdToGroupSlugs(folderId),\n      }));\n    };\n\n    resolve();\n    Tixxt.Files.Folder.all().on(\"sync\", resolve);\n    return () => {\n      Tixxt.Files.Folder.all().off(\"sync\", resolve);\n    };\n  }, [folderId]);\n\n  return null;\n}\n\nexport function GroupsFromFileId() {\n  const { fileId } = useParams();\n  const setSlugsState = useContext(SlugsContext);\n\n  useEffect(() => {\n    const resolve = () => {\n      setSlugsState((state) => ({\n        ...state,\n        slugs: fileIdToGroupSlugs(fileId),\n      }));\n    };\n\n    resolve();\n    Tixxt.Files.File.all().on(\"sync\", resolve);\n    return () => {\n      Tixxt.Files.File.all().off(\"sync\", resolve);\n    };\n  }, [fileId]);\n\n  return null;\n}\n\nexport function NoSlugs() {\n  const setSlugsState = useContext(SlugsContext);\n  useEffect(() => {\n    setSlugsState({ slugs: [], previousSlug: null });\n  }, []);\n\n  return null;\n}\n\nconst selectors = {\n  network: (state: State) => state.theme,\n  groupCategory: (state: State) => state.groupCategoryTheme,\n  group: (state: State) => state.groupTheme,\n};\n\nexport const HandleContextHeader = React.memo(function HandleContextHeader({\n  slugs,\n  relevantContext,\n  lastContext,\n  type,\n}: {\n  slugs: string[];\n  relevantContext: GroupCategory[] | Group[] | undefined;\n  lastContext: MutableRefObject<Group | GroupCategory | undefined>;\n  type: \"group\" | \"groupCategory\";\n}) {\n  const styleEl = useRef<HTMLStyleElement>();\n  const dispatch = useDispatch();\n  const activeTheme = useSelector(selectors[type]);\n\n  // This sets state.groupTheme or state.groupCategoryTheme when slugs change\n  useEffect(() => {\n    if (!relevantContext) return;\n\n    // the first element is used because the slug either comes from the path so only one is available,\n    // from the last context so only one is available,\n    // or from the activity/ appointment object so it is only interesting if all the `groupCategories` have the same Theme\n    const context = relevantContext[0];\n    const hasSameTheme = sameTheme(relevantContext);\n\n    if (lastContext.current == context) return;\n    lastContext.current = context;\n\n    if (!context?.active_theme || !hasSameTheme) {\n      if (!isEmpty(activeTheme)) dispatch(themeSliceActions[type].resetTheme());\n    } else {\n      dispatch(themeSliceActions[type].setTheme(context.active_theme));\n    }\n  }, [slugs]);\n\n  // This applies styles from theme from state\n  useEffect(() => {\n    if (!isEmpty(activeTheme)) {\n      applyStyleOverride(styleEl, activeTheme);\n    } else {\n      removeStyleOverride(styleEl);\n    }\n  }, [activeTheme]);\n\n  return null;\n}, isEqual);\n\nexport function Noop() {\n  return null;\n}\n","import React, { useRef, useState } from \"react\";\nimport { compact, first } from \"lodash\";\nimport { useRoutes } from \"helpers/tixxt-router\";\nimport { Group } from \"../../../@types\";\nimport {\n  groupsFromSlugs,\n  GroupsFromSlug,\n  GroupsFromActivityId,\n  GroupsFromAppointmentId,\n  GroupsFromFileId,\n  GroupsFromTaskId,\n  NoSlugs,\n  HandleContextHeader,\n  GroupsFromFolderId,\n  Noop,\n  SlugsState,\n  SlugsContext,\n} from \"components/administration/designManagerLight/functions\";\n\nfunction pickRelevantGroups({ slugs, previousSlug }): Group[] | undefined {\n  if (previousSlug && slugs?.includes(previousSlug)) {\n    const group = first(groupsFromSlugs(compact([previousSlug])));\n    if (group) return [group] as Group[];\n  }\n\n  if (!slugs) return;\n\n  return groupsFromSlugs(slugs);\n}\n\nconst routes = [\n  {\n    path: \"/groups/:contextSlug/administration/designs/:designId/*\",\n    element: <Noop />,\n  },\n  { path: \"/groups/:contextSlug/*\", element: <GroupsFromSlug /> },\n  { path: \"/activities/:activityId\", element: <GroupsFromActivityId /> },\n  {\n    path: \"/appointments/:appointmentId\",\n    element: <GroupsFromAppointmentId />,\n  },\n  {\n    path: \"/appointments/:appointmentId/*\",\n    element: <GroupsFromAppointmentId />,\n  },\n  { path: \"/files/folders/new\", element: <GroupsFromFolderId /> },\n  { path: \"/files/folders/:folderId\", element: <GroupsFromFolderId /> },\n  { path: \"/files/:fileId\", element: <GroupsFromFileId /> },\n  { path: \"/tasks/:taskId\", element: <GroupsFromTaskId /> },\n  { path: \"/tasks/:taskId/*\", element: <GroupsFromTaskId /> },\n  { path: \"*\", element: <NoSlugs /> },\n];\n\nexport default function ApplyOverrideGroupTheme() {\n  const [state, setState] = useState<SlugsState>({\n    slugs: [],\n    previousSlug: null,\n  });\n  const lastContext = useRef<Group>();\n  const element = useRoutes(routes);\n\n  return (\n    <>\n      <HandleContextHeader\n        slugs={state.slugs}\n        relevantContext={pickRelevantGroups(state)}\n        lastContext={lastContext}\n        type={\"group\"}\n      />\n      <SlugsContext.Provider value={setState}>{element}</SlugsContext.Provider>\n    </>\n  );\n}\n","import React, { useRef, useState } from \"react\";\nimport { first, uniq } from \"lodash\";\nimport { useRoutes } from \"helpers/tixxt-router\";\nimport { GroupCategory } from \"../../../@types\";\nimport {\n  groupsFromSlugs,\n  groupCategoriesFromSlugs,\n  groupCategoriesFromGroups,\n  GroupsFromActivityId,\n  GroupsFromFileId,\n  GroupsFromSlug,\n  GroupsFromTaskId,\n  GroupsFromAppointmentId,\n  NoSlugs,\n  HandleContextHeader,\n  GroupsFromFolderId,\n  Noop,\n  SlugsState,\n  SlugsContext,\n} from \"components/administration/designManagerLight/functions\";\n\nfunction pickRelevantGroupCategories({\n  slugs,\n  previousSlug,\n}): GroupCategory[] | undefined {\n  if (previousSlug && slugs?.includes(previousSlug)) {\n    const groupCategory = first(groupCategoriesFromSlugs([previousSlug]));\n    if (groupCategory) return [groupCategory] as GroupCategory[];\n  }\n\n  if (!slugs) return undefined;\n\n  const groups = groupsFromSlugs(slugs);\n  return uniq([\n    ...groupCategoriesFromGroups(groups),\n    ...groupCategoriesFromSlugs(slugs),\n  ]);\n}\n\nconst routes = [\n  {\n    path: \"/groups/:contextSlug/administration/designs/:designId/*\",\n    element: <Noop />,\n  },\n  {\n    path: \"/groups/:contextSlug/*\",\n    element: <GroupsFromSlug />,\n  },\n  {\n    path: \"/group-categories/:contextSlug/administration/designs/:designId/*\",\n    element: <Noop />,\n  },\n  {\n    path: \"/group-categories/:contextSlug/*\",\n    element: <GroupsFromSlug />,\n  },\n  {\n    path: \"/activities/:activityId\",\n    element: <GroupsFromActivityId />,\n  },\n  {\n    path: \"/appointments/:appointmentId\",\n    element: <GroupsFromAppointmentId />,\n  },\n  {\n    path: \"/appointments/:appointmentId/*\",\n    element: <GroupsFromAppointmentId />,\n  },\n  {\n    path: \"/files/folders/new\",\n    element: <GroupsFromFolderId />,\n  },\n  {\n    path: \"/files/folders/:folderId\",\n    element: <GroupsFromFolderId />,\n  },\n  {\n    path: \"/files/:fileId\",\n    element: <GroupsFromFileId />,\n  },\n  {\n    path: \"/tasks/:taskId\",\n    element: <GroupsFromTaskId />,\n  },\n  {\n    path: \"/tasks/:taskId/*\",\n    element: <GroupsFromTaskId />,\n  },\n  {\n    path: \"*\",\n    element: <NoSlugs />,\n  },\n];\n\nexport default function ApplyOverrideGroupCategoryTheme() {\n  const [state, setState] = useState<SlugsState>({\n    slugs: [],\n    previousSlug: null,\n  });\n  const lastContext = useRef<GroupCategory>();\n  const element = useRoutes(routes);\n\n  return (\n    <>\n      <HandleContextHeader\n        slugs={state.slugs}\n        relevantContext={pickRelevantGroupCategories(state)}\n        lastContext={lastContext}\n        type={\"groupCategory\"}\n      />\n      <SlugsContext.Provider value={setState}>{element}</SlugsContext.Provider>\n    </>\n  );\n}\n","import React from \"react\";\nimport SearchBar from \"components/layout/SearchBar\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../@types\";\n\nexport default function AppSearchHeader() {\n  const theme = useSelector((state: State) => state.theme);\n  const duo = theme?.userbarIconType == \"duotone\";\n\n  return (\n    <div id=\"app__header\" className=\"header__content\">\n      <SearchBar duo={duo} />\n    </div>\n  );\n}\n","import React, { useEffect } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { QueryClientProvider } from \"react-query\";\nimport { Provider } from \"react-redux\";\nimport store from \"../store\";\nimport queryClient from \"../helpers/queryClient\";\nimport {\n  HeaderPortal,\n  UserbarPortal,\n  ChatbarPortal,\n  ContentPortal,\n} from \"components/layout/portals\";\nimport TixxtUserbar from \"components/layout/TixxtUserbar\";\nimport TixxtChatbar from \"components/layout/TixxtChatbar\";\nimport TixxtContent from \"components/layout/TixxtContent\";\nimport TixxtHeader from \"components/layout/TixxtHeader\";\nimport { StaticTixxtGroupNavigation } from \"components/layout/TixxtGroupNavigation\";\nimport { StaticTixxtPageTitle } from \"components/layout/TixxtPageTitle\";\nimport ApplyOverrideTheme from \"components/administration/designManager/ApplyOverrideTheme\";\nimport ApplyOverrideGroupTheme from \"components/administration/designManagerLight/ApplyOverrideGroupTheme\";\nimport ApplyOverrideGroupCategoryTheme from \"./administration/designManagerLight/ApplyOverrideGroupCategoryTheme\";\nimport GenericErrorBoundary from \"components/shared/GenericErrorBoundary\";\nimport { BrowserRouter } from \"helpers/tixxt-router\";\nimport AppSearchHeader from \"components/layout/AppSearchHeader\";\nimport { TurboFrameMissingEvent } from \"@hotwired/turbo\";\n\n// For debugging only\ndocument.addEventListener(\"turbo:visit\", function (event) {\n  debug(\"⚡️ turbo:visit\", new URL(event[\"detail\"].url).pathname);\n});\n\n// Fix Content Missing outside of development\n// In development it produces an error and should be fixed\nif (!window.Settings?.development) {\n  document.addEventListener(\"turbo:frame-missing\", function (\n    event: TurboFrameMissingEvent,\n  ) {\n    event.preventDefault();\n    event.detail.visit(event.detail.response, {});\n  } as EventListener);\n}\n\n/*\n SPA entry point\n */\nexport function launchApp() {\n  function setupReact() {\n    const container = document.getElementById(\"app-root\");\n    const root = createRoot(container!);\n    root.render(<App />);\n    document.removeEventListener(\"turbo:load\", setupReact);\n  }\n\n  // Setup only once\n  document.addEventListener(\"turbo:load\", setupReact);\n}\n\n/*\n * Main frontend component\n */\nexport default function App() {\n  const currentMember = Preload.current_member;\n  const canChat = currentMember?.can.chat;\n\n  useEffect(() => {\n    if (window.isApp) {\n      window.bridge?.setMemberIsLoggedIn(currentMember != null);\n      if (currentMember != null) {\n        window.bridge?.setMemberId(currentMember.id);\n      }\n      window.bridge?.setMemberCanChat(!!canChat);\n    }\n  }, [currentMember]);\n\n  return (\n    <Provider store={store}>\n      <QueryClientProvider client={queryClient}>\n        <BrowserRouter>\n          <GenericErrorBoundary headless>\n            <ApplyOverrideTheme />\n            <ApplyOverrideGroupCategoryTheme />\n            <ApplyOverrideGroupTheme />\n          </GenericErrorBoundary>\n          <HeaderPortal>\n            {window.isApp ? <AppSearchHeader /> : <TixxtHeader />}\n          </HeaderPortal>\n          <UserbarPortal>\n            <TixxtUserbar />\n          </UserbarPortal>\n          {canChat &&\n            !window.isApp &&\n            window.location.pathname !== \"/legal\" && (\n              <ChatbarPortal>\n                <TixxtChatbar />\n              </ChatbarPortal>\n            )}\n          <StaticTixxtGroupNavigation />\n          <StaticTixxtPageTitle />\n          {window.Turbo?.session.drive ? (\n            <ContentPortal>\n              <TixxtContent />\n            </ContentPortal>\n          ) : null}\n        </BrowserRouter>\n      </QueryClientProvider>\n    </Provider>\n  );\n}\n","import lodash from \"lodash\";\n\n/* This is here to make legacy Backbone(.Marionette) work with modern lodash */\n\nfunction compatThisArg(fn) {\n  return function (collection, callback, thisArg) {\n    if (lodash.isFunction(callback)) {\n      return fn(collection, lodash.bind(callback, thisArg));\n    } else {\n      return fn(collection, callback);\n    }\n  };\n}\n\n// Create copy of lodash that can be modified independently\nconst customLodashCompat = lodash.runInContext();\n\n// Add some aliases for backwards compat\ncustomLodashCompat.mixin({\n  any: lodash.some,\n  contains: lodash.includes,\n  pairs: lodash.toPairs,\n  rest: lodash.tail,\n\n  // These functions had a third thisArg in old lodash\n  sortBy: compatThisArg(lodash.sortBy),\n  forEach: compatThisArg(lodash.forEach),\n  each: compatThisArg(lodash.forEach),\n  map: compatThisArg(lodash.map),\n});\n\n// Disable chaining for some functions, making them return a value instead of the wrapped object\ncustomLodashCompat.mixin(\n  {\n    // _([1,2,3]).first() returned 1 in old lodash, in modern lodash another call to value() is required\n    first: lodash.head,\n  },\n  { chain: false },\n);\n\n// forEach is lazily evaluated when used in chain in modern lodash\n// This prevents iterations in templates like\n//   file.folders().each ->\n//     # something haml\n// from rendering\nconst lazyForEach = customLodashCompat.prototype.forEach;\ncustomLodashCompat.prototype.each = customLodashCompat.prototype.forEach =\n  function (...args) {\n    lazyForEach.apply(this, args).value(); // run whole chain immediately\n    return this; // return original object for further chaining\n  };\n\nexport default customLodashCompat;\n","import { fetchApi } from \"../helpers/reactQueryApi.js\";\nimport store from \"../store.js\";\nimport { DeviceData } from \"../@types/devices\";\nimport {\n  disableBodyScrolling,\n  restoreBodyScrolling,\n} from \"../layout/togglebar\";\n\nexport default class Bridge {\n  static isIOS() {\n    return /iOS/.test(navigator.userAgent);\n  }\n\n  static isAndroid() {\n    return /Android/.test(navigator.userAgent);\n  }\n\n  static postMessage(message: object) {\n    if (Bridge.isIOS()) {\n      window.webkit?.messageHandlers.nativeApp.postMessage(message);\n    }\n\n    if (Bridge.isAndroid()) {\n      window[\"nativeApp\"]?.postMessage(JSON.stringify(message));\n    }\n  }\n\n  static toggleUserbar() {\n    const userbar = document.getElementById(\"userbar-root\");\n\n    if (userbar?.classList.contains(\"userbar--visible\")) {\n      userbar?.classList.remove(\"userbar--visible\");\n      restoreBodyScrolling(\"userbar\");\n    } else {\n      userbar?.classList.add(\"userbar--visible\");\n      disableBodyScrolling(\"userbar\");\n    }\n  }\n\n  static toggleChat() {\n    const chat = document.getElementById(\"chatbar-root\");\n\n    if (chat?.classList.contains(\"chatbar--visible\")) {\n      chat?.classList.remove(\"chatbar--visible\");\n    } else {\n      chat?.classList.add(\"chatbar--visible\");\n    }\n  }\n\n  static toggleSearchbar() {\n    const searchbar = document.getElementById(\"app__header\");\n    const searchInput: HTMLInputElement = document.getElementsByClassName(\n      \"search-bar__input\",\n    )[0] as HTMLInputElement;\n\n    if (searchbar?.classList.contains(\"header--visible\")) {\n      searchbar?.classList.remove(\"header--visible\");\n      searchInput.blur();\n    } else {\n      searchbar?.classList.add(\"header--visible\");\n      searchInput?.focus();\n    }\n  }\n\n  static registerDevice(data: DeviceData) {\n    fetchApi(\"/api/v1/devices\", {\n      method: \"POST\",\n      body: data,\n    });\n  }\n\n  static askToRegisterDevice() {\n    Bridge.postMessage({ registerDevice: \"registerDevice\" });\n  }\n\n  static async removeDevice(deviceUniqId: string) {\n    const result = await fetchApi(`/api/v1/devices/${deviceUniqId}`, {\n      method: \"DELETE\",\n    });\n\n    Bridge.postMessage({ deletedDevice: result });\n  }\n\n  static showChat(id: string) {\n    store.dispatch({\n      type: \"chat/NAVIGATE\",\n      payload: { route: \"showChat\", params: { chatId: id } },\n    });\n  }\n\n  static async loadNetworkConfig() {\n    const network = await fetchApi(\"/api/v1/network\");\n\n    const pages = await fetchApi(\"/pages\");\n\n    Bridge.postMessage({\n      setNetworkConfig: network,\n      setPages: pages,\n    });\n  }\n\n  static async loadUnreads() {\n    const unreads = await fetchApi(\"/api/v1/unreads\");\n\n    Bridge.postMessage({ unreads });\n  }\n\n  static getDeviceUniqueId(\n    setDeviceUniqueId: (props: { id: string; name: string }) => void,\n  ) {\n    Bridge.postMessage({\n      getDeviceUniqueId: \"setDeviceUniqueId\",\n    });\n\n    Bridge[\"setDeviceUniqueId\"] = setDeviceUniqueId;\n  }\n\n  static setPageTitle(title: string) {\n    Bridge.postMessage({\n      pageTitle: title,\n    });\n  }\n\n  static goBack() {\n    Bridge.postMessage({\n      goBack: \"goBack\",\n    });\n  }\n\n  static setMemberIsLoggedIn(isLoggedIn: boolean) {\n    Bridge.postMessage({\n      isLoggedIn,\n    });\n  }\n\n  static setMemberId(membershipId: string) {\n    Bridge.postMessage({\n      membershipId,\n    });\n  }\n\n  static setMemberCanChat(canChat: boolean) {\n    Bridge.postMessage({\n      canChat,\n    });\n  }\n\n  static configureLayout() {\n    document.body.classList.add(\"tixxt--in-app\");\n\n    const pageTitle = document.getElementById(\"static-page-title\");\n\n    if (pageTitle?.textContent) {\n      Bridge.setPageTitle(pageTitle?.textContent);\n    }\n\n    const title = document.querySelector(\"title\");\n    if (title) {\n      title?.parentNode?.removeChild(title);\n    }\n  }\n\n  static async getAuthToken(key: string, options: { url: string }) {\n    const token = await fetchApi(\"/api/v1/get-web-token\");\n\n    Bridge.postMessage({\n      [key]: { authToken: token, options },\n    });\n  }\n\n  static alert(\n    title: string,\n    message: string,\n    callbackName: string,\n    callback: () => void,\n    defaultValue?: string,\n  ) {\n    Bridge.postMessage({\n      alert: { title, message, defaultValue, callbackName },\n    });\n\n    if (callback) {\n      Bridge[callbackName] = callback;\n    }\n  }\n\n  static prompt(message: string, callback: () => void, defaultValue?: string) {\n    Bridge.alert(\"\", message, \"promptCallback\", callback, defaultValue);\n  }\n\n  static confirm(message: string, callback: () => void) {\n    Bridge.alert(message, \"\", \"confirmCallback\", callback, undefined);\n  }\n}\n","import React from \"react\";\nimport moment from \"moment\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { isObject } from \"lodash\";\n\nexport type Member = {\n  id: string;\n  name: string;\n  path: string;\n  images: { \"40x40@2\": string };\n  is_external: boolean;\n  profile: { [key: string]: { displayValue: string } | string | null };\n  birthday?: string;\n  birthday_is_today?: boolean;\n  age?: number;\n};\n\ntype MemberRowProps = {\n  member: Member;\n  showAge?: boolean;\n};\n\nconst MemberRow: React.FC<MemberRowProps> = ({ member, showAge }) => {\n  return (\n    <li className=\"membership media items-center\">\n      <img\n        className=\"pull-left media-object w-10 h-10\"\n        src={member.images[\"40x40@2\"]}\n        alt={member.name}\n      />\n      <div className=\"media-body flex flex-col\">\n        <span className=\"chat-status pull-right\"></span>\n        <a className=\"media-heading\" href={member.path}>\n          {member.name}\n        </a>\n        {member.is_external && (\n          <span className=\"label\">{I18n.t(\"js.external_member.badge\")}</span>\n        )}\n        <div className={\"flex flex-col\"}>\n          {Object.entries(member.profile).map(([key, value]) => (\n            <span key={key} className={`profile-${key}`}>\n              {isObject(value) ? value.displayValue : value}\n            </span>\n          ))}\n          {member.birthday && (\n            <span className=\"birthday\">\n              {member.birthday_is_today ? (\n                <span className={\"space-x-1\"}>\n                  <FontAwesomeIcon icon={regular(\"gift\")} />\n                  <strong>\n                    {I18n.t(\"js.widgets.shared.member.birthday_is_today\")}\n                  </strong>\n                  {showAge && member.age && ` (${member.age})`}\n                </span>\n              ) : (\n                <>\n                  {moment(member.birthday).format(\"L\")}\n                  {showAge && member.age && ` (${member.age + 1})`}\n                </>\n              )}\n            </span>\n          )}\n        </div>\n      </div>\n    </li>\n  );\n};\n\nexport default MemberRow;\n","import React from \"react\";\nimport MemberRow, { Member } from \"../shared/MemberRow\";\n\nexport type AdminMembersWidgetProps = {\n  headline?: string;\n  memberships: Member[];\n};\n\nconst AdminMembersWidget: React.FC<AdminMembersWidgetProps> = ({\n  headline,\n  memberships,\n}) => {\n  return (\n    <div className=\"widget admin-members-widget\">\n      {headline && <h2 className=\"widget-title\">{headline}</h2>}\n      <ul className=\"memberships unstyled space-y-2\">\n        {memberships.map((member) => (\n          <MemberRow key={member.id} member={member} />\n        ))}\n      </ul>\n    </div>\n  );\n};\n\nexport default AdminMembersWidget;\n","import React from \"react\";\nimport moment from \"moment\";\nimport \"moment-timezone\";\n\nexport type Appointment = {\n  id: string;\n  name: string;\n  start: string;\n  end?: string;\n  all_day?: boolean;\n  path: string;\n  meeting?: {\n    join_url?: string;\n  };\n  location?: string;\n};\n\nfunction displayTime(appointment: Appointment) {\n  const currentTime = moment.tz(moment(), moment.tz.guess());\n  const startTime = moment.tz(appointment.start, moment.tz.guess());\n  const allDay = appointment.all_day;\n  if (appointment.end) {\n    const endTime = moment.tz(appointment.end, moment.tz.guess());\n\n    if (\n      currentTime.isBetween(startTime, endTime, \"minute\", \"[]\") ||\n      currentTime.isBetween(startTime, endTime, \"day\", \"[]\")\n    ) {\n      // today\n      if (startTime.isSame(endTime, \"day\")) {\n        if (!allDay) {\n          // Case-3\n          return (\n            <>\n              {`${startTime.format(\"LT\")} - ${endTime.format(\"LT\")}, `}\n              <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>\n            </>\n          );\n        }\n      } else {\n        if (currentTime.isSame(startTime, \"day\")) {\n          if (allDay) {\n            // Case-7 Case-12\n            return (\n              <>\n                <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>\n                {` -`}\n                <br />\n                {`${endTime.format(\"dd\")}., ${endTime.format(\"L\")}`}\n              </>\n            );\n          } else {\n            // Case-10 Case-16\n            return (\n              <>\n                {`${startTime.format(\"LT\")}, `}\n                <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>\n                {` -`}\n                <br />\n                {`${endTime.format(\"dd\")}., ${endTime.format(\n                  \"L\",\n                )}, ${endTime.format(\"LT\")}`}\n              </>\n            );\n          }\n        } else {\n          if (currentTime.isSame(endTime, \"day\")) {\n            if (allDay) {\n              // Case-8 Case-14\n              return <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>;\n            } else {\n              // Case-11 Case-18\n              return (\n                <>\n                  {I18n.t(\"js.widget.appointment.until\")}\n                  {` ${endTime.format(\"LT\")}, `}\n                  <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>\n                </>\n              );\n            }\n          } else {\n            if (allDay) {\n              // Case-13\n              return (\n                <>\n                  <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>\n                  {\" -\"}\n                  <br />\n                  {`${endTime.format(\"dd\")}., ${endTime.format(\"L\")}`}\n                </>\n              );\n            } else {\n              // Case-17\n              return (\n                <>\n                  <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>\n                  {\" -\"}\n                  <br />\n                  {`${endTime.format(\"dd\")}., ${endTime.format(\n                    \"L\",\n                  )}, ${endTime.format(\"LT\")}`}\n                </>\n              );\n            }\n          }\n        }\n      }\n    } else {\n      // future\n      if (startTime.isSame(endTime, \"day\")) {\n        if (allDay) {\n          // Case-4\n          return startTime.format(\"dd., L\");\n        } else {\n          // Case-6\n          return startTime.format(\"dd., L, LT - \") + endTime.format(\"LT\");\n        }\n      } else {\n        if (allDay) {\n          // Case-9 Case-15\n          return startTime.format(\"dd., L - \") + endTime.format(\"dd., L\");\n        } else {\n          // Case-19\n          return (\n            startTime.format(\"dd., L, LT - \") + endTime.format(\"dd., L, LT - \")\n          );\n        }\n      }\n    }\n  } else {\n    if (currentTime.isSame(startTime, \"day\")) {\n      if (allDay) {\n        // Case-1\n        return <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>;\n      } else {\n        // Case-2\n        return (\n          <>\n            {`${startTime.format(\"LT\")}, `}\n            <strong>{I18n.t(\"js.widgets.appointment.today\")}</strong>\n          </>\n        );\n      }\n    } else {\n      if (allDay) {\n        // Case-4\n        return startTime.format(\"dd., L\");\n      } else {\n        // Case-5\n        return startTime.format(\"dd., L, LT\");\n      }\n    }\n  }\n}\n\ntype AppointmentRowProps = {\n  appointment: Appointment;\n};\n\nconst AppointmentRow: React.FC<AppointmentRowProps> = ({ appointment }) => {\n  const currentTime = moment.tz(moment(), moment.tz.guess());\n  const startTime = moment.tz(appointment.start, moment.tz.guess());\n\n  return (\n    <li className=\"appointment flex flex-col\">\n      <span className={\"space-x-1\"}>\n        {appointment.meeting?.join_url && (\n          <i className=\"fa-regular fa-comments fa-fw\"></i>\n        )}\n        <a\n          className={`appointment-title ${\n            currentTime.isSameOrAfter(startTime) ? \"font-bold\" : \"\"\n          }`}\n          href={appointment.path}\n        >\n          {appointment.name}\n        </a>\n      </span>\n      <span className={\"appointment--timeDisplay space-x-1\"}>\n        <i className=\"fa-regular fa-calendar fa-fw\"></i>\n        {displayTime(appointment)}\n      </span>\n      {appointment.location && (\n        <span className={\"appointment--location space-x-1\"}>\n          <i className=\"fa-regular fa-location-dot fa-fw\"></i>\n          {appointment.location}\n        </span>\n      )}\n    </li>\n  );\n};\n\nexport default AppointmentRow;\n","import React from \"react\";\nimport AppointmentRow, { Appointment } from \"../shared/AppointmentRow\";\n\nexport type AppointmentsWidgetProps = {\n  appointments: Appointment[];\n  headline?: string;\n};\n\nconst AppointmentsWidget: React.FC<AppointmentsWidgetProps> = ({\n  appointments,\n  headline,\n}) => {\n  return (\n    <div className=\"widget appointments-widget\">\n      {headline && <h2 className=\"widget-title\">{headline}</h2>}\n      <ul className=\"appointments unstyled space-y-2\">\n        {appointments.length > 0 ? (\n          appointments.map((appointment) => (\n            <AppointmentRow key={appointment.id} appointment={appointment} />\n          ))\n        ) : (\n          <p>{I18n.t(\"widgets.appointment.no_upcoming_appointments\")}</p>\n        )}\n      </ul>\n    </div>\n  );\n};\n\nexport default AppointmentsWidget;\n","import React from \"react\";\nimport MemberRow, { Member } from \"../shared/MemberRow\";\nimport { regular } from \"@fortawesome/fontawesome-svg-core/import.macro\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nexport type BirthdayWidgetProps = {\n  headline?: string;\n  your_birthday?: boolean;\n  show_age?: boolean;\n  memberships: Member[];\n};\n\nconst BirthdayWidget: React.FC<BirthdayWidgetProps> = ({\n  headline,\n  your_birthday,\n  show_age,\n  memberships,\n}) => {\n  return (\n    <div className=\"widget birthday-widget\">\n      {headline && <h2 className=\"widget-title\">{headline}</h2>}\n      {your_birthday && (\n        <span className={\"space-x-1\"}>\n          <FontAwesomeIcon icon={regular(\"gift\")} />\n          {I18n.t(\"js.widgets.birthday.gratulations\")}\n        </span>\n      )}\n      <ul className=\"memberships unstyled space-y-2\">\n        {memberships.map((member) => (\n          <MemberRow key={member.id} member={member} showAge={show_age} />\n        ))}\n      </ul>\n    </div>\n  );\n};\n\nexport default BirthdayWidget;\n","import React from \"react\";\n\nexport type GroupInfoWidgetProps = {\n  headline?: string;\n  content: string;\n};\n\nconst GroupInfoWidget: React.FC<GroupInfoWidgetProps> = ({\n  headline,\n  content,\n}) => {\n  return (\n    <div className=\"widget group-info-widget\">\n      {headline && <h2 className=\"widget-title\">{headline}</h2>}\n      <div\n        className=\"prose prose-sm\"\n        dangerouslySetInnerHTML={{ __html: content }}\n      />\n    </div>\n  );\n};\n\nexport default GroupInfoWidget;\n","import React from \"react\";\nimport MemberRow from \"../shared/MemberRow\";\n\ntype Member = {\n  id: string;\n  name: string;\n  path: string;\n  images: { \"40x40@2\": string };\n  is_external: boolean;\n  profile: { [key: string]: { displayValue: string } | string };\n  birthday?: string;\n  birthday_is_today?: boolean;\n  age?: number;\n};\n\nexport type NewestMembersWidgetProps = {\n  headline?: string;\n  memberships: Member[];\n};\n\nconst NewestMembersWidget: React.FC<NewestMembersWidgetProps> = ({\n  headline,\n  memberships,\n}) => {\n  return (\n    <div className=\"widget newest-members-widget\">\n      {headline && <h2 className=\"widget-title\">{headline}</h2>}\n      <ul className=\"memberships unstyled space-y-2\">\n        {memberships.map((member) => (\n          <MemberRow key={member.id} member={member} />\n        ))}\n      </ul>\n    </div>\n  );\n};\n\nexport default NewestMembersWidget;\n","import React from \"react\";\nimport MemberRow, { Member } from \"../shared/MemberRow\";\n\nexport type OnlineMembersWidgetProps = {\n  headline?: string;\n  memberships: Member[];\n};\n\nconst OnlineMembersWidget: React.FC<OnlineMembersWidgetProps> = ({\n  headline,\n  memberships,\n}) => {\n  return (\n    <div className=\"widget online-members-widget\">\n      {headline && <h2 className=\"widget-title\">{headline}</h2>}\n      <ul className=\"memberships unstyled space-y-2\">\n        {memberships.length === 0 ? (\n          <li>{I18n.t(\"js.widgets.online_members.no_other_members_online\")}</li>\n        ) : (\n          memberships.map((member) => (\n            <MemberRow key={member.id} member={member} />\n          ))\n        )}\n      </ul>\n    </div>\n  );\n};\n\nexport default OnlineMembersWidget;\n","import React from \"react\";\n\ntype RssWidgetItem = {\n  url: string;\n  title: string;\n};\n\nexport type RssWidgetProps = {\n  headline?: string;\n  error?: string;\n  items: RssWidgetItem[];\n};\n\nconst RssWidget: React.FC<RssWidgetProps> = ({ headline, error, items }) => {\n  return (\n    <div className=\"widget rss-widget\">\n      {headline && <h2 className=\"widget-title\">{headline}</h2>}\n      {error && (\n        <div className=\"muted\">{I18n.t(\"js.widgets.rss.error_text\")}</div>\n      )}\n      <ul className=\"list-disc space-y-2\">\n        {items.map((item, index) => (\n          <li key={index}>\n            <a\n              href={item.url}\n              title={item.title}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              {item.title}\n            </a>\n          </li>\n        ))}\n      </ul>\n    </div>\n  );\n};\n\nexport default RssWidget;\n","import React, { useState, useEffect } from \"react\";\n\nimport MemberRow, { Member } from \"../shared/MemberRow\";\n\nexport type SpeedDialWidgetProps = {\n  headline?: string;\n  memberships: Member[];\n  show_age?: boolean;\n};\n\nconst SpeedDialWidget: React.FC<SpeedDialWidgetProps> = ({\n  headline,\n  memberships,\n  show_age,\n}) => {\n  const [members, setMembers] = useState<Member[]>([]);\n\n  useEffect(() => {\n    setMembers(memberships);\n  }, [memberships]);\n\n  return (\n    <div className=\"widget speed-dial-widget\">\n      {headline && <h2 className=\"widget-title\">{headline}</h2>}\n      <ul className=\"memberships unstyled space-y-2\">\n        {members.length === 0 ? (\n          <li>{I18n.t(\"js.widgets.speed_dial.empty_list_text\")}</li>\n        ) : (\n          members.map((member) => (\n            <MemberRow key={member.id} member={member} showAge={show_age} />\n          ))\n        )}\n      </ul>\n    </div>\n  );\n};\n\nexport default SpeedDialWidget;\n","import React from \"react\";\n\nexport type TextWidgetProps = {\n  headline?: string;\n  content: string;\n};\n\nconst TextWidget: React.FC<TextWidgetProps> = ({ headline, content }) => (\n  <div className=\"widget text-widget\">\n    {headline && <h2 className=\"widget-title\">{headline}</h2>}\n    <div\n      className=\"prose prose-sm\"\n      dangerouslySetInnerHTML={{ __html: content }}\n    />\n  </div>\n);\n\nexport default TextWidget;\n","import React from \"react\";\nimport {\n  useActivitystreamWidgetbar,\n  WidgetResponse,\n} from \"components/widgetbars/api\";\nimport AdminMembersWidget from \"./widgets/AdminMembersWidget\";\nimport AppointmentsWidget from \"./widgets/AppointmentsWidget\";\nimport BirthdayWidget from \"./widgets/BirthdayWidget\";\nimport GroupInfoWidget from \"./widgets/GroupInfoWidget\";\nimport NewestMembersWidget from \"./widgets/NewestMembersWidget\";\nimport OnlineMembersWidget from \"./widgets/OnlineMembersWidget\";\nimport RssWidget from \"./widgets/RssWidget\";\nimport SpeedDialWidget from \"./widgets/SpeedDialWidget\";\nimport TextWidget from \"./widgets/TextWidget\";\n\ntype Props = {\n  group_id?: string;\n  slug: string;\n};\n\nfunction renderWidgetComponent(widget: WidgetResponse) {\n  switch (widget.type) {\n    case \"appointments\":\n      return <AppointmentsWidget key={widget.id} {...widget} />;\n    case \"online_members\":\n      return <OnlineMembersWidget key={widget.id} {...widget} />;\n    case \"admin_members\":\n      return <AdminMembersWidget key={widget.id} {...widget} />;\n    case \"rss\":\n      return <RssWidget key={widget.id} {...widget} />;\n    case \"speed_dial\":\n      return <SpeedDialWidget key={widget.id} {...widget} />;\n    case \"group_info\":\n      return <GroupInfoWidget key={widget.id} {...widget} />;\n    case \"newest_members\":\n      return <NewestMembersWidget key={widget.id} {...widget} />;\n    case \"text\":\n      return <TextWidget key={widget.id} {...widget} />;\n    case \"birthday\":\n      return <BirthdayWidget key={widget.id} {...widget} />;\n  }\n}\n\nconst ActivitystreamWidgetbar = ({ group_id, slug }: Props) => {\n  const { data, isLoading, isError } = useActivitystreamWidgetbar({\n    group_id,\n    slug,\n  });\n\n  if (isLoading) {\n    const loadingText = I18n.t(\"js.widgets.widgetbar.loading_widgets\");\n    return (\n      <div className=\"progress\">\n        <div\n          className=\"progress-bar progress-bar-striped progress-bar-animated bg-gray-300\"\n          style={{ width: \"100%\" }}\n        >\n          {loadingText}\n        </div>\n      </div>\n    );\n  }\n\n  if (isError) {\n    const errorText = I18n.t(\"js.widgets.widgetbar.loading_error\");\n    return <div className=\"alert\">{errorText}</div>;\n  }\n\n  return (\n    <div className=\"widgets space-y-12\">\n      {data?.widgets.map(renderWidgetComponent)}\n    </div>\n  );\n};\n\nexport default ActivitystreamWidgetbar;\n","import { useQuery, UseQueryResult } from \"react-query\";\nimport { stringify } from \"query-string\";\n\ntype WidgetbarMembership = {\n  id: string;\n  name: string;\n  path: string;\n  images: { \"40x40@2\": string };\n  is_external: boolean;\n  profile: any;\n  birthday?: string;\n  birthday_is_today?: boolean;\n  age?: number;\n};\n\ntype WidgetbarAppointment = {\n  id: string;\n  name: string;\n  start: string;\n  end?: string;\n  all_day?: boolean;\n  path: string;\n  meeting?: {\n    join_url?: string;\n  };\n  location?: string;\n};\n\nexport type AppointmentsWidgetResponse = {\n  id: string;\n  type: \"appointments\";\n  headline: string;\n  appointments: WidgetbarAppointment[];\n};\n\nexport type OnlineMembersWidgetResponse = {\n  id: string;\n  type: \"online_members\";\n  headline: string;\n  online_count: number;\n  memberships: WidgetbarMembership[];\n};\n\nexport type AdminMembersWidgetResponse = {\n  id: string;\n  type: \"admin_members\";\n  headline: string;\n  memberships: WidgetbarMembership[];\n};\n\nexport type RssWidgetResponse = {\n  id: string;\n  type: \"rss\";\n  headline: string;\n  items: { title: string; url: string }[];\n  error?: string;\n};\n\nexport type SpeedDialWidgetResponse = {\n  id: string;\n  type: \"speed_dial\";\n  headline: string;\n  memberships: WidgetbarMembership[];\n};\n\nexport type GroupInfoWidgetResponse = {\n  id: string;\n  type: \"group_info\";\n  headline?: string;\n  content: string;\n};\n\nexport type NewestMembersWidgetResponse = {\n  id: string;\n  type: \"newest_members\";\n  headline: string;\n  memberships: WidgetbarMembership[];\n};\n\nexport type TextWidgetResponse = {\n  id: string;\n  type: \"text\";\n  headline?: string;\n  content: string;\n  content_plain: string;\n};\n\nexport type BirthdayWidgetResponse = {\n  id: string;\n  type: \"birthday\";\n  headline: string;\n  show_age: boolean;\n  your_birthday: boolean;\n  memberships: WidgetbarMembership[];\n};\n\nexport type WidgetResponse =\n  | AppointmentsWidgetResponse\n  | OnlineMembersWidgetResponse\n  | AdminMembersWidgetResponse\n  | RssWidgetResponse\n  | SpeedDialWidgetResponse\n  | GroupInfoWidgetResponse\n  | NewestMembersWidgetResponse\n  | TextWidgetResponse\n  | BirthdayWidgetResponse;\n\ntype WidgetbarResponse = {\n  slug: string;\n  widgets: WidgetResponse[];\n  empty?: boolean;\n};\n\nexport function useActivitystreamWidgetbar({\n  group_id,\n  slug,\n}: {\n  group_id?: string | null;\n  slug: string;\n}): UseQueryResult<WidgetbarResponse, Error> {\n  const path = group_id\n    ? `/widgetbars/g-:group_id-as-:slug?${stringify({ group_id, slug })}`\n    : `/widgetbars/as-:slug?${stringify({ slug })}`;\n\n  return useQuery<WidgetbarResponse, Error>(path);\n}\n","import \"@hotwired/turbo\";\nimport \"core-js/stable\";\nimport \"regenerator-runtime/runtime\";\nimport \"whatwg-fetch\";\nimport moment from \"moment-timezone\";\nimport \"moment/locale/es\";\nimport \"moment/locale/fr\";\nimport \"moment/locale/de\";\nimport jQuery from \"jquery\";\nimport lodash from \"lodash\";\nimport hljs from \"highlight.js\";\nimport ClipboardJS from \"clipboard/src/clipboard\";\n\n// Stimulus\nimport \"../controllers\";\n\n// Basic layout styles and components\nimport \"../layout/index\";\n\nimport store from \"store\";\nimport wrapProvider from \"../helpers/components/wrapProvider\";\n\nimport ParticipantsList from \"components/appointments/ParticipantsList\";\nimport Invites from \"components/appointments/Invites\";\nimport AppointmentContact from \"components/appointments/Contact\";\nimport ActivityComposer from \"components/activitystreams/composer\";\nimport ReplyComposer from \"components/activitystreams/replyComposer\";\nimport adaptedFileComponents from \"components/files/adaptedFileComponents\";\nimport adaptedSharedComponents from \"components/shared/adaptedSharedComponents\";\nimport adaptedAppCreatorComponents from \"components/appCreatorTemporary/adaptedAppCreatorComponents\";\nimport adaptedAdministrationComponents from \"components/administration/adaptedAdministrationComponents\";\nimport CalendarSheet from \"components/appointments/CalendarSheet\";\nimport ExternalIdComponent from \"../components/rundschreiben/ExternalIdComponent\";\nimport { launchApp } from \"../components/App\";\nimport loadAndConfigureCKEditor from \"../helpers/ckeditor/loadAndConfigureCKEditor\";\nimport { setApplication } from \"../helpers/setApplication\";\nimport Datepicker from \"../helpers/Datepicker\";\nimport showCookieModal from \"../helpers/showCookieModal\";\nimport documentReady from \"../helpers/documentReady\";\nimport customLodashCompat from \"../helpers/legacy/customLodashCompat\";\nimport adaptBackboneView from \"../helpers/legacy/adaptBackboneView\";\nimport Bridge from \"turbo/bridge.tsx\";\nimport initializeCustomConfirm from \"turbo/confirm_compat.js\";\nimport { fetchApi } from \"../helpers/reactQueryApi\";\nimport ActivitystreamWidgetbar from \"../components/widgetbars/ActivitystreamWidgetbar\";\n\nadaptBackboneView.addComponents({\n  \"appointments/ParticipantsList\": ParticipantsList,\n  \"appointments/Invites\": Invites,\n  \"appointments/Contact\": AppointmentContact,\n  \"activitystreams/Composer\": ActivityComposer,\n  \"activitystreams/ReplyComposer\": wrapProvider(store)(ReplyComposer),\n  \"calendars/MonthSheetView\": CalendarSheet,\n  \"rundschreiben/ExternalIdComponent\": ExternalIdComponent,\n  \"widgetbars/ActivitystreamWidgetbar\": ActivitystreamWidgetbar,\n  ...adaptedFileComponents,\n  ...adaptedSharedComponents,\n  ...adaptedAppCreatorComponents,\n  ...adaptedAdministrationComponents,\n});\n\n// Backwards compat\nwindow.jQuery = window.$ = jQuery;\nwindow._ = lodash;\nwindow._compat = customLodashCompat;\nwindow.hljs = hljs;\nwindow.adaptBackboneView = adaptBackboneView;\nwindow.loadAndConfigureCKEditor = loadAndConfigureCKEditor;\nwindow.moment = moment;\nwindow.ClipboardJS = ClipboardJS;\nwindow.Datepicker = Datepicker;\n\n// check if is access by app and do some configuration if so\nconst regex = new RegExp(/tixxt App/gm);\nwindow.isApp = regex.test(window.navigator.userAgent);\n\nwindow.bridge = {\n  prompt: (message, defaultValue, callback) => {\n    const userInput = prompt(message, defaultValue);\n\n    if (callback) {\n      callback(userInput);\n    }\n  },\n  confirm: (message, callback) => {\n    const confirmed = confirm(message);\n\n    if (confirmed) {\n      callback();\n    }\n  },\n};\n\ndocumentReady(() => initializeCustomConfirm());\n\n// Global helper stuff\nif (window.isApp) {\n  window.bridge = Bridge;\n\n  document.addEventListener(\"turbo:load\", Bridge.configureLayout);\n}\n\nwindow.Application = setApplication();\nwindow.showCookieModal = showCookieModal;\nwindow.fetchApi = fetchApi;\n\nlaunchApp();\n","export default function initializeCustomConfirm() {\n  $.rails.allowAction = function (element) {\n    let message = element.data(\"confirm\");\n\n    if (!message) {\n      return true;\n    }\n\n    if (element.data(\"confirmed\")) {\n      element.data(\"confirmed\", false);\n\n      return $.rails.fire(element, \"confirm:complete\", [true]);\n    }\n\n    if ($.rails.fire(element, \"confirm\")) {\n      try {\n        window.bridge.confirm(message, function () {\n          element.data(\"confirmed\", true);\n          const callback = $.rails.fire(element, \"confirm:complete\", [true]);\n          if (callback) {\n            $.rails.fire(element, \"click\");\n          }\n        });\n      } catch (e) {\n        (console.error || console.log).call(console, e.stack || e);\n      }\n    }\n\n    return false;\n  };\n}\n","import documentReady from \"./documentReady\";\nimport Modal from \"bootstrap/js/dist/modal\";\n\n/* This is used to show the modal from app/views/shared/_cookie_modal.html.haml */\nexport default function showCookieModal() {\n  let cookieModal;\n\n  documentReady(function () {\n    const cookieModalElement = document.getElementById(\n      \"cookieModal\",\n    ) as HTMLElement;\n    cookieModal = new Modal(cookieModalElement, {\n      keyboard: false,\n      backdrop: \"static\",\n    });\n\n    cookieModalElement.addEventListener(\"click\", modalCloser);\n    cookieModal.show();\n  });\n\n  function modalCloser() {\n    document.cookie = \"modal=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\n    cookieModal.hide();\n  }\n}\n","const myDefaultState = {\n  muted_until: null,\n  app_muted_until: null,\n  last_read_id: null,\n  unread_count: 0,\n};\n\n// Lookup for best performance\nconst POSSIBLE_PARTNER_ACTION_TYPES = {\n  \"chat/MARK_AS_READ/RECEIVE\": true,\n  \"chat/MARK_AS_RECEIVED/RECEIVE\": true,\n};\n// True if action origins from partner, determined by membership_id and channel topic it was received on\nconst isPartnerAction = ({ type, payload, meta }) =>\n  POSSIBLE_PARTNER_ACTION_TYPES[type] &&\n  meta.topic !== `member:${payload.membership_id}`;\n\nexport const myStateReducer = (state = myDefaultState, action) => {\n  if (isPartnerAction(action)) {\n    return state;\n  }\n\n  switch (action.type) {\n    case \"chat/MARK_AS_READ/RECEIVE\":\n    case \"chat/MARK_AS_READ\":\n      return {\n        ...state,\n        unread_count: 0,\n        last_read_id: action.payload.last_read_id,\n      };\n    case \"chat/MUTE_CHAT\":\n    case \"chat/MUTE_CHAT/RECEIVE\":\n      return {\n        ...state,\n        muted_until: action.payload.muted_until,\n      };\n    case \"chat/APP_MUTE_CHAT\":\n    case \"chat/APP_MUTE_CHAT/RECEIVE\":\n      return {\n        ...state,\n        app_muted_until: action.payload.muted_until,\n      };\n    case \"chat/UNMUTE_CHAT\":\n    case \"chat/UNMUTE_CHAT/RECEIVE\":\n      return {\n        ...state,\n        muted_until: null,\n      };\n    case \"chat/APP_UNMUTE_CHAT\":\n    case \"chat/APP_UNMUTE_CHAT/RECEIVE\":\n      return {\n        ...state,\n        app_muted_until: null,\n      };\n    case \"chat/MESSAGE/RECEIVE\":\n      return {\n        ...state,\n        unread_count: state.unread_count + 1,\n      };\n    default:\n      return state;\n  }\n};\n\nconst partnerDefaultState = {\n  last_received_id: null,\n  last_read_id: null,\n};\n\nexport const partnerStateReducer = (state = partnerDefaultState, action) => {\n  if (!isPartnerAction(action)) {\n    return state;\n  }\n\n  switch (action.type) {\n    case \"chat/MARK_AS_RECEIVED/RECEIVE\":\n      return {\n        ...state,\n        last_received_id: action.payload.last_received_id,\n      };\n\n    case \"chat/MARK_AS_READ/RECEIVE\":\n      return {\n        ...state,\n        last_read_id: action.payload.last_read_id,\n      };\n    default:\n      return state;\n  }\n};\n","import { isEmpty } from \"lodash\";\nimport keyByFp from \"lodash/fp/keyBy\";\nimport flow from \"lodash/fp/flow\";\nimport getFp from \"lodash/fp/get\";\nimport { get, includes } from \"lodash\";\nimport { myStateReducer, partnerStateReducer } from \"./chatStateReducers\";\nimport { loadChatDetails } from \"../../actions/chat\";\n\n// Pull chats value from payload and key it by id\nconst extractChats = flow(getFp(\"chats\"), keyByFp(\"id\"));\n\nexport const requestStateReducer = (state = {}, action) => {\n  switch (action.type) {\n    case loadChatDetails.type:\n    case \"chat/MORE_MESSAGES\": {\n      return {\n        ...state,\n        loadingMessages: true,\n      };\n    }\n    case loadChatDetails.replyType:\n    case \"chat/MORE_MESSAGES/REPLY\": {\n      return {\n        ...state,\n        loadingMessages: false,\n        moreMessagesAvailable: !isEmpty(action.payload.messages),\n      };\n    }\n    default:\n      return state;\n  }\n};\n\nconst defaultStateFromAction = (action) => ({\n  id: get(action.payload, [\"chat_id\"]),\n  name: get(action.payload, [\"from\", \"name\"]),\n  image_id: get(action.payload, [\"from\", \"image_id\"]),\n  state: myStateReducer(undefined, { type: \"INIT\" }),\n  partner_state: partnerStateReducer(undefined, { type: \"INIT\" }),\n  last_interacted_at: null,\n});\n\nexport const chatReducer = (maybeUndefinedState, action) => {\n  const state = maybeUndefinedState || defaultStateFromAction(action);\n\n  switch (action.type) {\n    case \"chat/MESSAGE/RECEIVE\": {\n      return {\n        ...state,\n        last_interacted_at: action.payload.created_at,\n        state: myStateReducer(state.state, action),\n        last_message: action.payload,\n      };\n    }\n    case \"chat/MESSAGE/REPLY\": {\n      return {\n        ...state,\n        last_interacted_at: action.payload.created_at,\n        last_message: action.payload,\n      };\n    }\n    case \"chat/MARK_AS_RECEIVED/RECEIVE\":\n    case \"chat/MARK_AS_READ/RECEIVE\":\n    case \"chat/MARK_AS_READ\": {\n      return {\n        ...state,\n        state: myStateReducer(state.state, action),\n        partner_state: partnerStateReducer(state.partner_state, action),\n      };\n    }\n    case \"chat/MUTE_CHAT\":\n    case \"chat/APP_MUTE_CHAT\":\n    case \"chat/MUTE_CHAT/RECEIVE\":\n    case \"chat/APP_MUTE_CHAT/RECEIVE\":\n    case \"chat/UNMUTE_CHAT\":\n    case \"chat/APP_UNMUTE_CHAT\":\n    case \"chat/UNMUTE_CHAT/RECEIVE\":\n    case \"chat/APP_UNMUTE_CHAT/RECEIVE\": {\n      return {\n        ...state,\n        state: myStateReducer(state.state, action),\n      };\n    }\n    case loadChatDetails.type:\n    case \"chat/MORE_MESSAGES\":\n    case \"chat/MORE_MESSAGES/REPLY\":\n      return {\n        ...state,\n        requestState: requestStateReducer(state.requestState, action),\n      };\n    case loadChatDetails.replyType:\n      return {\n        ...state,\n        can: action.payload.can,\n        requestState: requestStateReducer(state.requestState, action),\n      };\n    default:\n      return state;\n  }\n};\n\nconst getChatIdFromPayload = getFp([\"payload\", \"chat_id\"]);\nconst getChatIdFromMeta = getFp([\"meta\", \"chatId\"]);\nconst getChatId = (action) =>\n  getChatIdFromPayload(action) || getChatIdFromMeta(action);\n\n// Workaround for composing starts a new chat for the counterpart\nconst BLACKLIST = [\"chat/COMPOSING/RECEIVE\", \"chat/COMPOSING/STOPPED\"];\n\nexport default (state = {}, action) => {\n  switch (action.type) {\n    // Full list of chats received, store them keyed by id\n    case \"chat/MY_CHATS/REPLY\":\n      return extractChats(action.payload);\n    case \"chat/CREATE_CHAT/REPLY\":\n    case \"chat/CREATE_CHAT/RECEIVE\":\n      return { ...state, [action.payload.id]: action.payload };\n    default: {\n      const chatId = getChatId(action);\n      if (!chatId || includes(BLACKLIST, action.type)) {\n        return state;\n      }\n      return {\n        ...state,\n        [chatId]: chatReducer(state[chatId], action),\n      };\n    }\n  }\n};\n","import { get, findLastIndex } from \"lodash\";\nimport { loadChatDetails } from \"../../actions/chat\";\n\n// merge received messages into existing list of messages while maintaining a correct order\n// both lists must already be ordered by id ascending themselves\n//\n// see tests for examples\nexport const mergeMessages = (messages, received) => {\n  // shortcuts\n  if (messages.length == 0) {\n    return received;\n  }\n  if (received.length == 0) {\n    return messages;\n  }\n\n  // a,b are the heads, r1,r2 are the remainders, out is for result\n  let [a, ...r1] = messages;\n  let [b, ...r2] = received;\n  const out = [];\n\n  while (a && b) {\n    // keep a (existing) over b (received) if both are equal and shift both\n    if (a.id === b.id) {\n      out.push(a);\n      a = r1.shift();\n      b = r2.shift();\n      // insert a next if its id is smaller than b and shift a\n    } else if (a.id < b.id) {\n      out.push(a);\n      a = r1.shift();\n      // insert b next if its id is smaller than a and shift b\n    } else {\n      out.push(b);\n      b = r2.shift();\n    }\n  }\n\n  if (a) {\n    out.push(a);\n  }\n  if (b) {\n    out.push(b);\n  }\n\n  return out.concat(r1).concat(r2);\n};\n\n// Inserts message into list or updates it if it already exists\n// Always keeps the order\nconst insertOrUpdateMessage = (list, message) => {\n  const index = findLastIndex(list, ({ id }) => id <= message.id);\n\n  // Prevent duplication\n  const keepUntil =\n    index >= 0 && list[index].id === message.id ? index : index + 1;\n\n  return [...list.slice(0, keepUntil), message, ...list.slice(index + 1)];\n};\n\n// Remove message from list by cid\n// Is slightly optimized to process as little as possible, instead of using filter(list, ...)\nconst removeByClientId = (list, searchClientId) => {\n  const index = findLastIndex(list, ({ cid }) => cid === searchClientId);\n  if (index === -1) return list;\n\n  return [...list.slice(0, index), ...list.slice(index + 1)];\n};\n\nexport const messageList = (list = [], action) => {\n  switch (action.type) {\n    case \"chat/MESSAGE/PUSH\":\n      return [\n        ...list,\n        {\n          id: null,\n          from: action.meta.from,\n          ...action.payload,\n          cid: action.meta.ref,\n        },\n      ];\n    case \"chat/MESSAGE/REPLY\":\n      return insertOrUpdateMessage(removeByClientId(list, action.meta.ref), {\n        cid: action.meta.ref,\n        ...action.payload,\n      });\n    case \"chat/MESSAGE/RECEIVE\":\n      return insertOrUpdateMessage(list, action.payload);\n    case loadChatDetails.replyType:\n      return mergeMessages(list, action.payload.messages.reverse());\n    case \"chat/MORE_MESSAGES/REPLY\":\n      return mergeMessages(action.payload.messages.reverse(), list);\n    default:\n      return list;\n  }\n};\n\nexport default (state = {}, action) => {\n  switch (action.type) {\n    case \"chat/MESSAGE/PUSH\":\n    case \"chat/MESSAGE/REPLY\":\n    case \"chat/MESSAGE/RECEIVE\":\n    case loadChatDetails.replyType:\n    case \"chat/MORE_MESSAGES/REPLY\": {\n      const chatId =\n        get(action, [\"payload\", \"chat_id\"]) || get(action, [\"meta\", \"chatId\"]);\n      if (!chatId) {\n        return state;\n      }\n      return {\n        ...state,\n        [chatId]: messageList(get(state, [chatId]), action),\n      };\n    }\n    default:\n      return state;\n  }\n};\n","import { last } from \"lodash\";\nimport { IS_API_REQUEST } from \"../../actions/chat\";\n\nconst apiRequests = (state = {}, action) => {\n  if (action[IS_API_REQUEST]) {\n    return {\n      ...state,\n      [action.type]: \"pending\",\n    };\n  } else if (action.parentAction && action.parentAction[IS_API_REQUEST]) {\n    return {\n      ...state,\n      [action.parentAction.type]: last(action.type.split(\"/\")).toLowerCase(),\n    };\n  }\n  return state;\n};\n\nexport default apiRequests;\n","import { includes, without } from \"lodash\";\n\n// Maintains unique, ordered list of membership ids which are currently composing (oldest first)\nconst composingInChat = (state = [], action) => {\n  switch (action.type) {\n    case \"chat/COMPOSING/RECEIVE\":\n      return includes(state, action.payload.from.id)\n        ? state\n        : [...state, action.payload.from.id];\n    case \"chat/COMPOSING/STOPPED\":\n    case \"chat/MESSAGE/RECEIVE\":\n      return without(state, action.payload.from.id);\n    default:\n      return state;\n  }\n};\n\nconst composing = (state = {}, action) => {\n  switch (action.type) {\n    case \"chat/COMPOSING/RECEIVE\":\n    case \"chat/COMPOSING/STOPPED\":\n    case \"chat/MESSAGE/RECEIVE\":\n      return {\n        ...state,\n        [action.payload.chat_id]: composingInChat(\n          state[action.payload.chat_id],\n          action,\n        ),\n      };\n    default:\n      return state;\n  }\n};\n\nexport default composing;\n","import { reduce, map } from \"lodash\";\nimport { loadChatDetails } from \"../../actions/chat\";\n\n// Stores homie to state if it is not yet known (this is a performance optimization)\nconst storeHomie = (state, homie) =>\n  state[homie.id]\n    ? state\n    : {\n        ...state,\n        [homie.id]: homie,\n      };\n\n// Keeps track of homies, i.e. for displaying of composing status\nconst homies = (state = {}, action) => {\n  switch (action.type) {\n    case \"chat/MESSAGE/RECEIVE\":\n    case \"chat/COMPOSING/RECEIVE\":\n      return storeHomie(state, action.payload.from);\n    case loadChatDetails.replyType:\n    case \"chat/MORE_MESSAGES/REPLY\":\n      return reduce(map(action.payload.messages, \"from\"), storeHomie, state);\n    default:\n      return state;\n  }\n};\n\nexport default homies;\n","import { combineReducers } from \"redux\";\nimport identity from \"lodash/fp/identity\";\nimport get from \"lodash/fp/get\";\nimport flow from \"lodash/fp/flow\";\nimport groupBy from \"lodash/fp/groupBy\";\nimport chats from \"./chats\";\nimport messages from \"./messages\";\nimport session from \"./session\";\nimport composer from \"./composer\";\nimport apiRequests from \"./apiRequests\";\nimport composing from \"./composing\";\nimport homies from \"./homies\";\n\nexport const transformPayload = (\n  type,\n  payloadTransformer,\n  defaultState = null,\n) => {\n  return (state = defaultState, action) => {\n    if (action.type !== type) {\n      return state;\n    }\n    return payloadTransformer(action.payload);\n  };\n};\n\nconst getGroupCategoryName = get([\"category\", \"plural_name\"]);\nconst categoryOrMemberType = (memberOrGroup) =>\n  memberOrGroup.type === \"member\"\n    ? \"member\"\n    : getGroupCategoryName(memberOrGroup);\n\nconst chatReducer = combineReducers({\n  chats,\n  session,\n  messages,\n  composer,\n  apiRequests,\n  profile: transformPayload(\"chat/MY_PROFILE/REPLY\", get(\"profile\")),\n  navigation: transformPayload(\"chat/NAVIGATE\", identity, { route: \"root\" }),\n  presence: combineReducers({\n    onlineMembers: transformPayload(\"chat/PRESENCE/SYNC\", get(\"onlineMembers\")),\n    busyMembers: transformPayload(\"chat/PRESENCE/SYNC\", get(\"busyMembers\")),\n  }),\n  availableChats: transformPayload(\n    \"chat/AVAILABLE_CHATS/SUCCESS\",\n    flow(get(\"entries\"), groupBy(categoryOrMemberType)),\n    {},\n  ),\n  composing,\n  homies,\n});\n\nexport default chatReducer;\n","export default (state = {}, action) => {\n  switch (action.type) {\n    case \"chat/INIT\":\n      return {\n        networkUrl: action.payload.networkUrl,\n      };\n    case \"chat/SOCKET/ON_OPEN\":\n      return {\n        ...state,\n        connected: true,\n      };\n    case \"chat/SOCKET/ON_CLOSE\":\n    case \"chat/SOCKET/ON_ERROR\":\n      return {\n        ...state,\n        connected: false,\n      };\n    case \"chat/FETCH_CREDENTIALS/FAILURE\":\n      return {\n        ...state,\n        authorizationError: \"fetch_credentials_failed\",\n      };\n    default:\n      return state;\n  }\n};\n","export default (state = {}, action) => {\n  switch (action.type) {\n    case \"chat/COMPOSER/SET_MESSAGE_TO_QUOTE\":\n      return {\n        ...state,\n        [action.chatId]: {\n          ...state[action.chatId],\n          messageToQuoteId: action.messageId,\n        },\n      };\n    case \"chat/COMPOSER/SET_TEXT\":\n      return {\n        ...state,\n        [action.chatId]: {\n          ...state[action.chatId],\n          text: action.text,\n        },\n      };\n    case \"chat/SEND_MESSAGE\": {\n      return {\n        ...state,\n        [action.meta.chatId]: {\n          text: \"\",\n          messageToQuoteId: \"\",\n        },\n      };\n    }\n    default:\n      return state;\n  }\n};\n","import { put, cancelled, take } from \"redux-saga/effects\";\nimport { eventChannel } from \"redux-saga\";\n\n/*\n * Helper to run yield effect and success / failure effects accordingly\n */\nexport function* tryYield(effect, getSuccessEffect, getFailureEffect) {\n  let result = null;\n\n  try {\n    result = yield effect;\n  } catch (error) {\n    return yield getFailureEffect(error);\n  }\n\n  return yield getSuccessEffect(result);\n}\n\n/*\n * Creates a saga that converts emitted events into dispatched actions\n */\nexport const createEventSaga = ({ events, bind, remove }) => {\n  return function* eventSaga(subject) {\n    const channel = eventChannel((emit) => {\n      // create handlers\n      const handlers = events(emit, subject);\n\n      // bind handlers to the subject\n      bind(subject, handlers);\n\n      // will be called when eventChannel is closed\n      return () => (remove ? remove(subject, handlers) : null);\n    });\n    try {\n      while (true) {\n        const action = yield take(channel);\n        yield put(action);\n      }\n    } finally {\n      if (yield cancelled()) {\n        channel.close();\n      }\n    }\n  };\n};\n","import { createEventSaga } from \"./helpers\";\nimport { Presence } from \"phoenix\";\nimport { map, maxBy } from \"lodash\";\n\n// Listen to presence synchronisations and dispatch them to redux\nconst presenceSaga = createEventSaga({\n  events: (dispatch) => ({\n    sync: (presence) => {\n      const onlineMembers = {};\n      const busyMembers = {};\n      presence.list((id, { metas }) => {\n        onlineMembers[id] = map(metas, (m) => parseInt(m.online_at, 10));\n        busyMembers[id] = maxBy(map(metas, \"status\"), \"updated_at\");\n      });\n      dispatch({\n        type: \"chat/PRESENCE/SYNC\",\n        payload: { onlineMembers, busyMembers },\n      });\n    },\n  }),\n  bind: (channel, handlers) => {\n    const presence = new Presence(channel);\n    presence.onSync(handlers.sync.bind(null, presence));\n  },\n});\n\nexport default presenceSaga;\n","import {\n  call,\n  apply,\n  take,\n  actionChannel,\n  put,\n  cancelled,\n  select,\n} from \"redux-saga/effects\";\nimport { IS_API_REQUEST } from \"../../actions/chat\";\nimport { getNetworkUrl } from \"../../selectors/chat/application\";\n\n// Saga wich handles api requests like getting available chats\n// Super simple and only handles GET returning json\nexport function* handleApiRequests() {\n  const apiRequests = yield actionChannel((action) => action[IS_API_REQUEST]);\n  try {\n    while (true) {\n      const action = yield take(apiRequests);\n      const { type, endpoint } = action;\n      const networkUrl = yield select(getNetworkUrl);\n      const url = `${networkUrl}${endpoint}`;\n\n      yield put({ type: `${type}/REQUEST`, url, parentAction: action });\n\n      try {\n        const response = yield call(fetch, `${networkUrl}${endpoint}`, {\n          credentials: \"include\",\n          headers: { Accept: \"application/json\" },\n        });\n        const payload = yield apply(response, Response.prototype.json);\n        yield put({\n          type: `${type}/SUCCESS`,\n          url,\n          payload,\n          parentAction: action,\n        });\n      } catch (error) {\n        yield put({\n          type: `${type}/FAILURE`,\n          url,\n          error,\n          parentAction: action,\n        });\n      }\n    }\n  } finally {\n    if (yield cancelled()) {\n      apiRequests.close();\n      console.log(\"handleApiRequests cancelled\");\n    }\n  }\n}\n","import delay from \"@redux-saga/delay-p\";\nimport {\n  call,\n  take,\n  all,\n  takeLatest,\n  put,\n  select,\n  race,\n  fork,\n  actionChannel,\n  cancel,\n} from \"redux-saga/effects\";\nimport { get, at } from \"lodash\";\n\nimport {\n  loadChatDetails,\n  markAsRead,\n  loadMoreMessages,\n} from \"../../actions/chat\";\nimport {\n  getLastReadIdForChat,\n  getMoreMessagesAvailableForChat,\n} from \"../../selectors/chat/chat\";\nimport {\n  getLastUnreadMessageInChat,\n  getLastMessageIdInChat,\n  getFirstMessageIdInChat,\n} from \"../../selectors/chat/messages\";\n\nimport { handleApiRequests } from \"./api\";\n\nexport const UNREAD_TIMER = 1000;\n\n// Time after which a previously received composing event is timed out\n// This is also used to determine throttle duration for pushing composing events (80% of this value)\nexport const COMPOSING_TIMEOUT = 2000;\n\nconst isShowChatNavigationAction = (action) =>\n  action.type === \"chat/NAVIGATE\" && action.payload.route === \"showChat\";\n\nconst createWindowFocusPromise = () =>\n  new Promise((resolve) => {\n    const handler = () => {\n      window.removeEventListener(\"focus\", handler);\n      resolve();\n    };\n\n    window.addEventListener(\"focus\", handler);\n  });\n\nexport function* fetchChatDetails({ chatId }) {\n  yield put(loadChatDetails({ meta: { chatId } }));\n}\n\nexport function* fetchMoreRecentMessages({ chatId }) {\n  const moreMessagesAvailable = yield select(getMoreMessagesAvailableForChat, {\n    chatId,\n  });\n\n  if (moreMessagesAvailable) {\n    const firstMessageId = yield select(getFirstMessageIdInChat, { chatId });\n\n    if (firstMessageId) {\n      yield put(\n        loadMoreMessages({\n          meta: { chatId },\n          payload: { message_id: firstMessageId },\n        }),\n      );\n    }\n  }\n}\n\nfunction* markChatAsRead({ chatId, messageId }) {\n  // Cancel mark as read if another navigation occurs quickly\n  const result = yield race({\n    ok: delay(UNREAD_TIMER),\n    navigate: take(\"chat/NAVIGATE\"),\n    mark_as_read: take(\"chat/CHAT/MARK_AS_READ\"),\n    mark_as_read_start: take(\"chat/CHAT/MARK_AS_READ/START_TIMER\"),\n  });\n\n  if (result.ok) {\n    yield put(\n      markAsRead({\n        meta: { chatId },\n        payload: { last_read_id: messageId },\n      }),\n    );\n  }\n}\n\nfunction* markChatAsReadHandler({ chatId }) {\n  const lastReadId = yield select(getLastReadIdForChat, { chatId });\n  const lastMessageId = yield select(getLastMessageIdInChat, { chatId });\n\n  if (lastMessageId && lastReadId !== lastMessageId) {\n    if (!document.hasFocus()) {\n      yield call(createWindowFocusPromise);\n    }\n\n    const unreadMessage = yield select(getLastUnreadMessageInChat, { chatId });\n    yield put({\n      type: \"chat/CHAT/MARK_AS_READ/START_TIMER\",\n      chatId,\n      messageId: unreadMessage ? unreadMessage.id : lastMessageId,\n    });\n  }\n}\n\nfunction* navigateToChatWeCreated(action) {\n  yield put({\n    type: \"chat/NAVIGATE\",\n    payload: { route: \"showChat\", params: { chatId: action.payload.id } },\n  });\n}\n\nfunction* chatSaga(navigateAction) {\n  const chatId = get(navigateAction, [\"payload\", \"params\", \"chatId\"]);\n\n  yield call(fetchChatDetails, { chatId });\n\n  yield all([\n    takeLatest(\"chat/CHAT/MARK_AS_READ/START_TIMER\", markChatAsRead),\n    takeLatest(\"chat/CHAT/SCROLL_START_REACHED\", fetchMoreRecentMessages),\n    takeLatest(\"chat/CHAT/SCROLL_END_REACHED\", markChatAsReadHandler),\n  ]);\n\n  yield fork(markChatAsReadHandler, { chatId });\n}\n\nfunction* timeoutComposing(payload) {\n  yield delay(COMPOSING_TIMEOUT);\n  yield put({ type: \"chat/COMPOSING/STOPPED\", payload });\n}\n\n// Makes sure that composing state per chat and member is timed out\nfunction* timeoutComposingStates() {\n  const timeoutTasks = {};\n  const composingActions = yield actionChannel(\"chat/COMPOSING/RECEIVE\");\n  while (true) {\n    const { payload } = yield take(composingActions);\n    const ident = at(payload, [\"chat_id\", \"membership_id\"]).join(\"/\");\n    if (timeoutTasks[ident] && timeoutTasks[ident].isRunning()) {\n      yield cancel(timeoutTasks[ident]);\n    }\n    timeoutTasks[ident] = yield fork(timeoutComposing, payload);\n  }\n}\n\nfunction* applicationSaga() {\n  yield all([\n    takeLatest(isShowChatNavigationAction, chatSaga),\n    fork(handleApiRequests),\n    takeLatest(\"chat/CREATE_CHAT/REPLY\", navigateToChatWeCreated),\n    fork(timeoutComposingStates),\n  ]);\n}\n\nexport default applicationSaga;\n","import delay from \"@redux-saga/delay-p\";\nimport {\n  all,\n  call,\n  take,\n  fork,\n  put,\n  actionChannel,\n  cancelled,\n  throttle,\n  takeLatest,\n  select,\n} from \"redux-saga/effects\";\nimport { map, get, filter, reduce, isEmpty } from \"lodash\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport { createEventSaga } from \"./helpers\";\nimport { IS_CHAT_QUERY, IS_NETWORK_QUERY } from \"../../actions/chat\";\nimport presenceSaga from \"./presence\";\nimport { COMPOSING_TIMEOUT, fetchChatDetails } from \"./application\";\nimport { getMyProfile } from \"../../selectors/chat/profile\";\nimport { getChatNavigation } from \"../../selectors/chat/application\";\n\nconst join = (channel) =>\n  new Promise((resolve, reject) => {\n    channel.join().receive(\"ok\", resolve).receive(\"error\", reject);\n  });\n\nconst push = (channel, ...args) => channel.push(...args);\n\nconst pushReply = (channel, ...args) =>\n  new Promise((resolve, reject) => {\n    push(channel, ...args)\n      .receive(\"ok\", resolve)\n      .receive(\"error\", reject)\n      .receive(\"timeout\", () => reject(\"timeout\"));\n  });\n\n// Perform a push on the channel and expect a reply\nfunction* query(channel, event, { payload = null, meta: baseMeta } = {}) {\n  const meta = {\n    ...baseMeta,\n    topic: channel.topic,\n    event,\n  };\n  // Push phase action\n  yield put({\n    type: `chat/${event.toUpperCase()}/PUSH`,\n    payload,\n    meta,\n  });\n\n  try {\n    // Actually perform the push on the socket\n    const reply = yield call(pushReply, channel, event, payload);\n\n    // Reply phase action\n    yield put({\n      type: `chat/${event.toUpperCase()}/REPLY`,\n      payload: reply,\n      meta,\n    });\n\n    // Reply in case caller wants it\n    return reply;\n  } catch (error) {\n    // Reply phase action\n    yield put({\n      type: `chat/${event.toUpperCase()}/ERROR`,\n      meta,\n      error,\n    });\n  }\n}\n\n// Saga which handles incoming messages in a (group) channel\n// Listens for all RECEIVE_EVENTS and dispatches them as to redux\nconst RECEIVE_EVENTS = [\n  \"message\",\n  \"create_chat\",\n  \"mark_as_read\",\n  \"mark_as_received\",\n  \"mute_chat\",\n  \"unmute_chat\",\n  \"composing\",\n];\nconst handleIncomingMessages = createEventSaga({\n  events: (dispatch, subject) => {\n    return reduce(\n      RECEIVE_EVENTS,\n      (handlers, event) => {\n        const type = `chat/${event.toUpperCase()}/RECEIVE`;\n        handlers[event] = (payload) =>\n          dispatch({ type, payload, meta: { topic: subject.topic, event } });\n        return handlers;\n      },\n      {},\n    );\n  },\n  bind: (channel, handlers) =>\n    map(handlers, (fn, name) => channel.on(name, fn)),\n  remove: (channel, handlers) =>\n    map(handlers, (fn, name) => channel.off(name, fn)),\n});\n\n// This basically does the routing from { type, id } to the correct topic\n// All of type member to the member channel\n// All of type group to the group channel with matching id\nconst createShouldHandleTo = (channel) => {\n  const [channelType, channelId] = channel.topic.split(\":\");\n  const shouldHandleTo =\n    channelType == \"network\"\n      ? (action) => action[IS_NETWORK_QUERY]\n      : channelType == \"member\"\n        ? ({ meta, type }) =>\n            type === \"chat/MUTE_CHAT\" ||\n            type === \"chat/APP_MUTE_CHAT\" ||\n            (meta && meta.chatId && meta.chatId.indexOf(\"member/\") == 0)\n        : ({ meta, type }) =>\n            type !== \"chat/MUTE_CHAT\" &&\n            type !== \"chat/APP_MUTE_CHAT\" &&\n            meta &&\n            meta.chatId &&\n            meta.chatId === `group/${channelId}`;\n  return shouldHandleTo;\n};\n\n// Saga which handles outgoing messages in a (group) channel\nfunction* handleOutgoingMessages(channel) {\n  const outgoingMessages = yield actionChannel(\"chat/SEND_MESSAGE\");\n  try {\n    const shouldHandleTo = createShouldHandleTo(channel);\n\n    while (true) {\n      const action = yield take(outgoingMessages);\n      if (shouldHandleTo(action)) {\n        const from = yield select(getMyProfile);\n        const payload = { ...action.payload, chat_id: action.meta.chatId };\n        const meta = { ...action.meta, ref: uuidv4(), from };\n        yield call(query, channel, \"message\", { payload, meta });\n      }\n    }\n  } finally {\n    if (yield cancelled()) {\n      outgoingMessages.close();\n      console.log(\"handleOutgoingMessages cancelled\", channel.topic);\n    }\n  }\n}\n\n// Saga wich handles queries like getting recent messages\nfunction* handleChatQueries(channel) {\n  const chatQueries = yield actionChannel((action) => action[IS_CHAT_QUERY]);\n  try {\n    const shouldHandleTo = createShouldHandleTo(channel);\n    while (true) {\n      const action = yield take(chatQueries);\n      if (shouldHandleTo(action)) {\n        const event = action.type.split(\"/\")[1].toLowerCase();\n        const payload = { ...action.payload };\n\n        if (get(action, [\"meta\", \"chatId\"])) {\n          payload.chat_id = get(action, [\"meta\", \"chatId\"]);\n        }\n\n        yield call(query, channel, event, {\n          payload,\n          meta: action.meta,\n        });\n      }\n    }\n  } finally {\n    if (yield cancelled()) {\n      chatQueries.close();\n      console.log(\"chatQueries cancelled\", channel.topic);\n    }\n  }\n}\n\n// Sends composing event to channel\nfunction* pushComposingEvent(channel, { type, text, chatId }) {\n  // Don't send \"composing\" on i.e. chat/SEND_MESSAGE or when composer was cleared\n  if (type !== \"chat/COMPOSER/SET_TEXT\" || isEmpty(text)) {\n    return;\n  }\n  const payload = { chat_id: chatId };\n  yield put({ type: \"chat/COMPOSING/PUSH\", payload });\n  yield call(push, channel, \"composing\", payload);\n}\n\n// Marks a single message as received, unless\n// - it is from ourselves\n// - or not in a member chat\nfunction* markMessageAsReceived(\n  channel,\n  membershipId,\n  { payload: messagePayload },\n) {\n  if (messagePayload.from.id === membershipId) return;\n  if (messagePayload.chat_id.indexOf(\"member/\") !== 0) return;\n\n  const payload = {\n    chat_id: messagePayload.chat_id,\n    last_received_id: messagePayload.id,\n  };\n  yield put({ type: \"chat/MARK_AS_RECEIVED/PUSH\", payload });\n  yield call(push, channel, \"mark_as_received\", payload);\n}\n\n// Marks messages as received when loading list of chats\nfunction* markLastChatMessagesAsReceived(channel, membershipId, { payload }) {\n  for (let chat of payload.chats) {\n    if (\n      !isEmpty(chat.last_message) &&\n      chat.last_message.id > get(chat, [\"state\", \"last_received_id\"])\n    ) {\n      yield call(markMessageAsReceived, channel, membershipId, {\n        payload: chat.last_message,\n      });\n\n      // Lets not flood the server too much\n      yield delay(200);\n    }\n  }\n}\n\n// Saga which manages other sagas related to a (group) channel\nfunction* channelSaga(channel) {\n  try {\n    channel.join();\n\n    yield all([\n      call(handleIncomingMessages, channel),\n      call(handleOutgoingMessages, channel),\n      call(handleChatQueries, channel),\n    ]);\n  } finally {\n    if (yield cancelled()) {\n      channel.leave();\n      console.log(\"channelSaga cancelled\", channel.topic);\n    }\n  }\n}\n\n// Starts member channel where all private messages must be sent to\nfunction* myChannelSaga(socket, networkChannel) {\n  const { profile } = yield call(query, networkChannel, \"my_profile\");\n  const memberChannel = socket.channel(`member:${profile.id}`);\n  yield fork(channelSaga, memberChannel);\n\n  // Send events via member channel, regardless where origin from\n  // This removes the need for channel routing and the backend doesn't care either\n  yield throttle(\n    COMPOSING_TIMEOUT * 0.8,\n    [\"chat/COMPOSER/SET_TEXT\", \"chat/SEND_MESSAGE\"],\n    pushComposingEvent,\n    memberChannel,\n  );\n  yield throttle(\n    500,\n    [\"chat/MESSAGE/RECEIVE\"],\n    markMessageAsReceived,\n    memberChannel,\n    profile.id,\n  );\n  yield takeLatest(\n    [\"chat/MY_CHATS/REPLY\"],\n    markLastChatMessagesAsReceived,\n    memberChannel,\n    profile.id,\n  );\n}\n\nconst isGroupChat = ({ id }) => id.indexOf(\"group/\") === 0;\nconst groupChatIdToTopic = (id) => id.replace(\"/\", \":\");\n\n// Launch a group channel for every group chat returned by my_chats\n// Also launch channels for future group chats\nfunction* chatChannelsSaga(socket, networkChannel) {\n  const { chats } = yield call(query, networkChannel, \"my_chats\");\n  const navigation = yield select(getChatNavigation);\n  if (navigation.route === \"showChat\")\n    yield call(fetchChatDetails, { chatId: navigation.params.chatId });\n\n  yield all(\n    map(filter(chats, isGroupChat), ({ id }) =>\n      fork(channelSaga, socket.channel(groupChatIdToTopic(id))),\n    ),\n  );\n\n  while (true) {\n    const action = yield take([\n      \"chat/CREATE_CHAT/REPLY\",\n      \"chat/CREATE_CHAT/RECEIVE\",\n    ]);\n    if (isGroupChat(action.payload)) {\n      yield fork(\n        channelSaga,\n        socket.channel(groupChatIdToTopic(action.payload.id)),\n      );\n    }\n  }\n}\n\n// Do stuff on the network channel\nfunction* channelsSaga(socket, networkId) {\n  const networkChannel = socket.channel(`network:${networkId}`);\n  yield fork(presenceSaga, networkChannel);\n\n  yield call(join, networkChannel);\n  yield call(query, networkChannel, \"network_info\");\n  yield fork(myChannelSaga, socket, networkChannel);\n  yield fork(chatChannelsSaga, socket, networkChannel);\n  yield fork(handleChatQueries, networkChannel);\n}\n\nexport default channelsSaga;\n","import {\n  all,\n  takeEvery,\n  put,\n  call,\n  select,\n  takeLatest,\n} from \"redux-saga/effects\";\nimport Tinycon from \"tinycon\";\n\nimport { getProfileId } from \"../../selectors/chat/application\";\nimport {\n  getUnreadChatsCount,\n  isMuted,\n  getChatProfile,\n} from \"../../selectors/chat/chat\";\n\nconst notify = ({ title, ...options }) =>\n  new Promise((resolve, reject) => {\n    const notification = new Notification(title, options);\n\n    const notificationCloser = () => {\n      notification.close();\n    };\n    window.addEventListener(\"beforeunload\", notificationCloser);\n\n    notification.onclick = () => {\n      window.focus();\n      resolve();\n      notification.close();\n    };\n    notification.onclose = () => {\n      console.log(\"CLOSED\", title, options);\n      window.removeEventListener(\"beforeunload\", notificationCloser);\n      reject();\n    };\n  });\n\nfunction* notifyForIncomingMessage({ payload }) {\n  const membershipId = yield select(getProfileId);\n\n  // Create notification only for messages from other people\n  if (membershipId === payload.from.id) {\n    return;\n  }\n\n  const _isMuted = yield select(isMuted, {\n    chatId: payload.chat_id,\n  });\n\n  if (_isMuted) {\n    return;\n  }\n\n  const profile = yield select(getChatProfile, { chatId: payload.chat_id });\n\n  try {\n    yield call(notify, {\n      title: profile.name,\n      icon: profile.imageUrl,\n      body:\n        profile.type == \"group\"\n          ? `${payload.from.name}: ${payload.text}`\n          : payload.text,\n      tag: payload.chat_id,\n    });\n\n    yield put({\n      type: \"chat/NAVIGATE\",\n      payload: {\n        route: \"showChat\",\n        params: { chatId: payload.chat_id },\n      },\n    });\n  } catch (e) {\n    // Notification was closed\n  }\n}\n\nfunction* setTinycon() {\n  const unreadChats = yield select(getUnreadChatsCount);\n\n  Tinycon.setOptions({\n    color: \"#FFFFFF\",\n    background: \"#0081ce\",\n    fallback: true,\n  });\n  Tinycon.setBubble(unreadChats > 99 ? \"+\" : unreadChats);\n}\n\nfunction* notificationsSaga() {\n  if (window.Notification) {\n    yield takeEvery(\"chat/MESSAGE/RECEIVE\", notifyForIncomingMessage);\n  }\n\n  yield all([\n    call(setTinycon),\n    takeLatest(\n      [\n        \"chat/MY_CHATS/REPLY\",\n        \"chat/MESSAGE/RECEIVE\",\n        \"chat/MARK_AS_READ\",\n        \"chat/MARK_AS_READ/RECEIVE\",\n      ],\n      setTinycon,\n    ),\n  ]);\n}\n\nexport default notificationsSaga;\n","import { all, call, cancel, take, fork, race, put } from \"redux-saga/effects\";\nimport delay from \"@redux-saga/delay-p\";\nimport { Socket } from \"phoenix\";\nimport { map } from \"lodash\";\n\nimport { createEventSaga } from \"./helpers\";\nimport channelsSaga from \"./channels\";\nimport notificationsSaga from \"./notifications\";\nimport applicationSaga from \"./application\";\n\n// Create a new socket connection, i.e. after auth changed\nfunction createSocket({ socketUrl, ...options }) {\n  return new Socket(socketUrl, {\n    reconnectAfterMs() {\n      return 5000;\n    },\n    // logger: (kind, msg, data) => {\n    //   if (!/push|receive/.exec(kind)) {\n    //     console.log(`SOCKET ${kind}: ${msg}`, data);\n    //   }\n    // },\n    ...options,\n  });\n}\n\n// This saga turns the basic socket open, error and close events into dispatched actions\nconst socketEventSaga = createEventSaga({\n  events: (dispatch) => ({\n    onOpen: () => dispatch({ type: \"chat/SOCKET/ON_OPEN\" }),\n    onError: () => dispatch({ type: \"chat/SOCKET/ON_ERROR\" }),\n    onClose: () => dispatch({ type: \"chat/SOCKET/ON_CLOSE\" }),\n  }),\n  bind: (socket, handlers) => map(handlers, (fn, name) => socket[name](fn)),\n});\n\n// Allows caching of credentials while respecting their expires_in value\nconst credentialsCache = (function () {\n  let payload = null;\n  let validUntil = null;\n  const SAFETY_MARGIN = 3 * 60; // 3 minutes\n\n  return {\n    get: () =>\n      payload && validUntil - SAFETY_MARGIN > new Date() / 1000\n        ? payload\n        : null,\n    set: (p) => {\n      payload = p;\n      // use expires_in if available, otherwise default to 3 hours\n      const expiresIn = 3 * 60 * 60;\n      validUntil = new Date() / 1000 + expiresIn;\n    },\n  };\n})();\n\nfunction* memoizedCredentials(fetchCredentials) {\n  yield put({ type: \"chat/FETCH_CREDENTIALS/START\" });\n  const cachedPayload = yield call([credentialsCache, \"get\"]);\n\n  if (cachedPayload) {\n    yield put({\n      type: \"chat/FETCH_CREDENTIALS/FROM_CACHE\",\n    });\n    return cachedPayload;\n  }\n\n  try {\n    const payload = yield call(fetchCredentials);\n    yield call([credentialsCache, \"set\"], payload);\n    yield put({ type: \"chat/FETCH_CREDENTIALS/SUCCESS\" });\n    return payload;\n  } catch (e) {\n    yield put({ type: \"chat/FETCH_CREDENTIALS/FAILURE\" });\n    throw e;\n  }\n}\n\n// root saga for chat\nfunction* rootSaga({ fetchCredentials, socketUrl }) {\n  let windowUnloading = false;\n  window.addEventListener(\"beforeunload\", () => {\n    windowUnloading = true;\n  });\n\n  yield all([fork(applicationSaga), fork(notificationsSaga)]);\n\n  while (true) {\n    const { token, network_id: networkId } = yield call(\n      memoizedCredentials,\n      fetchCredentials,\n    );\n\n    yield put({ type: \"chat/CONNECT/START\" });\n    const socket = yield call(createSocket, { params: { token }, socketUrl });\n    const socketEventTask = yield fork(socketEventSaga, socket);\n    //window.socket = socket; // for dev/debugging purposes\n    socket.connect();\n\n    console.log(\"waiting for connection\");\n    const events = yield race({\n      open: take(\"chat/SOCKET/ON_OPEN\"),\n      error: take(\"chat/SOCKET/ON_ERROR\"),\n      close: take(\"chat/SOCKET/ON_CLOSE\"),\n    });\n\n    if (events.open) {\n      yield put({ type: \"chat/CONNECT/SUCCESS\" });\n\n      console.log(`Joining channels for network ${networkId} now!`);\n\n      const channelsTask = yield fork(channelsSaga, socket, networkId);\n\n      // Socket was disconnected after some time\n      yield take(\"chat/SOCKET/ON_CLOSE\");\n\n      // Stop here if we are reloading/navigating away\n      if (windowUnloading) {\n        console.log(\"Stopping chat rootSaga\");\n        return;\n      }\n\n      console.log(\"Cancelling channelsTask\");\n      yield cancel(channelsTask);\n    }\n\n    // This will stop all reconnect attempts\n    socket.disconnect();\n\n    console.log(\"Cancelling socketEventTask\");\n    yield cancel(socketEventTask);\n\n    // Socket failed on first connect, delay reconnect\n    if (events.error || events.close) {\n      const retryIn = 5000 + Math.random() * 5000;\n      yield put({ type: \"chat/CONNECT/ERROR\", retryIn });\n      yield delay(retryIn);\n    }\n  }\n}\n\nexport default rootSaga;\n","import { get } from \"lodash\";\nimport getFp from \"lodash/fp/get\";\n\nexport const getCurrentChat = getFp([\"chat\", \"navigation\", \"params\", \"chatId\"]);\n\nexport const getNetworkUrl = (state) =>\n  get(state, [\"chat\", \"session\", \"networkUrl\"]);\n\nexport const getImageUrl = (state, imageId, size) => {\n  if (!imageId) {\n    return null;\n  }\n\n  const networkUrl = getNetworkUrl(state);\n  if (!networkUrl) {\n    return null;\n  }\n\n  return `${networkUrl}/api/storage/images/${imageId}/get/${size}`;\n};\n\nexport const getProfileId = getFp([\"chat\", \"profile\", \"id\"]);\n\nexport const getChatNavigation = (state) => get(state, [\"chat\", \"navigation\"]);\n","import { get } from \"lodash\";\n\nexport const getHomie = (state, homieId) =>\n  get(state, [\"chat\", \"homies\", homieId]);\n","import { get, find, isEqual, orderBy, reduce, findLast } from \"lodash\";\nimport { createSelector } from \"reselect\";\nimport moment from \"moment\";\nimport { getProfileId, getImageUrl } from \"./application\";\nimport { getHomie } from \"./homies\";\n\nexport const getChats = (state) => get(state, [\"chat\", \"chats\"]);\n\nexport const getSortedChats = createSelector(getChats, (chats) =>\n  orderBy(chats, \"last_interacted_at\", [\"desc\"]),\n);\n\nexport const getRawChatProfile = (state, { chatId }) =>\n  get(state, [\"chat\", \"chats\", chatId]);\n\nexport const getChatProfile = (state, { chatId }) => {\n  const chat = getRawChatProfile(state, { chatId });\n  const [type] = chatId.split(\"/\");\n  const imageUrl = getChatImageUrl(state, chatId);\n\n  return {\n    ...chat,\n    type,\n    imageUrl,\n  };\n};\n\nexport const getStateForChat = (state, { chatId }) =>\n  get(getRawChatProfile(state, { chatId }), [\"state\"]);\n\nexport const getCounterForChat = (state, { chatId }) =>\n  get(getStateForChat(state, { chatId }), [\"unread_count\"]);\n\nexport const getLastReadIdForChat = (state, { chatId }) =>\n  get(getStateForChat(state, { chatId }), [\"last_read_id\"]);\n\nexport const getMutedUntilForChat = (state, { chatId }) =>\n  get(getStateForChat(state, { chatId }), [\"muted_until\"]);\n\nexport const getAppMutedUntilForChat = (state, { chatId }) =>\n  get(getStateForChat(state, { chatId }), [\"app_muted_until\"]);\n\nexport const getCanForChat = (state, { chatId }) =>\n  get(getRawChatProfile(state, { chatId }), [\"can\"]);\n\n// not pure !\nexport const isMuted = (state, { chatId }) => {\n  const mutedUntil = window.isApp\n    ? getAppMutedUntilForChat(state, { chatId })\n    : getMutedUntilForChat(state, { chatId });\n  return mutedUntil && moment().isBefore(mutedUntil);\n};\n\nexport const getAggregatedUnreadCount = (state) =>\n  reduce(\n    getChats(state),\n    (result, chat) => result + get(chat, [\"state\", \"unread_count\"], 0),\n    0,\n  );\n\nexport const getAggregatedUnreadCountWithoutChat = (state, { chatId }) =>\n  reduce(\n    getChats(state),\n    (result, chat) =>\n      chat.id == chatId\n        ? result\n        : result + get(chat, [\"state\", \"unread_count\"], 0),\n    0,\n  );\n\nexport const getUnreadChatsCount = (state) =>\n  reduce(\n    getChats(state),\n    (result, chat) => {\n      if (get(chat, [\"state\", \"unread_count\"], 0) > 0) {\n        return result + 1;\n      }\n      return result;\n    },\n    0,\n  );\n\nexport const getUnreadChatsCountWithoutChat = (state, { chatId }) =>\n  reduce(\n    getChats(state),\n    (result, chat) => {\n      if (chatId !== chat.id && get(chat, [\"state\", \"unread_count\"], 0) > 0) {\n        return result + 1;\n      }\n      return result;\n    },\n    0,\n  );\n\n// Return the full url to the image of a chat if possible\nexport const getChatImageUrl = (state, chatId) => {\n  const rawProfile = getRawChatProfile(state, { chatId });\n  if (rawProfile) {\n    return getImageUrl(state, rawProfile.image_id, \"80x80\");\n  }\n  return null;\n};\n\n// Returns true if this \"chat\" is online. This currently can only happen for member 1:1 chats\nexport const getChatOnlineStatus = (state, chatId) => {\n  const partnerId = getPartnerId(state, chatId);\n  return partnerId ? getMemberOnlineStatus(state, partnerId) : null;\n};\n\n// Returns true if this \"chat\" is busy. This currently can only happen for member 1:1 chats\nexport const getChatBusyStatus = (state, chatId) => {\n  const partnerId = getPartnerId(state, chatId);\n  return partnerId ? getMemberBusyStatus(state, partnerId) : null;\n};\n\n// Turn chatId \"member/123:345\" into \"345\" if \"123\" is your id\nexport const getPartnerId = (state, chatId) => {\n  const [type, idRest] = chatId.split(\"/\");\n  if (type === \"member\") {\n    const myId = getProfileId(state);\n    return find(idRest.split(\":\"), (e) => !isEqual(e, myId));\n  }\n  return null;\n};\n\nexport const getMemberOnlineStatus = (state, membershipId) => {\n  const timestamps = get(state, [\n    \"chat\",\n    \"presence\",\n    \"onlineMembers\",\n    membershipId,\n  ]);\n  return timestamps && timestamps.length > 0;\n};\n\nexport const getMemberBusyStatus = (state, membershipId) => {\n  return get(state, [\"chat\", \"presence\", \"busyMembers\", membershipId]);\n};\n\nexport const getRequestStateForChat = (state, { chatId }) =>\n  get(getRawChatProfile(state, { chatId }), [\"requestState\"], {});\n\nexport const getMoreMessagesAvailableForChat = (state, { chatId }) =>\n  get(\n    getRequestStateForChat(state, { chatId }),\n    [\"moreMessagesAvailable\"],\n    true,\n  );\n\n// Gets a known homie which has recently started composing in given chatId\nexport const getComposingHomie = (state, { chatId }) => {\n  const composingIds = get(state, [\"chat\", \"composing\", chatId]);\n  const myId = getProfileId(state);\n  const recentlyComposingHomieId = findLast(\n    composingIds,\n    (id) => id !== myId && getHomie(state, id),\n  );\n  if (!recentlyComposingHomieId) {\n    return null;\n  }\n  return getHomie(state, recentlyComposingHomieId);\n};\n","import { isEmpty, get, last, first, find, findLast } from \"lodash\";\nimport { createSelector } from \"reselect\";\n\nimport { getLastReadIdForChat } from \"./chat\";\nimport { getMyId } from \"./profile\";\n\nexport const getMessagesForChat = (state, { chatId }) =>\n  get(state, [\"chat\", \"messages\", chatId]);\n\nexport const getMessageById = (state, { id, chatId }) =>\n  find(getMessagesForChat(state, { chatId }), (m) => m.id === id);\n\nexport const getLastUnreadMessageInChat = createSelector(\n  [getMessagesForChat, getLastReadIdForChat, getMyId],\n  (messages, lastReadId, myId) =>\n    findLast(messages, (m) => m.from.id !== myId && m.id > lastReadId),\n);\n\nexport const getLastMessageIdInChat = createSelector(\n  getMessagesForChat,\n  (messages) => (isEmpty(messages) ? null : last(messages).id),\n);\n\nexport const getFirstMessageIdInChat = createSelector(\n  getMessagesForChat,\n  (messages) => (isEmpty(messages) ? null : first(messages).id),\n);\n\nexport const getChatPartnerState = (state, { chatId }) =>\n  get(state, [\"chat\", \"chats\", chatId, \"partner_state\"]);\n\n// Message delivery states in order of occurrence\n//\n// pushed:\n//   my messages only\n//   pushed via channel but no successful reply from server yet\n//\n// persisted:\n//   my messages only\n//   got successful reply after push, so it is persisted on the server\n//   but not yet delivered to chat partner\n//   or if it is in group chat then this is the final status\n//\n// received:\n//   also means unread\n//   messages has been received by ourselves or the chat partner\n//\n// read:\n//   message has been read by ourselves or the chat partner\n\nexport const getMessageDeliveryStatus = (state, { id, chatId }) => {\n  const myId = getMyId(state);\n  const message = getMessageById(state, { id, chatId });\n\n  if (myId == message.from.id) {\n    if (isEmpty(message.id)) return \"pushed\";\n\n    if (message.chat_id.indexOf(\"member/\") === 0) {\n      const partnerState = getChatPartnerState(state, { chatId });\n      if (partnerState) {\n        if (partnerState.last_read_id >= id) return \"read\";\n        if (partnerState.last_received_id >= id) return \"received\";\n      }\n    }\n    return \"persisted\";\n  } else {\n    const last_read_id = getLastReadIdForChat(state, { chatId });\n    if (last_read_id >= id) return \"read\";\n    return \"received\";\n  }\n};\n","import flow from \"lodash/fp/flow\";\nimport getFp from \"lodash/fp/get\";\n\nexport const getMyProfile = getFp([\"chat\", \"profile\"]);\nexport const getMyId = flow(getMyProfile, getFp([\"id\"]));\n"],"names":["IS_CHAT_QUERY","IS_NETWORK_QUERY","createChatQueryAction","event","type","toUpperCase","actionCreator","data","replyType","createNetworkQueryAction","basicActionCreator","loadChatDetails","loadMoreMessages","markAsRead","muteChat","muteAppChat","unmuteChat","unmuteAppChat","createChat","IS_API_REQUEST","fetchAvailableChats","createApiAction","endpoint","meta","q","stringify","only_my_groups","only_chat_enabled","setChatStatus","Muted","React","className","compose","withProps","id","startsWith","connect","state","counter","getCounterForChat","chatId","muted","isMuted","composingHomie","getComposingHomie","dispatch","select","payload","route","params","window","Notification","permission","requestPermission","Row","name","last_message","last_interacted_at","mom","min","moment","onClick","title","ChatImage","last_read_id","Composing","from","text","format","fromNow","statusOption","busy","online","invisible","useCurrentStatus","isOnline","useSelector","getMemberOnlineStatus","Preload","current_member","presence","getMemberBusyStatus","StartNewButton","navigateToNewChat","disabled","FontAwesomeIcon","icon","_faComment","I18n","t","ChatStatusCircle","status","_faCircle","_faCircle2","_faEyeSlash","StatusButton","toggleStatusMessageForm","OnlineStatusDropdown","selectedOption","setSelectedOption","handleOptionChange","e","option","preventDefault","role","href","current_network","config","show_online_status","StatusMessageForm","initialRender","useRef","statusText","setStatusText","useState","currentStatus","useDispatch","submitStatus","replace","useEffect","current","isEmpty","classNames","chat__header","isApp","Textarea","maxLength","minRows","maxRows","value","autoFocus","onChange","target","CloseButton","toggleChatbar","_faXmark","chats","getSortedChats","connected","get","ChatList","showStatusMessageForm","ChatHeader","ButtonLeft","ButtonRight","mobile_app_chat__list","map","item","index","Object","assign","key","getApiRequestState","action","withState","withHandlers","toggleOpen","open","setOpen","GroupedItems","items","allowToggle","renderItemComponent","_faChevronRight","Tile","classnames","memberChat","groupChat","NewChat","constructor","args","submitSearch","this","props","currentTarget","elements","render","member","groupsByCategoryName","availableChats","BackToRootButton","onSubmit","placeholder","requestState","_faSpinner","_faSearch","groups","componentDidMount","Chat","selected","chatName","length","parts","compact","split","trim","chatInitials","currentChat","getCurrentChat","slice","selectChat","nextChat","currIndex","findIndex","c","nextIndex","prevChat","prevIndex","QuickChatSelect","chat","times","i","MUTE_DURATIONS","memoize","add","toDate","endOf","MuteLink","muteUntil","dispatchAction","muted_until","label","ChatRoomSettingsButton","_faVolumeOff","_faEllipsisH","appOnly","THROTTLE","ScrollContainer","super","cancelScrollEvent","stopImmediatePropagation","returnValue","handleWheel","div","container","scrollTop","scrollHeight","height","clientHeight","wheelDelta","deltaY","isDeltaPositive","trackScrolling","lastScrollPosition","direction","callbackThreshold","autoscrollThreashold","setState","autoscrollBreaked","callStartReached","callEndReached","bumper","lastScrollPoint","debounce","onStartReached","leading","trailing","onEndReached","scroll","smooth","autoscroll","performScroll","lastScrollHeight","style","scrollBehavior","offsetHeight","DIV","setTimeout","onClickScrollToBottom","handleScrolling","throttle","handleResize","addEventListener","componentWillUnmount","removeEventListener","componentDidUpdate","prevProps","count","children","ref","startElement","endElement","MessageAuthor","imageUrl","alt","src","MessageSettings","myMessage","fromId","fromDeleted","indexOf","hideStartPrivateChat","is_external","messageId","EMOJI_REGEX","createEmojiRegex","onlyEmojis","every","toArray","sym","isEmoji","symbol","lastIndex","test","markdownRenderer","Application","getNewMarkdownRenderer","Remarkable","options","use","linkify","noop","html","breaks","linkTarget","core","ruler","disable","inline","enable","block","markdownTextToHtml","markdown","console","log","MessageText","emoji","getEmojiClassName","max","symbols_count","dangerouslySetInnerHTML","__html","nextProps","QuotedMessage","message","getTitle","deliveryStatus","MessageDeliveryStatus","_faCheck","_faCheckDouble2","getIcon","MessageDate","date","fullDate","dateTime","chat_id","getMyId","fromProfile","getMyProfile","getMessageDeliveryStatus","getImageUrl","ChatMessage","created_at","groupedMessage","quoted_message","deleted","DaySeparator","getRequestStateForChat","messages","getMessagesForChat","loadingMessages","moreMessagesAvailable","lastMessageFrom","lastMessageDate","mobile_app_chat_room_android","bridge","isAndroid","mobile_app_chat_room_ios","isIOS","flatMap","result","sameAuthor","sameDay","isSame","push","getMessageById","removeMessageToQuote","MessageToQuote","MessageComposer","messageToQuoteId","getComposerMessageToQuoteId","composerTextByChatId","setComposerTextByChatId","initialValue","setValue","storedValue","localStorage","getItem","JSON","parse","setItem","usePersistentState","handleSubmit","register","getValues","setFocus","reset","useForm","invokeDebounced","useMemo","submit","quoted_message_id","can","getCanForChat","write","required","onKeyDown","keyCode","shiftKey","ctrlKey","altKey","metaKey","_faPaperPlane","MobileAppWrapper","getChatProfile","ChatRoom","subtitle","BackButton","_faArrowLeft","getUnreadChatsCountWithoutChat","getUnreadChatsCount","chatStatus","navigation","document","getElementById","classList","remove","hidden","OnlineStatus","isBusy","ICONS","_faUser","group","_faUsers","Image","getChatImageUrl","getChatOnlineStatus","getChatBusyStatus","GroupNavigation","groupSlug","isLoading","useQuery","fetchApi","enabled","refetchOnWindowFocus","useGroupNavigationItems","Placeholder","nav","NavigationItem","last","link","new_window","navigation_items","active_match","join_request_count","location","useLocation","isActive","matchPath","pathname","match","hasNavigationItems","dropdown","undefined","rel","Loading","fetchMembers","baseType","includeConsumers","input","excludeGroupMembersOf","recipientId","isEqual","Reflect","set","join","fetchMembersAndGroups","includeMembershipRoles","include_membership_roles","optionsKey","loadOptions","Promise","resolve","reject","onlyMyGroups","membersAndGroups","then","success","mergedEntries","entries","forEach","entry","membership_roles","membershipRole","mergeEntries","groupedOptions","other","groupOptions","filter","membership_status_of_current_member","_faUser2","standard","showNameWithProfileField","detectionProfileField","detection_profile_field","isExternal","keys","catch","m","displayName","multi","wrapperStyle","field","selectProps","asyncPropsOptions","isMulti","loadingMessage","noOptionsMessage","inputValue","inputId","Async","onBlur","openMenuOnFocus","styles","base","plusOne","PaginationButton","active","page","onPaginate","query","search","totalPages","loading","width","hideIfEmpty","handlePaginate","dataset","scrollTo","top","pages","cappedPage","Math","range","unshift","n","el","$","spectrum","showInput","preferredFormat","showInitial","showPalette","palette","colorPalette","cancelText","chooseText","change","color","toHexString","tabs","selectTabIndex","selectedTabIndex","tab","multiline","hint","fieldProps","ControlGroup","Field","component","Hint","store","Component","wrapped","Provider","createAdaptBackboneView","componentsMap","adaptBackboneView","view","componentName","mapProps","listenTo","standalone","Error","connectedComponent","debounceTime","WrappedComponent","MemoizedWrappedComponent","Connect","context","getDerivedStateFromProps","getDerivedStateFromError","hasError","componentDidCatch","error","errorInfo","trySubscribe","tryUnsubscribe","unsubscribe","changeHandler","handleChange","bind","each","entity","on","off","entityState","propsToPass","getDisplayName","connectBackbone","_reactRoots","handleRender","createHandleRender","rawEl","$container","$el","root","oldRoot","unmount","createRoot","Wrapper","handleClose","createHandleClose","close","once","addComponents","extraComponentMap","queryCache","QueryCache","queryClient","QueryClient","defaultOptions","queries","queryFn","async","queryKey","QueryClientProvider","client","WILDCARD_END","compileRoute","path","endsWithWildcard","exec","pathToCompile","end","compileRouteMemoized","compileRoutesMemoized","routes","element","forceTurbo","getLocationState","hash","history","useParams","useContext","ParamsContext","useSearchParams","URLSearchParams","navigate","to","Turbo","session","drive","debug","toString","invariant","isString","url","URL","_","pathnameParts","groupSlugInPath","my_groups","find","slug","navigateToUnjoinedGroup","isNumber","go","replaceState","pushState","useNavigate","matchRoutes","compiledRoutes","matchResult","defaultParams","LocationContext","useRoutes","matchedRoute","lastParams","pattern","BrowserRouter","locationState","setLocationState","updateLocationState","maybeNewLocationState","events","addEventDispatch","orig","apply","Event","dispatchEvent","originalPushState","originalReplaceState","useQueryParams","warn","queryParam","setQueryParam","getQueryParams","fromEntries","reduce","curr","useMaxHeight","setStyle","updateStyle","maxHeight","innerHeight","CHAT_STATIC_BREAKPOINT","coversWholeScreen","getComputedStyle","innerWidth","HTMLElement","SVGElement","togglebar","toggle","parentNode","HTMLButtonElement","openBarElements","Set","bar","show","querySelector","persist","isUndefined","contains","sessionStorage","disableBodyScrolling","removeItem","delete","restoreBodyScrolling","getResizeHandler","body","scrollY","overflow","position","some","Array","removeProperty","parseInt","closeUserbar","restoreVisibility","hideStaticChat","restoreStaticChat","application","start","Stimulus","Controller","scrollToOpenAccordion","openAccordionItem","previousElementSibling","scrollIntoView","behavior","onClickChangeValue","$CloseActivityReplyAutomaticSelect","Flash","alert","rootId","closeNotification","ReactDOM","category","changeCategory","removeCategory","setText","edit","setEdit","translation","showIcon","small","MarkdownTranslation","categories","selectedCategories","setSelectedCategories","setError","changedCategories","cat","_destroy","getElementsByName","setAttribute","InfoText","CategoryRow","_class","CategoriesEditor","hasContextValue","contextValue","categoriesValue","disconnect","values","String","JoinRequestModal","onClose","joinRequestId","formRef","submitUrl","Modal","static","useMinHeightMax","modalActionProps","submitText","modalSubmitActionClassName","childElement","createElement","appendChild","onCloseModal","showModal","groupSlugValue","joinRequestIdValue","removeChild","_getSelectedInviteIds","_classPrivateFieldLooseKey","_findInvite","_submitSuccess","_submitFailure","defineProperty","_submitFailure2","_submitSuccess2","_findInvite2","_getSelectedInviteIds2","refreshInvites","invite_ids","_classPrivateFieldLooseBase","renewInvites","model","Tixxt","instance","showBodied","Invites","BatchRenewInviteView","externalInvitesCount","groupInvitesCount","countSelectedInviteTypes","confirm","group_invites_count","network_invites_count","method","batchRenewSuccess","batchRenewFailure","revokeInvites","ajax","done","fail","selectedCheckboxes","querySelectorAll","checkbox","toastr","getUrlForPage","frame","pageField","origin","searchParams","Invite","fetch","showInviteDetails","findInvite","inviteId","InviteDetailsView","refreshInvite","RenewInviteView","toggleCheckboxListener","checkboxes","anyChecked","toggleDisableButtons","inviteStatus","getSelectedInviteStatus","revokeable","renewable","includes","revokeButton","renewButton","dragstart","dataTransfer","setData","entryId","dragover","targetElement","removeHighlight","dragend","drop","getData","targetEntryId","entryElement","entryElementById","moveEntryElement","persistOrder","initializeDraggable","disconnectDraggable","entryTargets","parentElement","child","sourceElement","targetParent","compareDocumentPosition","insertBefore","nextElementSibling","order","getElementsByClassName","visit","targets","_SELECTOR_MAPPING","_DEFAULT_VALUE_MAPPING","_intervalSelector","_setSelectorValue","_createSecondDaySelector","_createDaySelector","_createAndAppendTimeSelector","_createTimeSelector","_createTimeSelectorOption","_createDaySelectorOptions","_createDaySelectorOption","_createMonthHelpBlock","_removeElement","_removeSecondDaySelector","_removeMonthHelpBlock","_removeMonthHelpBlock2","_removeSecondDaySelector2","_removeElement2","_createMonthHelpBlock2","_createDaySelectorOption2","_createDaySelectorOptions2","_createTimeSelectorOption2","_createTimeSelector2","_createAndAppendTimeSelector2","_createDaySelector2","_createSecondDaySelector2","_setSelectorValue2","_intervalSelector2","writable","weekly","semimonthly","monthly","semimonthly_2","time","$dayTimeContainer","$daySelector","intervalValue","onClickChangeInterval","targetValue","isSemiMonthly","isMonthly","innerHTML","dayValue","secondDayValue","timeValue","secondTimeValue","selector","mapping","tern","$secondDayTimeContainer","$secondDaySelector","after","parent","variable","textContent","opt","toInteger","day","$monthHelpBlock","parentContainer","interval","secondDay","secondTime","onMessage","source","iframe","contentWindow","design","unlayerLocale","de","en","es","fr","postMessage","projectId","translations","tixxt_content_placeholder","salutation","salutation_sample","disclaimer_and_settings","disclaimer_and_settings_sample","published_in_preview_info","published_in_preview_date","published_in_preview_published_in","published_in_preview_streams","link_color_published_in_label","text_color_published_in_label","colors_group_title","tixxt_content_label","network","host","imprint","locale","storageToken","allSubmitsDisabled","resolveExportHtml","targetOrigin","submitting","stopPropagation","chunks","fonts","errors","countOccurrences","submitter","click","setupIframe","Date","getTime","button","content","matches","RegExp","Phoenix","Views","Inputs","MemberSelect","multiple","clipboard","ClipboardJS","destroy","popups","magnificPopup","Lightbox","handleExternalInvite","openEditExternalIds","display","focus","closeEditExternalIds","onClickGoBack","back","finalizeSelectionOptions","mil","now","seq","uniqueValue","kebabCase","TabbableFields","fields","selectedIndex","selectIndex","fieldName","property","AddOptionsFields","lastInput","focusLast","defer","PropertyForm","availableModifications","FieldArray","SelectionOptionsFields","PropertiesFields","AddOptions","existingOptions","ModificationForm","EDITOR_MAPPING","basic","formProps","ReduxForm","addDefaultValuesToSelectionOptions","properties","p","renderChildren","modified","initialValues","transformedInitialValues","addModificationsToProperties","modifications","parent_property_set","parentPropertySet","addedOptionsByName","add_options","addOptions","pullModificationsFromProperties","finalModifications","Editor","contextType","contextId","propertySet","usePropertySet","inherit","mutate","submitPropertySet","usePersistPropertySet","SpecializedForm","form","onSubmitSuccess","onSubmitFail","PropertySetEdit","propertySetName","PageTitle","PropertySetEditWrapper","nameValue","_selectAllCheckboxes","_onInput","_valid","_determineAllChecked","_get_selectAllCheckboxes","selectAllSelector","selectAll","checked","indeterminate","onClickChangeTab","toggleTarget","nodeName","elem","allFactors","response","credentials","json","getNewTotp","okJson","ok","createNewTotp","validationCode","headers","code","provisioning_uri","resetBackupCodes","deleteFactor","perform2fa","csrfTokenHeader","getNewEmail","createNewEmail","secret_key","LOOKUP","totp","ResetBackupCodesButton","DeleteFactorButton","directDelete","routeName","AddFactorButton","email","routeContext","RouteContext","submitDeleteFactor","useMutation","onSuccess","updatedFactors","getQueryData","last_used_at","setQueryData","setRoute","AbortButton","FactorsPage","isError","ListFactors","factors","factorDisplayName","factor","FactorActions","BackupCodes","backupCodes","redirectTo","downloadCodesAsTxtFile","file","Blob","createObjectURL","download","setValidationCode","setRedirectTo","retry","submitCreateNewTotp","createResult","createError","isCreating","redirect_to","QRCode","renderAs","verificationCodeInput","htmlFor","inputMode","autoComplete","deleteError","submitResetBackupCodes","resetBackupCodesResult","resetError","submitCreateNewEmail","FactorsContainer","AddTotpPage","AddEmailPage","DeleteFactorPage","ResetBackupCodes","FactorsWrapper","AccordionScrollController","Administration__Activitystream__CloseActivityReplyMonthController","Administration__EditCategoriesController","Administration__Groups__JoinRequestMessageController","Administration__Invites__SendBatchActionsController","Administration__Invites__SentController","Administration__Invites__ToggleBatchActionsController","Administration__Newsletter__DragAndDropController","Administration__Newsletter__IntervalController","Administration__Newsletter__UnlayerFormController","Administration__RoleAssignmentsController","Administration__Teams__FallbackUpnAssignmentsController","ClipboardController","ExternalActivitystreamsController","Invites__HandleExternalInviteController","MinistryController","Shared__GoBackButtonController","Shared__PropertySetEditController","Shared__SelectAllController","Shared__TabbarController","Shared__ToggleController","TwoFactorAuthenticationsController","bootstrap","Tooltip","Popover","autoReplaceSvg","library","_faDailymotion","_faDeviantart","_faFacebook","_faFlickr","_faInstagram","_faKickstarter","_faMicrosoft","_faSlideshare","_faSoundcloud","_faSpotify","_faTwitter","_faVimeo","_faYoutube","_faCloudArrowDown","_faEnvelope3","_faFile3","_faFileAudio","_faFileCode2","_faFileCsv2","_faFileExcel3","_faFileImage","_faFileLines","_faFilePdf","_faFilePowerpoint2","_faFileVideo","_faFileWord2","_faFileZipper","_faImage4","_faMobileScreenButton","_faPaperclipVertical2","_faAlignCenter","_faAlignLeft","_faAlignRight","_faAngleLeft2","_faAngleRight2","_faArrowDownToBracket","_faArrowLeft2","_faArrows2","_faArrowsRepeat2","_faArrowsUpDownLeftRight","_faBars2","_faBold3","_faBolt","_faBookmark","_faBoxArchive","_faBullhorn2","_faCalendar2","_faCalendarDay","_faCalendarPlus","_faCalendarRange","_faChartColumn","_faCheck2","_faCheckCircle","_faCheckSquare2","_faChevronDown2","_faChevronUp2","_faCircleCheck","_faCircleInfo2","_faCircleNotch","_faCirclePlay","_faCirclePlus","_faClipboard","_faClock","_faClone2","_faCloudDownload2","_faCloudUpload","_faComment2","_faCommentDots","_faCommentSlash","_faComments","_faDesktop2","_faEarthEurope","_faEdit","_faEllipsis2","_faEllipsisH2","_faEllipsisVertical","_faEnvelope2","_faExchange","_faEye2","_faFile2","_faFileCode","_faFileExcel2","_faFilePowerpoint","_faFileText","_faFileWord","_faFiles","_faFilter2","_faFloppyDisk","_faFolder2","_faFolderOpen2","_faHandshake","_faIdCard","_faImage2","_faImage3","_faInbox","_faItalic3","_faKeyboard","_faLink3","_faList3","_faListOl2","_faListUl2","_faLocationDot","_faLock2","_faMailbox2","_faMapLocation","_faMapLocationDot","_faMessages","_faMinusCircle","_faMobile","_faPaperclipVertical","_faPenToSquare","_faPencil2","_faPencilSquare2","_faPipe2","_faPlus2","_faPlusCircle2","_faPlusSquare","_faPowerOff","_faScissors","_faSearch3","_faShareSquare","_faSidebar","_faSpinner2","_faSquare2","_faStar2","_faSuitcaseRolling","_faTable","_faTags2","_faTerminal","_faThumbsUp2","_faTimes2","_faTimesCircle2","_faTrash2","_faTrashCan","_faTriangleExclamation","_faUnderline2","_faUnlock2","_faUpload","_faUserCircle2","_faUserPlus2","_faUserXmark","_faUsers2","_faVirus","_faVolumeXmark2","_faXmark2","_faAdjust","_faAlignJustify","_faAngleDoubleDown","_faAngleDoubleLeft","_faAngleDoubleRight","_faAngleDoubleUp","_faAngleLeft","_faAngleRight","_faArchive","_faArrowCircleUp","_faArrowDown","_faArrowRight","_faArrows","_faArrowsAlt","_faArrowsRepeat","_faAt","_faBan","_faBarChart","_faBars","_faBold","_faBold2","_faBook","_faBug","_faBullhorn","_faCalendar","_faCaretDown","_faCaretLeft","_faCaretRight","_faCertificate","_faCheckSquare","_faChevronCircleDown","_faChevronDown","_faChevronLeft","_faChevronUp","_faCircleInfo","_faCircleQuestion","_faClone","_faCloudDownload","_faCode","_faCode2","_faCodeFork","_faCoffee","_faCog","_faCogs","_faColumns","_faCompress","_faDesktop","_faEllipsis","_faEnvelope","_faExclamation","_faExpand","_faExternalLink","_faEye","_faFile","_faFileCsv","_faFileExcel","_faFilter","_faFlag","_faFlagCheckered","_faFolder","_faFolderOpen","_faFont","_faGlobe","_faGripDots","_faHashtag","_faHeader","_faHeader2","_faHome","_faImage","_faInfoCircle","_faItalic","_faItalic2","_faKey","_faLink","_faLink2","_faList","_faList2","_faListAlt","_faListOl","_faListUl","_faLock","_faMailbox","_faMapMarker","_faMessageXmark","_faMoneyBill","_faPaperclip","_faPencil","_faPencilSquare","_faPhone","_faPipe","_faPlay","_faPlayCircle","_faPlus","_faPlusCircle","_faPrint","_faQuestion","_faQuestionCircle","_faQuoteLeft","_faQuoteRight","_faRefresh","_faReply","_faReplyAll","_faSave","_faSearch2","_faShare","_faShield","_faSort","_faSortAsc","_faSortDesc","_faSortDown","_faSortNumericAsc","_faSortUp","_faSpaceShuttle","_faSquare","_faSquareO","_faStar","_faStepBackward","_faStepForward","_faStrikethrough","_faTag","_faTags","_faThumbsUp","_faThumbtack","_faTimer","_faTimes","_faTimesCircle","_faToggleOff","_faToggleOn","_faTrash","_faUnderline","_faUnlock","_faUnlockAlt","_faUserCircle","_faUserMinus","_faUserPlus","_faUserSecret","_faUserTimes","_faVolumeXmark","dom","watch","SMALL_BREAKPOINT","StatusIcon","_faCircle3","_faCircle4","Role","plural_name","participants","display_type","collapsed","setCollapsed","cursor","countBy","accepted","NameWithProfileField","statusToSort","rejected","declined","invited","pushParticipant","list","participant","splice","sortedIndexBy","lowerCase","invitesSelector","loadMoreUrlInvitesSelector","invitesLoadingSelector","participationsSelector","loadMoreUrlParticipationsSelector","participantsLoadingSelector","UnreadBadge","AppointmentInviteMeta","accept","decline","canOptRetroactively","totalAttendeesEnforcedAndExceeded","participation_locked","buttons","AppointmentInviteDate","frequency","all_day","same_day","AppointmentInvite","invitable","invitable_type","author","renderDate","renderMeta","networkSelector","_faRotate","size","total_attendees_enforced_and_exceeded","declineInvite","acceptInvite","RecurringAppointmentInvite","propTypes","PropTypes","appointment","invited_by","InvitesList","invites","inviteType","loadMore","loadMoreUrl","loadInvites","invite","_type","CustomConfigurator","existsDefault","setDefault","appointments","Appointment","ModifiedRecurringAppointment","RecurringAppointment","participations","default","AppointmentParticipation","unreadsQueryOptions","refetchInterval","convertPayload","features","activitystreams","Activitystreams","Calendars","Messages","total","sum","useFeaturesUnreads","currentMember","currentMemberSelector","delayedEnabled","setDelayedEnabled","timeout","clearTimeout","unreads","useFoldersUnreads","wrapProvider","isLoadingInvites","isLoadingParticipants","loadMoreParticipationsUrl","loadMoreInvitesUrl","activeTab","fetchInvites","loadParticipations","fetchParticipations","onLoadMoreInvites","loadMoreInvites","onLoadMoreParticipations","loadMoreParticipations","load","setActiveTab","createAppointmentContact","appointmentId","useCreateAppointmentContact","useCalendars","hasAttachments","areAttachmentsInLimit","mutateAsync","Backbone","trigger","onCancel","allowSaveWithoutChange","TextField","limit","currentNetwork","getConfig","TagEntry","mention","theme","rest","parentProps","omit","new","mentionSuggestionsEntryText","inlineTagPlugin","createMentionPlugin","mentionTrigger","entityMutability","mentionComponent","InlineTagSuggestions","suggestions","setSuggestions","onOpenChange","useCallback","_open","MentionSuggestions","onSearchChange","dataType","contentType","entryComponent","BaseComponent","plugins","pluginComponents","mentionPlugin","createInlineMentionPlugin","tagPlugin","toolbarPlugin","Toolbar","createToolbarPlugin","markdownPlugin","createMarkdownPlugin","undoPlugin","createUndoPlugin","counterPlugin","createCounterPlugin","linkifyPlugin","createLinkifyPlugin","blockBreakoutPlugin","createBlockBreakoutPlugin","shortcutsPlugin","createShortcutsPlugin","emojiPlugin","createEmojiPlugin","useNativeArt","selectButtonContent","_faFaceSmile","defaultTheme","emojiSelectButton","emojiSelectButtonPressed","inlineMentionPlugin","InlineMentionSuggestions","CharCounter","WordCounter","LineCounter","UndoButton","RedoButton","EmojiSuggestions","EmojiSelect","confirmationMessage","beforeUnloadListener","getConfirmationMessage","disableInterceptor","capture","useInterceptorPrompt","when","enableInterceptor","navigator","userAgent","TixxtComposer","withPlugins","uuidv4","editorStateByMarkdown","onEditorStateChange","setEditorState","newEditorState","markdownByEditorState","onClickFullscreen","handleFullscreen","onSetEditorRef","setEditorRef","setComposerRefCallback","focusEditor","editorRef","containerClasses","editorState","customStyleMap","createStyleMap","getCurrentContent","hasText","spellCheck","stripPastedStyles","textAlign","onOpen","closed","setClosed","Text","initial","onFocus","FieldError","filterRemoved","composerName","formValueSelector","filesCount","imagesCount","selectedTab","openTab","setOpenTab","FileUploadField","selectExisting","isImage","storageDirectory","createComment","activityId","useCreateComment","updateComment","replyId","useUpdateComment","useFileProcessing","formName","fieldAttachments","resizeCallback","$modalEl","modalBodyHeight","composerCss","editorRootCss","minHeight","composerHeight","editorHeight","css","reply","isOpen","saveCallback","cancelCallback","fullscreen","setFullscreen","isProcessing","setIsProcessing","openComposer","closeComposer","closeFullscreen","onError","fileProcessing","imageProcessing","processing","files","images","image","classNameFormActions","TixxtComposerAdapter","openFullscreen","Attachments","tagParents","TagParentsContext","uniq","FormSection","Fields","itemId","folder","parentFolderId","parent_folder_id","description","folder_profile","reduxForm","enableReinitialize","showFolderProfileFields","selectFolderProfilesEnabled","rows","EmbeddedValueSetForm","currentRootFolder","closeModal","onSelectFolder","selectedItemIds","modalTitle","sortBy","setSortBy","currentFolder","handleNavigate","breadcrumb","useFolderResource","Sorter","attribute","handleSort","colSpan","orderBy","FolderRow","i18n_type","navigateDisabled","fixedWidth","SelectedFolder","unselectFolder","folderId","useFetchFolder","spin","defaultFolder","setShowModal","targetFolder","FolderSelectModal","showFileProfileFields","selectFileProfilesEnabled","pristine","contextRootFolderId","rootFolderIdSelector","FolderSelectionField","FileDescription","FormActions","MaybeWrapped","onlyRows","ValueSetTable","showLoading","isNil","prop","PropertyShow","fileServerV2Discovery","isFinalizedOrLocked","selectedItemAndFolderIds","removeSelected","moveSelected","isDownloading","setIsDownloading","folders","canDestroyAndMove","canBeMoved","namespace","fileServerV2available","staleTime","serializeItemAndFolderIds","file_ids","folder_ids","current_folder_id","responseData","token","startDownload","contents","onRemoveItems","onMoveItems","headerRef","isHoveringHeader","setIsHoveringHeader","onmouseover","onmouseleave","ids","selectedIds","selectIds","isRemoving","setRemoving","isMoving","setMoving","allSelected","difference","selectedItemIdsByType","removeFiles","f","removeFolders","onSelectItem","useItemBatchSelection","groupBy","canDestroy","finalized","finalizedAt","locked","lockedById","selectAllCheckbox","childProps","rowProps","isSelected","showCheckbox","endsWith","disableSelection","onSelectFile","moveFiles","target_folder_id","source_folder_id","moveFolders","Spinner","filterToQueryString","quote","searchUrl","contextUrl","filters","formatExt","baseSearchPath","searchQuery","pickBy","identity","stringifyQuery","rawQ","filterStrings","parseSortByParam","sortByParam","directionString","serializeSortBy","directionNumber","tagUrl","module","tag","selectionUrl","TagUrlContext","SelectionUrlContext","GenericErrorBoundary","info","headless","pickImage","wantedWidth","wantedHeight","imagesPropType","isRequired","html_content","truncate","percent","activityUrl","sources","original_filename","img","tags","mentions","html_url","display_name","attachments","person","ImageAttachments","MentionAttachments","TagAttachments","LinkAttachment","FileAttachments","calendars","calendar","backgroundColor","time_zone","note","Note","question","schedule","Survey","survey","actor","object","TypeView","actorImage","nameWithProfileField","hit","prev","hitContent","ActivityAttachments","answer_count","reply_count","MessageHit","subject","DateRange","html_description","CalendarList","hitMeta","recurrence_pattern","recurrence_end_time","recurrence_frequency","recurring_appointment","Highlights","highlights","setIndex","highlight","opacity","sort_by","setPaginationState","FoundIn","found_in","reduceRight","MetaRow","extraColumns","striped","FileHit","FileRow","FileHitMeta","FileHits","hits","SearchQueryPaginationContext","profile","file_profile","UrlContextProvider","FolderContentsTableWithProfile","FolderHit","FolderHitMeta","FolderHits","skipFileAttributes","is_network_admin","profileFieldAvailable","has","displayValue","ExternalMemberBadge","archived","access","member_count","activity_count","teaser","pagePath","group_slug","ItemHit","item_id","app_id","appId","frontend_app_url","frontendAppUrl","app","appLoading","useLoadApp","externalAppId","itemLoading","useLoadItem","externalItemId","display_values","title_property","imageProp","imageValue","isArray","isObject","useSearchResults","filteredQuery","SearchResultPagination","per","paginationState","Pagination","ceil","SearchSortSelector","availableSorts","Result","iconClass","fullResultUrl","initialLoading","renderHit","renderHits","queryName","routeParams","available_sorts","pageLoading","useQueryClient","cacheTime","pageData","getQueriesData","cacheData","cachedQuery","truncatedPageData","mapValues","useSearchResultsPage","query_name","pick","showMore","QUERY_MAPPING","activities_query","ActivityHit","messages_query","appointments_query","RecurringAppointmentHit","ModifiedRecurringAppointmentHit","AppointmentHit","files_query","folders_query","memberships_query","MembershipHit","groups_query","groupHits","groupCategory","group_categories","group_category_id","GroupHit","pages_query","PageHit","items_query","SearchQueryResult","remainingProps","propsFn","extraProps","FilterButton","GlobalSearchButton","searchResults","globalSearchFilterBar","results","FilterModule","SearchResults","mergeFileAndFolderProfiles","fileProfileProps","folderProfileProps","keyedFileProfile","keyBy","keyedFolderProfile","intersectionProfileKeys","intersection","uniqBy","o","ProfileFilters","folderProfileLoading","folderProfile","fileProfileLoading","fileProfile","filterLoading","mergedProfile","selectionFilters","tagFilter","concat","NoExtraFilters","formValuesToSearchParams","rawTag","rawFilters","filterValue","filterName","debouncedSubmit","fileProfilesEnabled","folderProfilesEnabled","FilterProvider","showFilters","setShowFilters","filterAvailable","_dispatch","_props","previousValues","noActions","FilesSearchFilters","SelectionField","TagField","allowCreate","internal","searchEnabled","searchProps","contextPath","Search","add_files","create_subfolders","update","offsetTop","useFullWidthLayout","total_files_count","total_subfolders_count","tableProps","setSearchParams","TableComponent","FolderContentsTable","currentContext","unreadsCount","FolderActions","listStyle","listItemStyle","EmbeddedSearchResults","BatchActions","FullSizeContent","extraPreColumn","SelectableFileRow","SelectableFolderRow","fileId","showReviewChanges","trackView","El","DocumentActions","renderSuptext","renderIcon","fetchActions","authorizedActions","actions","authorized","simplifyActions","DocumentAction","excel","word","powerpoint","visio","spreadsheets","documents","presentations","FolderForm","EditFileForm","FolderListing","FileProfileRows","FileSelector","toLowerCase","meeting","dateRange","preSelectedRoomId","loadData","meetingRooms","useReservableMeetingRooms","roomId","room_id","Select","isClearable","isDisabled","room_name","room","occupied","classNamePrefix","DropDown","alignment","DropDownItem","additional","linkStyle","iconStyle","iconClassName","onSelect","DropDownSubMenu","side","Item","SubMenu","timeago","Progress","percentage","texts","toFixed","generatingInfo","Start","createdAt","createExport","TimeAgo","fileUrl","extension","downloadUrl","generateNew","generateNewHint","Exporter","canExport","AppItemsExporter","MembershipsExporter","ConsumersExporter","RecurringAppointmentDecisionModal","handleDecision","MarkdownEditor","MeetingRoomSelect","target_id","object_language","resetTranslation","translateObject","languages","primaryLanguages","setPrimaryLanguages","secondaryLanguages","setSecondaryLanguages","selectedLanguage","setSelectedLanguage","handleLanguageSelect","language","targetLanguage","renderLanguageListItem","lang","primary","secondary","primaryLanguageKeys","last_used_translation_language","sort","a","b","categorizeLanguages","_faLanguage","LayoutToggle","getContext","enableInheritance","onTypeChange","columnLayoutTypes","layout","onLayoutChange","cardSource","beginDrag","column","endDrag","addColumnProperty","moveColumnProperty","monitor","dropResult","getDropResult","DropTarget","connectDropTarget","dropTarget","isOver","canDrop","DragSource","connectDragSource","dragSource","isDragging","toClass","char","didDrop","isOverAny","shallow","selectedColumnProperty","selectColumnProperty","removeColumnProperty","DragSourceProperty","ColumnConfigurator","enableLabelHiding","DragDropContext","HTML5Backend","columns","onColumnsUpdate","show_label","toggleShowLabel","columnProperty","removeSelectedColumnProperty","byName","transform","setDisplayName","sourceProperties","row","DropTargetColumn","propertyShape","columnShape","showLabel","d","updateTabAt","TabConfigurator","enableColumns","exclusivePropertyUsage","usedProperties","flatten","columnProp","addTab","onTabsChange","updateSelectedTabName","updateSelectedTabColumns","updateSelectedTabLayout","removeSelectedTab","LayoutSelect","tabShape","ItemLayoutEditor","contextTypes","ItemDetailLayoutEditor","withContext","ItemEditLayoutEditor","additional_fields","ADDITIONAL_PROPERTIES","activity","teaserTemplate","setTeaserTemplate","teaser_template","onActivityTeaserChange","example_var1","example_var2","PropertiesReference","integration","onRemove","setSubject","email_subject_template","email_text_template","assignee_property_id","EmailIntegration","emailIntegrations","onEmailIntegrationsChange","uuid","SingleEmailIntegration","updatedIntegration","changeIntegration","removeIntegration","ActivityIntegration","imageId","encodeURIComponent","Assets","memberships","membership","AssignedMember","Tag","Info","logo","setFilteredByTag","descriptionContainer","Tags","Title","cardId","toggleArchive","isArchive","isUnassigned","showMenu","setShowMenu","toggleMenu","archivedBy","archivedAt","person_name","canDrag","canMoveCard","setCardHeight","cardRef","onMoveCard","targetColumn","insertAfterCardId","cardTarget","hover","setHoveredCardId","Card","onSetCardRef","cardHeight","archiveItem","unarchiveItem","setFilteredByMember","FileCounter","AssignedMembers","ArchiveInfo","setCardRef","columnTitleTarget","setIsOverColumnTitle","columnField","ColumnTitle","changeIsOver","lifecycle","UNSAFE_componentWillReceiveProps","columnTarget","hoveredCardId","Column","isOverColumnTitle","cards","card","cardTitleField","cardFileField","cardMembershipField","cardDescriptionField","cardDateField","cardTagField","cardLogoField","setCard","setCurrentCard","archived_by","archived_at","hasMoreItems","loadMoreItems","totalArchivedItems","appUrl","createPortalComponent","callback","elemRef","callCallback","firstChild","createPortal","HeaderPortal","WallViewFilterPortal","UserbarPortal","ChatbarPortal","ContentPortal","GroupNavigationPortal","PageTitlePortal","queryParams","_faFilterCircleXmark","assignee_id","assignee_name","image_id","logoId","UnassignedItems","cardProps","titlePropName","canUpdateColumn","showItems","setShowItems","itemsForWallSelector","loadMoreUrls","loadMoreUrlsSelector","totalArchivedItemsSelector","updateItem","insert_after_id","optimistic","initApp","fetchApp","SUCCESS","fetchItems","fetchItemsForTag","fetchItemsForMember","loadMoreItemsByColumn","tag_filter","setShowsFilteredItems","member_filter","layoutOptions","getField","appColumns","_id","column_property","unassignedItems","showsFilteredItems","HeaderButtons","stage","AppStage","isLast","IntegrationsEditor","ItemsWallView","getNetworkProfileFields","widgetbarPath","editWidgetbarPath","getWidgets","getWidgetbarGroupId","getWidgetbarSuccessfulSave","getWidgetbarErrors","getWidgetbarLoadingState","getSelectedWidgetIndex","getCalendars","getWidgetbarIdentifier","getSelectedWidget","createSelector","widgets","getWidgetbars","MultiselectField","rawValue","rawOptions","profile_fields","additional_calendar_ids","getOptions","scope","scopeSelection","labelProps","tooltipRef","useTooltip","ModuleselectField","defaultValue","propTypeSelections","selection","withOnChange","groupId","valueChange","propertyKey","changeValue","eventOrNewVal","handleMultiselectLogic","PropTypeFields","headline","TextareaField","renderer","SelectField","NumberField","show_age","RadioField","widget","possibleOptions","generateHint","checkIfHintShouldShow","MembersHeadline","GroupInformationText","getWidgetName","prefix","identifier","widgetConfig","admin_members","birthday","group_info","newest_members","online_members","rss","speed_dial","Widget","widgetType","draggable","DraggableWidget","types","widgetTypes","layoutTarget","addOrMoveWidget","WidgetbarDragNDrop","selectWidget","selectedWidgetIndex","WidgetProperties","removeWidget","defaultProperties","WidgetPropertiesLayout","saveSuccessful","fetchWidgetbar","fetchCalendars","setGroupId","setIdentifier","updateWidgetbar","resetSuccessfulSave","resetErrors","widgetbar","w","notFound","NotFound","WidgetTypes","WidgetbarLayout","WidgetbarForm","WidgetbarSelection","widgetbars","fetchWidgetbars","useLegalText","LegalTextRow","legalText","onDeleteLegalText","fontSize","legalTexts","refetch","refetchLegalTexts","deleteLegalText","align","fetchImprint","updateImprint","useUpdateImprint","imprints","MarkdownEditorAdapter","show_newsletter_info","isEditing","handleEdit","handleDestroy","textColor","mostReadable","includeFallbackColors","EditRole","handleCancelEdit","Spectrum","roles","editingId","handleNew","WidgetbarEdit","WidgetbarIndex","LegalTextIndex","ImprintEdit","formatTime","momentDate","FormattedTime","allDay","isBetween","markers","canceled","has_meeting","markerColor","isFirst","weekNum","notActualMonth","columnNumber","lastRow","momentDay","divRef","visibleAppointmentCount","floor","hiddenAppointmentCount","hovered","setHovered","handleHover","useHover","initialDimensions","setInitialDimensions","useLayoutEffect","newInitialDimensions","clientWidth","bg","onDoubleClick","calId","AppointmentLine","HeaderCell","appointmentsByDate","days","weekCount","dates","startOfMonth","endOfMonth","rowStyle","gridTemplateRows","maxCellHeight","at","week","j","CalendarSheetCell","onChangeExternalId","ExternalIdInput","colorObjToCSSProperties","colorObj","abstract","tailwind","r","g","TinyColor","toRgb","LOGO_RULES","extended","BANNER_RULES","colors","derivedColors","col","override","bannerImage","bannerUrl","logoType","GroupCategorySections","unreadCountByGroupSlug","groupCategories","groupsByCategoryId","groupCategoriesSelector","myGroupsByCategoryIdSelector","unreadCount","GroupCategorySection","mainGroupHidden","main_group_hidden","mainGroupSlug","main_group_slug","active_theme","loadOpenState","setIsOpen","addGroupLink","create","UserbarSection","collapsible","persistOpenState","hasFavorites","favorited","additionalTitleElement","userbarVariables","ContextNavigation","userbarRef","activeItem","UserbarContent","groupCategoryTheme","titleClasses","titleTextClasses","extraChildren","wordBreak","FavoriteGroupIcon","UserbarLink","showWhileClosed","prefixMatch","regex","escapeRegExp","ModuleSwitcher","useTooltipsIfTitlesAreHidden","throttledToggleTooltips","titleElem","toggleTooltips","Module","notifications","MODULE_LOOKUP","duo","_faEarthEurope2","_faInbox2","_faCalendarDay2","Tasks","_faCircleCheck2","Files","Directory","More","TixxtModuleSwitcher","activeModule","userbarIconType","availableModules","moduleName","_faBrush2","_faBrush","InfoUserbar","legal_texts","additionalLinks","additional_links","abuse_reports","useOpenJoinRequestsCount","featuresUnreads","GroupJoinRequests","open_join_requests","ActivitystreamsUserbar","networkStreams","Activitystream","all","processUnreadCounts","useActivitiesUnreads","groupUnreads","networkUnreads","partition","networkUnreadsByStreamSlug","indexBy","openJoinRequestCount","getUserbarLinkTitle","unreadSumBySlug","MessagesUserbar","AppointmentsUserbar","TasksUserbar","FilesUserbar","networkName","networkNameSelector","networkUnreadCount","AdministrationUserbar","groupCategorySlug","groupSelector","groupCategorySelector","sections","context_type","context_id","useAdministrationUserbarLinks","section","links","exact","alternative_paths","SearchUserbar","pathAndQuery","MembershipsUserbar","membershipId","Infinity","useMembership","large","update_registration","update_profile","DirectoryUserbar","PagesUserbar","AppCreatorUserbar","expandRootPaths","rootPaths","routeObject","rootPath","TixxtUserbar","ChatBar","Suspense","fallback","TixxtGroupNavigation","group_id","StaticTixxtGroupNavigation","current_group","externally_visible","TixxtPageTitle","ContextPageTitle","StaticTixxtPageTitle","setTixxtPageTitle","getState","setTitle","useRecurringAppointment","AppointmentPageTitle","setAppointment","assignAppointment","toggleBackbone","BackboneFeature","feature","paramKeys","actionArguments","k","v","stopFeature","documentReady","startFeature","paramRegex","convertRoutes","featureRoutes","omittedParamKeys","matchAll","networkPath","groupPath","rundschreiben","AppointmentToolbar","setViewType","setDate","toggleExcludedCalendarIds","excludedCalendarIds","canCreate","scrollToToday","datePickerRef","bySlug","calendarId","cal","parent_id","create_appointments","datepicker","Datepicker","pickLevel","detail","subtract","readOnly","CalendarFilterDropdown","_faTableCells","typeLabels","personal","sortedGroupedCalendars","grouped","categoryName","categoryCalendars","DATE_FORMAT","weeksInRange","rangeStart","rangeEnd","currentDate","weeks","weekday","collectAppointmentsByDate","startOf","datesInRange","isInRange","appointmentsInDateRange","msToDayFactor","dateStamp","offsetMinutes","utcOffset","zone","valueOf","dateStampsRange","appointmentDate","AllDayTag","LeftArrow","RightArrow","TimeTag","spansMultipleDays","stamp","spansDate","AppointmentItem","todayRef","calendar_ids","calendar_id","CalendarDay","today","isAfter","future","isBefore","CalendarWeek","weekNumber","isEmptyWeek","isoWeek","AppointmentsList","weeksInMonth","MEDIUM_BREAKPOINT","isSmall","AppointmentsPage","participating","persistedView","setPersistedView","setView","updateView","useWindowEvent","useAppointmentView","setExcludedCalendarIds","keepPreviousData","useAppointments","contextCalendars","filteredAppointments","contextAppointments","groupAppointmentsCalendarIds","CalendarSheet","isShared","canAddCalendar","create_personal_calendars","create_calendars","groupCalendarsByType","groupedCalendars","shared","cals","CalendarListItem","renderActions","addCalendar","_faCalendarCirclePlus","CalendarListView","addCalendarsAllowed","groupsWithCalendars","groupsById","groupCalendarsByGroup","ManageCalendarsPage","deleteCalendar","deleteShare","useDeleteShare","COLLECTION_URL_LOOKUP","all_appointments","participating_appointments","personal_calendar","shared_calendar","network_calendar","CalendarSubscribeModal","modalOptions","isCollection","collectionType","isCalendar","auth_token","authentication_token","filteredCalendars","calendarFilter","writeText","copyToClipboard","_faCopy","SubscribeCalendarsPage","setModalOptions","onShowModal","_faCalendarPlus2","description_rendered","reloadAppointment","control","reloading","setReloading","isRecurring","addParticipants","_data","membership_ids","group_count","group_ids","membership_role_count","membership_role_ids","participantsStatus","emailNotification","selectedEntities","inviteConsumers","applyTo","memberIds","groupIds","membershipRoleIds","mr","addParticipantsHandler","send_email_notification","invite_consumers","apply_to","changeStatus","PARTICIPANT_STATUS_LOOKUP","_faCircleHalfStroke","ParticipantRow","newStatus","setNewStatus","updateParticipation","participantId","useUpdateParticipation","deleteParticipant","useDeleteParticipant","displayModal","handleCloseModal","onRemoveParticipant","onChangeParticipantStatus","ParticipantsOverview","searchText","setSearchText","activeFilter","setActiveFilter","filteredParticipants","without","changeActiveFilter","ParticipantsView","useAppointment","download_attendees","file_ending","AppointmentPreview","NewParticipantForm","COLOR_POOL","CalendarForm","calendarName","calendarColor","calendarShare","onReset","random","NewCalendarPage","parentId","createCalendar","EditCalendarPage","useCalendar","updateCalendar","backboneRoutes","members","selectMessage","read","hasReplies","conversationLength","to_count","activeMessageRow","unreadMessage","tabIndex","navigateDetails","anonymize_membership_name","icons","onlyIcon","useMarkMessageAsRead","offset","isFetching","selectedMessageIds","setSelectedMessageIds","onLoadMoreMessages","refetchMessages","allMessageIds","deleteMessages","messageIds","message_ids","useDeleteMessages","isLoadingRead","useMarkMessagesAsRead","invalidateQueries","markAsUnread","isLoadingUnread","useMarkMessagesAsUnread","divide","Fragment","InteractionsButton","confirmMessage","pageParam","setPage","useFetchMessages","MessagesInteractions","MessageRow","onSetMessageId","conversation_length","navigationUrl","pull","InboxToolbar","_faPenLine","InboxPage","Subtitle","MessagesList","SentPage","nativeEvent","CheckboxField","labelHint","additionalText","val","setVal","newVal","normalizeValue","formatValue","castArray","formatResponse","finalResults","SelectAdapter","extraQueryParams","menu","zIndex","AsyncSelect","normalize","Membership","isAdmin","networkAdminSelector","toAllNetworkMembers","hasGroupRecipient","toAll","setToAll","MembershipAndGroupField","only_my_admin_groups","htmlId","FileField","useFetchBaseMembershipData","sendMessage","useSendMessage","onUnload","MessageForm","fullWidth","submitIcon","to_all_network_members","SubmissionError","publishAllVolatile","recipient","to_group","NewMessagePage","isRead","onSetMessageAction","messageAction","deleteMessage","useDeleteMessage","useMarkMessageAsUnread","updatedCache","sendDirectMessages","testId","currentMemberId","isConversation","authorUrl","authorImageUrl","authorName","FileIcon","selectedMembers","recipients","newMemberArray","messageInitialValues","sender_name","htmlContent","send_date","send_time","conversation_starter_id","isAuthorInRecipients","attachment","setMessageAction","isSuccess","useFetchMessage","conversation","MessageInteractions","NewMessage","MessageContainer","ShowMessagePage","MessageDetails","validate","ConnectedForm","postToStreamDefault","post_to_stream","NewFilesForm","FileUpload","NewFilesPage","submitApi","remainingValues","publishFiles","navigateToFolder","Breadcrumb","approvePendingFileVersion","pendingVersionId","declinePendingFileVersion","useFilesReviewStatus","parsePaginationHeaders","fetchFilesForReviewStatus","pagination","removePendingFileVersionFromCache","_response","VersionApproval","rootFolder","useFilesVersionApproval","pending_versions","pendingVersion","PendingVersionApprovalRow","author_name","isDeclining","approve","isApproving","foo","ReviewStatus","ReviewStatusRow","updated_at","current_version_authors","review_status","insertions","deletions","changes","comments","Layout","ApprovalPage","foldersUnreads","Number","reviewed_files","search_text","Content","fetchNetworkSettings","updateNetworkSettings","useUpdateNetworkSettings","sendTestBirthdayEmail","birthday_emails","AVAILABLE_LANGUAGES","admin_configurable","groups_only","Selection","join_user_can_initiate","join_promote_groups","decorators","decorators_external","gc","GroupSelectField","maps_enabled","show_map","map_scope_selection","two_factor","deleted_membership_count","anonymize_memberships_managed_by_admin","show_locked_memberships_managed_by_admin","initial_anonymize_memberships_config","anonymize_memberships_config","anonymize_memberships_after_days","available_factor_types","two_factor_totp_available","two_factor_email_available","twoFactorOptions","AddressField","street","number","zip","city","deletedMemberCount","Controls","wrapperClassName","createDaysArray","weekdays","moveArray","firstDayOfWeek","shift","digests_daily_activity_enabled","birthday_emails_enabled","birthday_emails_values","sendTestMail","getTabs","TabContent","BasicSettings","JoinSettings","MemberSettings","MailSettings","TabBar","networkSettings","reload","NetworkSettingsForm","group_promotion_config","guest_users_allow_chat","birthday_emails_image","hasChildren","onChangeOption","optionLink","newWindow","onChangeNewWindow","isPublic","onChangePublic","ItemForm","SelectContent","LinkForm","node","onChangeNode","keyName","findKey","findOption","MainFields","Checkboxes","public","buttonClass","getNodeKey","treeIndex","countAllNodes","treeData","walk","isValidNode","nextPath","navigationItemsUrl","NavigationManager","treeRef","onChangeTree","onMoveNode","activePath","onChangeActiveNode","newNode","changeNodeAtPath","sendData","isSaving","saveError","saveSuccess","ignoreCollapsed","isValidTree","serializeTree","parseNavigationItems","expanded","serializeNode","getActiveNode","getNodeAtPath","buildNewNode","addNodeAt","addNodeUnderParent","parentKey","expandParent","addAsFirstChild","scrollToBottom","removeItemAt","removeNodeAtPath","apps","loadError","navResponse","navData","pagesResponse","pagesData","appsResponse","appsData","itemButtons","ItemButton","SortableTree","isVirtualized","maxDepth","generateNodeProps","NavigationManagerForm","dragIndex","hoverIndex","hoverBoundingRect","hoverRef","getBoundingClientRect","hoverMiddleY","bottom","hoverClientY","getClientOffset","y","moveCard","createRef","customBackgroundColor","flow","dragCard","newCards","x","createMembership","updateMembership","MemberEditFields","useMembershipProfile","SimpleInput","selectNetworkId","useStore","MembershipForm","persistItem","membershipResult","renderExtraFields","MemberCreateFields","formValues","send_welcome_mail","EmailField","password","user","profile_id","updateField","legalTextId","updateLegalText","LegalTextForm","createLegalText","version","isCurrent","isOpened","last_updated_at","collapse","openedText","setOpenedText","LegalTextVersion","updateAppNavigation","usePages","unusedDefaults","changedToDefault","defaults","isDefault","globe","cog","users","paperclip","book","bullhorn","certificate","flag","changeIcon","selectedIcon","selectIcon","iconName","OPTIONS","activitystream","changeType","selectOption","newType","newItem","TYPE_LOOKUP","more","Default","directory","settings","openIn","setOpenIn","open_in","setLink","isInvalidUrl","setIsInvalidUrl","openInDisabled","setOpenInDisabled","onLinkChange","selectedPage","selectPage","streams","stream","selectedStream","selectStream","changeActiveNode","changeEntryPoint","TypeForm","entryPoint","setEntryPoint","isEntryPoint","TypeSelector","changedItem","IconSelection","setMore","setTreeData","setActivePath","updateItems","useUpdateAppNavigation","moveItemToMore","newMore","_e","newTreeData","moreCandidate","changedTreeData","hasNoEntryPointItem","activeNode","NodeTitle","pullAt","pullAllBy","removeItemFromMore","GroupAdministrationMainPage","hidden_main_group","DesignsOverviewPage","lazy","DesignsOverviewLightPage","DesignManagerPage","DesignManagerLightPage","StatisticsPage","TagsManagerPage","Params","reactRoutes","NetworkSettings","AppNavigationManager","GroupCategorySorter","MembershipEdit","MembershipNew","LegalTextEdit","LegalTextNew","LegalTextVersions","themeType","EditMembership","changeRequestsProfileFields","change_requests","NewChangeRequest","filterProperties","mapProperties","transformItem","radio","configCategory","switchValue","conditions","isMounted","localeCompare","CheckboxFields","mapOptions","_value","PushNotificationSettingsForm","deviceId","setDeviceUniqueId","deviceName","setDeviceName","useFetchDeviceSettings","getDeviceUniqueId","askToRegisterDevice","updateDeviceSettings","goBack","setting","transform2FrontendState","newState","cloneDeep","switch","transform2BackendState","createOnSubmit","notificationsWereDeactivated","membershipSettingsResult","updateMembershipSettings","EditMembershipSettings","showEmailDigests","showEmailDailyDigests","notificationsDeactivated","marginBottom","validateTab","snakeCase","DigestSettings","EmailConfigList","initialize","BasicItemForm","sensitive","active_main_group","can_create_hidden","accessValue","access_options","GroupAccess","create_hidden","Children","moderated_join","members_can_invite","groupCategoryName","miscSettings","ChatSettings","MiscSettings","deleteGroup","archiveGroup","onDeleteGroup","redirect","documentElement","historyChanged","onArchiveGroup","group_name","EditGroup","fetchGroup","archive","EditGroupActions","GroupForm","groupResult","updateGroup","NewGroup","networkId","groupDefaults","fetchGroupDefaults","createGroup","GroupInviteActions","groupInviteId","setInviteStatus","GroupInvite","additional_message","checkIfPresent","GroupInvites","groupInvites","useFetchGroupInvites","groupInvite","updateProfileStep","redirectUrl","setRedirectUrl","onboardingResult","ProfileOnboarding","invitesRoutes","MemberMapPage","launchChat","networkUrl","socketUrl","addReducers","chatReducer","runSaga","chatSaga","fetchCredentials","authorizationError","setPageTitle","ChatNew","RedirectToStartpage","startPage","start_page","activitystreamsRoutes","appointmentsRoutes","messagesRoutes","filesRoutes","tasksRoutes","globalSearchRoutes","administrationRoutes","directoryRoutes","membershipRoutes","groupRoutes","onboardingRoutes","mapRoutes","MobileAppChat","originalNavigate","spaRoot","restoreBackboneNavigate","BackboneHistoryShim","call","shimBackboneNavigate","appRoutes","TixxtContent","toggleFrontend","TurboCompat","spaNavigateInstead","frontendByLocation","elementRef","setCursor","upHandler","prevState","MODULE_WHITELIST","getModule","getModuleFromQueryParams","SearchBar","searchIsFocused","setSearchIsFocused","parentName","generateItems","onSearch","useSelectNavigation","_faMagnifyingGlass3","_faMagnifyingGlass","onMouseEnter","_faMagnifyingGlass4","_faMagnifyingGlass2","_faTable2","_faCompass2","_faCompass","ChatButton","chatCount","getAggregatedUnreadCount","_faComments2","NotificationPing","NotificationDropDownItems","_faNewspaper","Notifications","_faEnvelopeOpenText","_faCalendarCircleUser","UserCentral","availableUpdates","administratableGroupCategories","administrate","_faBell2","_faBell","medium","_faCircleChevronDown","_faIdBadge","_faUserPen","_faGears","_faChartUser","version_and_updates","_faScrewdriverWrench","_faGear","_faArrowRightFromBracket","LARGE_BREAKPOINT","setDeploymentOfferSeenDate","toISOString","allDeploymentOffersSeen","deploymentOffer","EMPTY","CustomerCentralUpdateCheck","customer_central_url","Authorization","customer_central_jwt","res","release_notes_url","days_till_deadline","deadline","diff","TeamsRenewOAuthCredentialsCheck","teams_configuration","show_renew_secret_modal","TixxtHeader","groupTheme","logoUrl","logoImage","logoRef","bannerType","logoResizeBreakpoint","resizeBreakpoint","getPropertyValue","setActive","toggleActive","logoEl","navEl","maxWidth","startShrink","cleanUp","removeAttribute","onScroll","hasAttribute","requestAnimationFrame","newHeight","clamp","setProperty","useLogoScrollResize","_faHouse2","_faHouse","applyStyleOverride","styleEl","cssContent","themeToCss","isConnected","head","ApplyOverrideTheme","useTheme","faviconEl","toggleBodyClasses","newBody","linkEl","faviconImage","applyFaviconOverride","storeOverrideTheme","removeStyleOverride","themeSliceActions","setTheme","groupSetTheme","resetTheme","groupResetTheme","groupCategorySetTheme","groupCategoryResetTheme","lightThemeToCss","appointmentIdToGroupSlugs","calendarParentIds","attributes","as","ci","fileIdToGroupSlugs","File","group_slugs","folderIdToGroupSlugs","groupFromId","Folder","taskIdToGroupSlugs","taskId","controller","currentCollection","first_stream_slug","groupsFromSlugs","slugs","activityIdToGroupSlugs","Activity","groupCategoriesFromGroups","category_id","groupCategoriesFromSlugs","SlugsContext","GroupsFromSlug","contextSlug","setSlugsState","previousSlug","GroupsFromActivityId","GroupsFromAppointmentId","GroupsFromTaskId","GroupsFromFolderId","paramsFolderId","queryFolderId","GroupsFromFileId","NoSlugs","selectors","HandleContextHeader","relevantContext","lastContext","activeTheme","hasSameTheme","themeParents","themeParent","Noop","pickRelevantGroups","first","ApplyOverrideGroupTheme","pickRelevantGroupCategories","ApplyOverrideGroupCategoryTheme","AppSearchHeader","App","canChat","setMemberIsLoggedIn","setMemberId","setMemberCanChat","TixxtChatbar","Settings","development","compatThisArg","fn","collection","thisArg","lodash","customLodashCompat","mixin","any","pairs","chain","lazyForEach","prototype","Bridge","webkit","messageHandlers","nativeApp","toggleUserbar","userbar","toggleChat","toggleSearchbar","searchbar","searchInput","blur","registerDevice","removeDevice","deviceUniqId","deletedDevice","showChat","loadNetworkConfig","setNetworkConfig","setPages","loadUnreads","pageTitle","isLoggedIn","configureLayout","getAuthToken","authToken","callbackName","prompt","MemberRow","showAge","birthday_is_today","_faGift","age","AdminMembersWidget","AppointmentRow","currentTime","guess","startTime","join_url","isSameOrAfter","endTime","displayTime","AppointmentsWidget","BirthdayWidget","your_birthday","GroupInfoWidget","NewestMembersWidget","OnlineMembersWidget","RssWidget","SpeedDialWidget","setMembers","TextWidget","renderWidgetComponent","ActivitystreamWidgetbar","useActivitystreamWidgetbar","loadingText","errorText","showParticipants","consumersCount","teamsOnlyParticipantsCount","defaultRole","participantsByRole","obj","Helpers","naturalSortByObjectKey","AppointmentContact","ActivityComposer","ReplyComposer","ExternalIdComponent","adaptedFileComponents","adaptedSharedComponents","adaptedAppCreatorComponents","adaptedAdministrationComponents","jQuery","_compat","hljs","loadAndConfigureCKEditor","userInput","rails","allowAction","fire","stack","setApplication","showCookieModal","cookieModal","modalCloser","cookie","hide","cookieModalElement","keyboard","backdrop","setupReact","myDefaultState","app_muted_until","unread_count","POSSIBLE_PARTNER_ACTION_TYPES","isPartnerAction","topic","membership_id","myStateReducer","partnerDefaultState","last_received_id","partnerStateReducer","extractChats","getFp","keyByFp","requestStateReducer","maybeUndefinedState","partner_state","defaultStateFromAction","getChatIdFromPayload","getChatIdFromMeta","BLACKLIST","mergeMessages","received","r1","r2","out","insertOrUpdateMessage","findLastIndex","keepUntil","messageList","cid","removeByClientId","searchClientId","reverse","apiRequests","parentAction","composingInChat","composing","storeHomie","homie","homies","transformPayload","payloadTransformer","defaultState","getGroupCategoryName","combineReducers","getChatId","composer","onlineMembers","busyMembers","memberOrGroup","createEventSaga","channel","eventChannel","emit","handlers","take","put","cancelled","presenceSaga","sync","metas","online_at","maxBy","Presence","onSync","handleApiRequests","actionChannel","getNetworkUrl","Accept","Response","UNREAD_TIMER","COMPOSING_TIMEOUT","isShowChatNavigationAction","createWindowFocusPromise","handler","fetchChatDetails","fetchMoreRecentMessages","getMoreMessagesAvailableForChat","firstMessageId","getFirstMessageIdInChat","message_id","markChatAsRead","race","delay","mark_as_read","mark_as_read_start","markChatAsReadHandler","lastReadId","getLastReadIdForChat","lastMessageId","getLastMessageIdInChat","hasFocus","getLastUnreadMessageInChat","navigateToChatWeCreated","navigateAction","takeLatest","fork","timeoutComposing","timeoutComposingStates","timeoutTasks","composingActions","ident","isRunning","cancel","receive","pushReply","baseMeta","RECEIVE_EVENTS","handleIncomingMessages","createShouldHandleTo","channelType","channelId","handleOutgoingMessages","outgoingMessages","shouldHandleTo","handleChatQueries","chatQueries","pushComposingEvent","markMessageAsReceived","messagePayload","markLastChatMessagesAsReceived","channelSaga","leave","myChannelSaga","socket","networkChannel","memberChannel","isGroupChat","groupChatIdToTopic","chatChannelsSaga","getChatNavigation","notify","notification","notificationCloser","onclick","onclose","notifyForIncomingMessage","getProfileId","setTinycon","unreadChats","Tinycon","background","takeEvery","createSocket","Socket","reconnectAfterMs","socketEventSaga","credentialsCache","validUntil","memoizedCredentials","cachedPayload","windowUnloading","applicationSaga","notificationsSaga","network_id","socketEventTask","channelsTask","channelsSaga","retryIn","getHomie","homieId","getChats","getRawChatProfile","getStateForChat","mutedUntil","getAppMutedUntilForChat","getMutedUntilForChat","rawProfile","partnerId","getPartnerId","idRest","myId","timestamps","composingIds","recentlyComposingHomieId","findLast","partnerState","getChatPartnerState"],"sourceRoot":""}