{"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 || \" \"}</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 \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 \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\"> </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> </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 \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":""}