{"version":3,"file":"js/application-d43fac9fe247d1c68cc2.js","mappings":"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,GAAMA,EAAEu7C,mBAElBjkD,EAAAA,cAACuN,EAAAA,EAAe,CAACrN,UAAW0e,EAAepR,KAAMA,GAAQorF,EAAAA,MACxDz3F,EAGP,EAKA,M,8FC7CA,IAvBA,UAAkB,UAChB0T,EAAS,MACT4iB,GAAQ,EAAK,UACbv3B,IAMA,MAAMsN,EArKR,SAAwBqH,GAiItB,MAhIwB,CACtB,MACA,MACA,OACA,MACA,OACA,MACA,OACA,MACA,MACA,MACA,MACA,OACA,OACA,OAkHkB0D,SAAS1D,GACpB0sF,EAAAA,IAjHe,CACtB,OACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,QAsFyBhpF,SAAS1D,GAC3B2sF,EAAAA,IArFiB,CACxB,MACA,OACA,MACA,MACA,OACA,MACA,MACA,KACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAoE2BjpF,SAAS1D,GAC7B4sF,EAAAA,IAnEc,CAAC,MAAO,MAAO,MAAO,MAAO,SAoE1BlpF,SAAS1D,GAC1B6sF,EAAAA,IApEc,CACrB,IACA,MACA,KACA,QACA,MACA,KACA,IACA,OACA,MACA,KACA,KACA,QACA,KACA,KACA,KACA,OACA,QACA,SACA,KACA,MACA,MACA,OACA,MACA,OACA,MACA,QA2CwBnpF,SAAS1D,GAC1B8sF,EAAAA,IACgB,QAAd9sF,EACF+sF,EAAAA,IACgB,QAAd/sF,EACFgtF,EAAAA,IA9Cc,CAAC,MAAO,MAAO,OAAQ,OAAQ,QA+C5BtpF,SAAS1D,GAC1BitF,EAAAA,IA/CoB,CAC3B,MACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAuC8BvpF,SAAS1D,GAChCktF,EAAAA,IAtCe,CACtB,MACA,OACA,OACA,OACA,OACA,OACA,QAgCyBxpF,SAAS1D,GAC3BmtF,EAAAA,IA/Ba,CACpB,KACA,MACA,MACA,MACA,MACA,MACA,SACA,IACA,OAuBuBzpF,SAAS1D,G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","sources":["webpack:///./app/javascript/CustomConfigurator.js","webpack:///./app/javascript/actions/chat.js","webpack:///./app/javascript/api/unreads.ts","webpack:///./app/javascript/components/activitystreams/composer/defaultEntryComponent.tsx","webpack:///./app/javascript/components/activitystreams/composer/inlineMentionPlugin.tsx","webpack:///./app/javascript/components/administration/api.ts","webpack:///./app/javascript/components/administration/designManager/themeToCss.ts","webpack:///./app/javascript/components/administration/imprints/api.js","webpack:///./app/javascript/components/administration/imprints/ImprintEdit.tsx","webpack:///./app/javascript/components/administration/legalTexts/LegalTextIndex.tsx","webpack:///./app/javascript/components/administration/legalTexts/api.js","webpack:///./app/javascript/components/appCreator/items/form/FieldError.js","webpack:///./app/javascript/components/appCreator/properties/edit/ImageField.js","webpack:///./app/javascript/components/appCreator/properties/edit/MembershipField.js","webpack:///./app/javascript/components/appCreator/properties/edit/UrlField.js","webpack:///./app/javascript/components/appCreator/properties/edit/DateField.tsx","webpack:///./app/javascript/components/appCreator/properties/edit/HtmlField.js","webpack:///./app/javascript/components/appCreator/properties/edit/RelationField.js","webpack:///./app/javascript/components/appCreator/properties/PropertyEdit.js","webpack:///./app/javascript/components/appCreator/items/form/Fields.js","webpack:///./app/javascript/components/appCreator/items/form/SimpleInput.js","webpack:///./app/javascript/components/appCreator/properties/show/Email.js","webpack:///./app/javascript/components/appCreator/properties/show/Image.js","webpack:///./app/javascript/components/appCreator/properties/show/Url.js","webpack:///./app/javascript/components/appCreator/properties/show/File.js","webpack:///./app/javascript/components/appCreator/properties/show/Relation.js","webpack:///./app/javascript/components/appCreator/properties/show/MembershipRelation.js","webpack:///./app/javascript/components/appCreator/properties/show/DateView.js","webpack:///./app/javascript/components/appCreator/properties/show/Statistics.js","webpack:///./app/javascript/components/appCreator/properties/show/Address.js","webpack:///./app/javascript/components/appCreator/properties/show/Html.js","webpack:///./app/javascript/components/appCreator/properties/PropertyShow.js","webpack:///./app/javascript/components/appCreator/properties/edit/AddressField.js","webpack:///./app/javascript/components/appCreator/properties/edit/EmailField.js","webpack:///./app/javascript/components/appCreator/properties/edit/FileField.js","webpack:///./app/javascript/components/appCreator/properties/edit/NumberField.js","webpack:///./app/javascript/components/appCreator/properties/edit/SelectionField.js","webpack:///./app/javascript/components/appCreator/properties/edit/TagField.js","webpack:///./app/javascript/components/appCreator/properties/edit/TextField.js","webpack:///./app/javascript/components/appCreator/properties/show/Headline.js","webpack:///./app/javascript/components/appCreator/properties/show/Selection.js","webpack:///./app/javascript/components/appCreator/properties/show/Tag.js","webpack:///./app/javascript/components/appCreator/properties/show/Text.js","webpack:///./app/javascript/components/appCreator/properties/show/helpers/GenericValueList.js","webpack:///./app/javascript/components/appointments/AppointmentToolbar.tsx","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/appointments/api.ts","webpack:///./app/javascript/components/appointments/details/AppointmentDate.tsx","webpack:///./app/javascript/components/appointments/details/AppointmentDescription.tsx","webpack:///./app/javascript/components/appointments/details/AppointmentLocation.tsx","webpack:///./app/javascript/components/appointments/details/AppointmentMeeting.tsx","webpack:///./app/javascript/components/appointments/helpers.ts","webpack:///./app/javascript/components/blogs/api.ts","webpack:///./app/javascript/components/channels/api.ts","webpack:///./app/javascript/components/channels/design/ApplyOverrideChannelTheme.tsx","webpack:///./app/javascript/components/channels/helpers.ts","webpack:///./app/javascript/components/channels/layout/api.ts","webpack:///./app/javascript/components/channels/widgets/smartChunk.ts","webpack:///./app/javascript/components/channels/widgets/PeopleWidget.tsx","webpack:///./app/javascript/components/channels/widgets/ImagesWidget.tsx","webpack:///./app/javascript/components/channels/widgets/BannerWidget.tsx","webpack:///./app/javascript/components/channels/widgets/TextWidget.tsx","webpack:///./app/javascript/components/channels/widgets/RssWidget.tsx","webpack:///./app/javascript/components/shared/ItemCarousel.tsx","webpack:///./app/javascript/components/shared/hooks/useContainerWidth.ts","webpack:///./app/javascript/components/channels/widgets/BlogWidget.tsx","webpack:///./app/javascript/components/channels/widgets/AppointmentsWidget.tsx","webpack:///./app/javascript/components/channels/widgets/SpotlightWidget.tsx","webpack:///./app/javascript/components/channels/widgets/widgetsFields/linkWidget/LinkView.tsx","webpack:///./app/javascript/components/channels/widgets/widgetsFields/linkWidget/EmbedLinkView.tsx","webpack:///./app/javascript/components/channels/widgets/LinkWidget.tsx","webpack:///./app/javascript/components/channels/widgets/WidgetByType.tsx","webpack:///./app/javascript/helpers/readableTextColor.ts","webpack:///./app/javascript/components/channels/widgets/WidgetContainer.tsx","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/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/directory/DirectoryActionButton.tsx","webpack:///./app/javascript/components/directory/DirectoryPagination.tsx","webpack:///./app/javascript/components/directory/DirectoryRow.tsx","webpack:///./app/javascript/components/directory/DirectoryRowBadge.tsx","webpack:///./app/javascript/components/shared/Glossary.tsx","webpack:///./app/javascript/components/directory/DirectoryToolbar.tsx","webpack:///./app/javascript/components/directory/channels/ToolBar.tsx","webpack:///./app/javascript/components/directory/channels/ChannelRow.tsx","webpack:///./app/javascript/components/directory/channels/ChannelListView.tsx","webpack:///./app/javascript/components/directory/hooks/useDirectoryFilter.ts","webpack:///./app/javascript/components/files/Breadcrumb.js","webpack:///./app/javascript/components/files/FolderSelectModal.tsx","webpack:///./app/javascript/components/files/FolderSelectionField.js","webpack:///./app/javascript/components/files/UrlContextProvider.js","webpack:///./app/javascript/components/files/api.tsx","webpack:///./app/javascript/components/files/composer/FileSelectModal.js","webpack:///./app/javascript/components/files/composer/FileSelector.tsx","webpack:///./app/javascript/components/files/documents/documents.module.css?6c7b","webpack:///./app/javascript/components/files/documents/DocumentAction.js","webpack:///./app/javascript/components/files/hooks/useFolderResource.js","webpack:///./app/javascript/components/files/table/FileInfo.js","webpack:///./app/javascript/helpers/files/humanizeFileSize.js","webpack:///./app/javascript/components/files/table/FileRow.js","webpack:///./app/javascript/components/files/table/useExtraColumns.js","webpack:///./app/javascript/components/files/table/FolderContentsTable.js","webpack:///./app/javascript/components/files/table/FolderInfo.js","webpack:///./app/javascript/components/files/table/FolderRow.js","webpack:///./app/javascript/components/files/table/SelectableFileRow.js","webpack:///./app/javascript/components/files/table/SelectableFolderRow.js","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/Question.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/Article.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/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/api.ts","webpack:///./app/javascript/components/globalSearch/urls.js","webpack:///./app/javascript/components/layout/GroupNavigation.tsx","webpack:///./app/javascript/components/shared/favoriteButtons/ToggleGroupFavoriteButton.tsx","webpack:///./app/javascript/components/shared/ToggleGroupSubscribeButton.tsx","webpack:///./app/javascript/components/shared/GroupLeaveOption.tsx","webpack:///./app/javascript/components/layout/PageTitle.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/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/AppointmentsPage.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/helpers/api/fetchPaginatedData.ts","webpack:///./app/javascript/components/invites/api.ts","webpack:///./app/javascript/components/appointments/AppointmentInvite.tsx","webpack:///./app/javascript/components/appointments/participants/AppointmentPreview.js","webpack:///./app/javascript/components/appointments/form/ParticipantsField.tsx","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/shared/RecurringAppointmentDecisionModal.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/shared/form/fields/TextEditor.tsx","webpack:///./app/javascript/components/shared/form/fields/TimePicker.tsx","webpack:///./app/javascript/components/shared/form/fields/DateTimePicker.tsx","webpack:///./app/javascript/components/appointments/form/PartialToggle.tsx","webpack:///./app/javascript/components/appointments/form/RecurringSelectField.tsx","webpack:///./app/javascript/components/appointments/form/LocationField.tsx","webpack:///./app/javascript/components/appointments/form/TeamsConfigField.tsx","webpack:///./app/javascript/components/appointments/form/CategorySelectionField.tsx","webpack:///./app/javascript/components/appointments/form/ContactsField.tsx","webpack:///./app/javascript/components/appointments/form/AttendeeConfigurationField.tsx","webpack:///./app/javascript/components/appointments/form/ApplicationConfigurationField.tsx","webpack:///./app/javascript/components/appointments/form/EventSettings.tsx","webpack:///./app/javascript/components/appointments/form/ModifiedRecurringAppointmentHint.tsx","webpack:///./app/javascript/components/appointments/form/DateRangeSelectField.tsx","webpack:///./app/javascript/components/shared/MeetinRoomSelectField.tsx","webpack:///./app/javascript/components/appointments/form/AppointmentForm.tsx","webpack:///./app/javascript/components/appointments/AppointmentNewPage.tsx","webpack:///./app/javascript/components/appointments/AppointmentEditPage.tsx","webpack:///./app/javascript/components/appointments/details/Toolbar.tsx","webpack:///./app/javascript/components/shared/FileRow.tsx","webpack:///./app/javascript/components/appointments/details/AppointmentEventFiles.tsx","webpack:///./app/javascript/components/shared/Translation.tsx","webpack:///./app/javascript/components/appointments/details/AppointmentEventDetails.tsx","webpack:///./app/javascript/components/appointments/ParticipantsList.tsx","webpack:///./app/javascript/components/appointments/details/AppointmentParticipations.tsx","webpack:///./app/javascript/components/appointments/details/AppointmentDetails.tsx","webpack:///./app/javascript/components/appointments/AppointmentPage.tsx","webpack:///./app/javascript/components/appointments/Contact.tsx","webpack:///./app/javascript/components/appointments/AppointmentContactPage.tsx","webpack:///./app/javascript/components/appointments/RecurringAppointmentInvite.tsx","webpack:///./app/javascript/components/appointments/AppointmentParticipation.tsx","webpack:///./app/javascript/components/invites/InvitesList.tsx","webpack:///./app/javascript/components/appointments/InvitesPage.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/actions/memberships.js","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/components/appCreator/items/form/BasicItemForm.js","webpack:///./app/javascript/components/memberships/MembershipForm.js","webpack:///./app/javascript/helpers/items/persistItem.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/members/ToolBar.tsx","webpack:///./app/javascript/components/directory/members/MemberRow.tsx","webpack:///./app/javascript/components/directory/members/MemberListView.tsx","webpack:///./app/javascript/components/directory/groups/ToolBar.tsx","webpack:///./app/javascript/components/groups/api.ts","webpack:///./app/javascript/components/directory/groups/GroupRow.tsx","webpack:///./app/javascript/components/directory/groups/GroupListView.tsx","webpack:///./app/javascript/components/directory/DirectoryPage.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/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/chat/routes.tsx","webpack:///./app/javascript/components/channels/ChannelsPage.tsx","webpack:///./app/javascript/components/shared/favoriteButtons/ToggleChannelFavoriteButton.tsx","webpack:///./app/javascript/components/channels/ChannelLayout.tsx","webpack:///./app/javascript/components/channels/ChannelPage.tsx","webpack:///./app/javascript/components/channels/widgets/ShowWidgetPage.tsx","webpack:///./app/javascript/components/channels/routes.tsx","webpack:///./app/javascript/components/blogs/form/BlogForm.tsx","webpack:///./app/javascript/components/blogs/BlogEditPage.tsx","webpack:///./app/javascript/components/blogs/routes.tsx","webpack:///./app/javascript/components/articles/routes.tsx","webpack:///./app/javascript/components/tixxt/RedirectToStartpage.tsx","webpack:///./app/javascript/routes.tsx","webpack:///./app/javascript/components/tixxt/BackboneHistoryShim.tsx","webpack:///./app/javascript/components/layout/TixxtContent.tsx","webpack:///./app/javascript/components/layout/TixxtGroupNavigation.tsx","webpack:///./app/javascript/components/layout/TixxtPageTitle.tsx","webpack:///./app/javascript/components/layout/portals.tsx","webpack:///./app/javascript/components/memberships/MemberNameWithAdditions.js","webpack:///./app/javascript/components/shared/DirectoryPicker/optionRendering.tsx","webpack:///./app/javascript/components/shared/DirectoryPicker/optionLoading.ts","webpack:///./app/javascript/components/shared/DirectoryPicker.tsx","webpack:///./app/javascript/components/directory/api.ts","webpack:///./app/javascript/components/shared/DropDown.tsx","webpack:///./app/javascript/components/shared/FileIcon.tsx","webpack:///./app/javascript/components/shared/Flash.tsx","webpack:///./app/javascript/components/shared/FolderIcon.tsx","webpack:///./app/javascript/components/shared/FullSizeContent.tsx","webpack:///./app/javascript/components/shared/GenericErrorBoundary.tsx","webpack:///./app/javascript/components/shared/InfoText.tsx","webpack:///./app/javascript/components/shared/Loading.tsx","webpack:///./app/javascript/components/shared/MarkdownTranslation.tsx","webpack:///./app/javascript/components/shared/MemberSelect.tsx","webpack:///./app/javascript/components/shared/modal/ModalActions.tsx","webpack:///./app/javascript/components/shared/Modal.tsx","webpack:///./app/javascript/components/shared/PageLoading.tsx","webpack:///./app/javascript/components/shared/Pagination.tsx","webpack:///./app/javascript/components/shared/PermissionPicker.tsx","webpack:///./app/javascript/components/shared/SimpleMembershipShow.tsx","webpack:///./app/javascript/components/shared/Spectrum.tsx","webpack:///./app/javascript/components/shared/TabBar.tsx","webpack:///./app/javascript/components/shared/Tag.tsx","webpack:///./app/javascript/components/shared/TranslationDropDown.tsx","webpack:///./app/javascript/components/shared/UnreadBadge.tsx","webpack:///./app/javascript/components/shared/favoriteButtons/ToggleFavoriteButton.tsx","webpack:///./app/javascript/components/shared/fields/ControlGroup.tsx","webpack:///./app/javascript/components/shared/fields/FileUploadField.js","webpack:///./app/javascript/components/shared/fields/Hint.tsx","webpack:///./app/javascript/components/shared/fields/TextField.tsx","webpack:///./app/javascript/components/shared/fields/fileUploadField/FileInput.tsx","webpack:///./app/javascript/components/shared/fields/fileUploadField/ImagePreview.tsx","webpack:///./app/javascript/components/shared/fields/fileUploadField/UploadBar.tsx","webpack:///./app/javascript/components/shared/fields/fileUploadField/UploadedFile.tsx","webpack:///./app/javascript/components/shared/form/DangerZone.tsx","webpack:///./app/javascript/components/shared/form/Label.tsx","webpack:///./app/javascript/components/shared/form/fields/Checkbox.tsx","webpack:///./app/javascript/components/shared/form/fields/DirectoryPickerInput.tsx","webpack:///./app/javascript/components/shared/form/fields/FileUpload.tsx","webpack:///./app/javascript/components/shared/form/fields/FileUploadField.tsx","webpack:///./app/javascript/components/shared/form/fields/FormActions.tsx","webpack:///./app/javascript/components/shared/form/fields/Hint.tsx","webpack:///./app/javascript/components/shared/form/fields/RadioButton.tsx","webpack:///./app/javascript/components/shared/form/fields/Select.tsx","webpack:///./app/javascript/components/shared/form/fields/TextInput.tsx","webpack:///./app/javascript/components/shared/form/fields/useRegisterPropOrFromContext.ts","webpack:///./app/javascript/components/shared/hooks/useChannelSubscriptionToggle.ts","webpack:///./app/javascript/components/shared/hooks/useFileProcessing.ts","webpack:///./app/javascript/components/shared/hooks/useItemBatchSelection.js","webpack:///./app/javascript/components/shared/hooks/useWindowEvent.js","webpack:///./app/javascript/components/shared/markdownEditor/MarkdownEditorAdapter.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/FontColorsButton.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/Separator.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/ToolbarButton.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/createInlineStyleButton.js","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/createPickerButton.js","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/theme.js","webpack:///./app/javascript/components/shared/markdownEditor/CodeBlockLanguageSelect.js","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/markdownPlugin.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/shortcutsPlugin.js","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/inlineStyleButtons.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/createBlockStyleButton.js","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/blockStyleButtons.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/HeadlinesButton.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/toolbarPlugin.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/buttons/LinkButton.tsx","webpack:///./app/javascript/components/shared/markdownEditor/editorPlugins/undoPlugin.tsx","webpack:///./app/javascript/components/shared/markdownEditor/configure.js","webpack:///./app/javascript/components/shared/markdownEditor/withBasicMarkdownPlugins.tsx","webpack:///./app/javascript/components/shared/markdownEditor/index.js","webpack:///./app/javascript/components/shared/markdownEditor/styleMap.js","webpack:///./app/javascript/components/shared/markdownEditor/parserPlugins/customizedTextParser.js","webpack:///./app/javascript/components/shared/markdownEditor/parserPlugins/helpers.js","webpack:///./app/javascript/components/shared/markdownEditor/parserPlugins/customizedEmphasisParser.js","webpack:///./app/javascript/components/shared/markdownEditor/parserPlugins/markdownMentionsParser.js","webpack:///./app/javascript/components/shared/markdownEditor/parserPlugins/underlineParser.js","webpack:///./app/javascript/components/shared/markdownEditor/parserPlugins/cssStyleParser.js","webpack:///./app/javascript/components/shared/markdownEditor/utils/editorStateByMarkdown.js","webpack:///./app/javascript/components/shared/markdownEditor/utils/markdownByEditorState.js","webpack:///./app/javascript/components/shared/propertySets/EmbeddedValueSetForm.tsx","webpack:///./app/javascript/components/shared/propertySets/api.tsx","webpack:///./app/javascript/components/shared/reduxForm/FormActions.tsx","webpack:///./app/javascript/components/shared/reduxForm/index.tsx","webpack:///./app/javascript/components/shared/tables/tables.module.css?994c","webpack:///./app/javascript/components/shared/tables/Sorter.tsx","webpack:///./app/javascript/components/shared/withDragDropContext.js","webpack:///./app/javascript/helpers/Datepicker.ts","webpack:///./app/javascript/helpers/ckeditor/loadAndConfigureCKEditor.js","webpack:///./app/javascript/helpers/components/preventDefault.js","webpack:///./app/javascript/helpers/components/wrapProvider.js","webpack:///./app/javascript/helpers/files/publishAllVolatile.js","webpack:///./app/javascript/helpers/files/usePublishAllVolatile.ts","webpack:///./app/javascript/helpers/formValidations.ts","webpack:///./app/javascript/helpers/formatDate.ts","webpack:///./app/javascript/helpers/items/handleItemApiError.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/reactQueryApi.ts","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/useFullWidthLayout.ts","webpack:///./app/javascript/hooks/useInterceptorPrompt.ts","webpack:///./app/javascript/hooks/useMaxHeight.ts","webpack:///./app/javascript/hooks/useTooltip.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/administration/appointments/categories/CategoryRow.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/components/administration/channels/AssignChannelSubscriptionsForm.tsx","webpack:///./app/javascript/controllers/assign_channel_subscriptions_form_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/permission_picker_controller.js","webpack:///./app/javascript/controllers/shared/go_back_button_controller.js","webpack:///./app/javascript/controllers/shared/password_toggle_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/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/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/activitystreams/replyComposer/index.tsx","webpack:///./app/javascript/components/files/FolderForm.js","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/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/files/FolderListing.js","webpack:///./app/javascript/components/files/FileProfileRows.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/TimeAgo.tsx","webpack:///./app/javascript/components/shared/SimpleExporter.tsx","webpack:///./app/javascript/components/shared/MemberManagerDropDown.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/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.tsx","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/MembershipRolesManager.tsx","webpack:///./app/javascript/components/administration/adaptedAdministrationComponents.js","webpack:///./app/javascript/components/rundschreiben/ExternalIdComponent.tsx","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/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/channels/Userbar.tsx","webpack:///./app/javascript/components/administration/channels/Userbar.tsx","webpack:///./app/javascript/components/layout/TixxtUserbar.tsx","webpack:///./app/javascript/components/layout/TixxtChatbar.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/components/activitystreams/composer/StreamTargeting.tsx","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/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/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","webpack:///./app/javascript/selectors/environment.ts","webpack:///./app/javascript/selectors/folders.js","webpack:///./app/javascript/selectors/propertySets.js","webpack:///./app/javascript/components/appCreator/properties/edit/editFields.module.css?235b","webpack:///./app/javascript/components/appCreator/properties/show/showFields.module.css?2641","webpack:///./app/javascript/components/files/files.module.css","webpack:///./app/javascript/components/shared/propertySets/propertySets.module.css?d9f5","webpack:///./node_modules/moment/locale/ sync ("],"sourcesContent":["import { get as getPath, set as setPath, isNil } from \"lodash\";\n\n// This object stores static configuration and allow overrides for customers\n// Can be used for all static configurations, used i.e. for:\n// - MarkdownComposer: colors and toolbar buttons\n// - AppointmentInvites: component lookup tables\nclass CustomConfigurator {\n // Constructor with singleton pattern\n constructor() {\n if (!CustomConfigurator.instance) {\n this._defaults = {};\n this._config = {};\n CustomConfigurator.instance = this;\n }\n\n return CustomConfigurator.instance;\n }\n\n // Get a config key from the internally stored config\n // @param [String,Array] path - see lodash docs for get\n get(path) {\n return getPath(this._config, path, getPath(this._defaults, path));\n }\n\n // Set a config key to the internally stored config\n // @param [String,Array] path - see lodash docs for set\n // @param [any] value - value that should be set\n set(path, value) {\n setPath(this._config, path, value);\n }\n\n // Set a config key as default value for the internally stored config\n // @param [String,Array] path - see lodash docs for set\n // @param [any] value - default value that should be set\n setDefault(path, value) {\n setPath(this._defaults, path, value);\n }\n\n // Check if something exists (!isEmpty) for the given configuration key\n // @param [String,Array] path - see lodash docs for get\n exists(path) {\n return !isNil(getPath(this._config, path));\n }\n\n // Check if some defaults exists (!isEmpty) for the given configuration key\n // @param [String,Array] path - see lodash docs for get\n existsDefault(path) {\n return !isNil(getPath(this._defaults, path));\n }\n}\n\n// Create instance, freeze it and export it\nif (!window.CustomConfigurator) {\n window.CustomConfigurator = new CustomConfigurator();\n Object.freeze(window.CustomConfigurator);\n}\n\nexport default window.CustomConfigurator;\n","export 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\");\nexport const setChatStatus = createNetworkQueryAction(\"set_status\");\n","import { useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\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 = Preload.current_member;\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 { omit } from \"lodash\";\n\ninterface DefaultEntryComponentTypes {\n className: string;\n mention?: {\n avatar?: string;\n name: string;\n };\n theme?: {\n mentionSuggestionsEntryAvatar: string;\n mentionSuggestionsEntryText: string;\n };\n}\n\nfunction Avatar({\n mention,\n theme,\n}: Omit<DefaultEntryComponentTypes, \"className\">) {\n if (!mention?.avatar) {\n return null;\n }\n\n return (\n <img\n src={mention.avatar}\n className={theme?.mentionSuggestionsEntryAvatar}\n role=\"presentation\"\n ></img>\n );\n}\n\nfunction DefaultEntryComponent(props: DefaultEntryComponentTypes) {\n const { mention, theme, ...rest } = props;\n const parentProps = omit(rest, [\"isFocused\", \"searchValue\"]);\n\n return (\n <div {...parentProps}>\n <Avatar mention={mention} theme={theme} />\n {mention?.name ? (\n <span className={theme?.mentionSuggestionsEntryText}>\n {mention.name}\n </span>\n ) : null}\n </div>\n );\n}\n\nexport default DefaultEntryComponent;\n","import React, { useState, useCallback } from \"react\";\nimport createMentionPlugin from \"@draft-js-plugins/mention\";\nimport { showNameWithProfileField } from \"components/memberships/MemberNameWithAdditions\";\nimport DefaultEntryComponent from \"./defaultEntryComponent\";\n\ninterface MentionTypes {\n className: string;\n children: React.ReactNode;\n}\n\nfunction Mention({ className, children }: MentionTypes) {\n return (\n <div className={className + \" inline-mention-container\"}>@{children}</div>\n );\n}\n\ninterface MentionEntryTypes {\n className?: string;\n}\n\nfunction MentionEntry({ className, ...props }: MentionEntryTypes) {\n return (\n <DefaultEntryComponent className={`${className} suggestion`} {...props} />\n );\n}\n\nconst inlineMentionPlugin = createMentionPlugin({\n mentionTrigger: \"@\",\n entityMutability: \"IMMUTABLE\",\n mentionComponent: Mention,\n supportWhitespace: true,\n});\n\nfunction InlineMentionSuggestions() {\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 <inlineMentionPlugin.MentionSuggestions\n onSearchChange={search}\n open={open}\n onOpenChange={onOpenChange}\n suggestions={suggestions}\n entryComponent={MentionEntry}\n />\n );\n\n async function search({ value }) {\n const response = await $.ajax({\n url: `${Tixxt.currentNetwork.get(\"url\")}/members`,\n type: \"get\",\n dataType: \"json\",\n data: {\n q: `${value}*`,\n },\n contentType: \"application/json; charset=utf-8\",\n });\n\n setSuggestions(\n response.map((m) => ({\n id: m.id,\n name: showNameWithProfileField({\n name: m.displayName,\n detectionProfileField: m.detection_profile_field,\n isExternal: m.is_external,\n }),\n avatar: m.images.small,\n })),\n );\n }\n}\n\nexport default function createInlineMentionPlugin() {\n return { inlineMentionPlugin, InlineMentionSuggestions };\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 { 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 { 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 { 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 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 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 PropTypes from \"prop-types\";\n\nfunction FieldError({ error }) {\n return <span className=\"text-danger\">{error}</span>;\n}\nFieldError.propTypes = {\n error: PropTypes.string,\n};\n\nexport default FieldError;\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { Field } from \"redux-form\";\n\nimport FileUploadField from \"../../../shared/fields/FileUploadField\";\n\nfunction ImageField({ name, required, multiple, disabled }) {\n return (\n <Field\n name={name}\n required={required}\n component={FileUploadField}\n props={{\n isImage: true,\n storageDirectory: \"images\",\n inputTitle: I18n.t(\"js.files.uploader.select_image\"),\n multiple,\n disabled,\n }}\n />\n );\n}\nImageField.propTypes = {\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n multiple: PropTypes.bool,\n disabled: PropTypes.bool,\n};\n\nexport default ImageField;\n","import React, { Fragment, useCallback } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, isArray, compact, debounce, castArray } from \"lodash\";\nimport { Field } from \"redux-form\";\nimport AsyncSelect from \"react-select/async\";\n\nimport styles from \"./editFields.module.css\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\nimport { useMutation } from \"react-query\";\nimport { stringify } from \"query-string\";\nimport { fetchApi } from \"../../../../helpers/reactQueryApi\";\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 };\n};\n\nconst formatValue = (state) => {\n return map(\n compact(castArray(state)),\n ({ id, displayName, displayValue }) => ({\n value: id,\n label: displayName || displayValue,\n }),\n );\n};\n\nfunction SelectAdapter({\n input,\n required,\n id,\n disabled,\n className,\n multiple,\n meta: { error },\n}) {\n const { mutate: loadOptions } = useMutation(\n ({ q }) => fetchApi(`/members?${stringify({ q })}`),\n {\n onSuccess: (data, variables) => {\n variables.callback(formatValue(data));\n },\n },\n );\n\n const debouncedLoadOptions = useCallback(\n debounce(\n (value, callback) => loadOptions({ q: value + \"*\", callback }),\n 375,\n ),\n [loadOptions],\n );\n\n let 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: debouncedLoadOptions,\n isMulti: multiple,\n styles: { menu: (base) => ({ ...base, zIndex: 999 }) },\n };\n\n return (\n <Fragment>\n <div className=\"remove-input-txt-border\">\n <AsyncSelect\n {...props}\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n unstyled\n />\n </div>\n {error && <FieldError error={error} />}\n </Fragment>\n );\n}\nSelectAdapter.propTypes = {\n input: PropTypes.object,\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.string,\n label: PropTypes.string,\n }),\n ),\n multiple: PropTypes.bool,\n required: PropTypes.bool,\n id: PropTypes.string,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n meta: PropTypes.shape({ error: FieldError.propTypes.error }),\n};\n\nfunction MembershipField({ name, required, disabled, id, multiple }) {\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 }}\n />\n );\n}\nMembershipField.propTypes = {\n name: PropTypes.string.isRequired,\n multiple: PropTypes.bool,\n ...SelectAdapter.propTypes,\n};\n\nexport default MembershipField;\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { Field } from \"redux-form\";\nimport { get } from \"lodash\";\n\nimport styles from \"./editFields.module.css\";\nimport SimpleInput from \"components/appCreator/items/form/SimpleInput\";\n\nconst extractUrl = (value) => get(value, \"url\") || \"\";\nconst normalizeValue = (value) => ({ url: value });\n\nfunction UrlField({ name, required, disabled, id }) {\n return (\n <Field\n component={SimpleInput}\n type=\"url\"\n className={`${styles.Url} property-${name} form-input`}\n name={name}\n required={required}\n format={extractUrl}\n normalize={normalizeValue}\n disabled={disabled}\n id={id}\n />\n );\n}\nUrlField.propTypes = {\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n disabled: PropTypes.bool,\n id: PropTypes.string,\n};\n\nexport default UrlField;\n","import React, { useRef, useEffect, useState } from \"react\";\nimport { Field } from \"redux-form\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCalendar } from \"@fortawesome/pro-solid-svg-icons\";\nimport moment from \"moment\";\nimport { isEmpty } from \"lodash\";\nimport Datepicker from \"helpers/Datepicker\";\nimport \"../../../../../../node_modules/vanillajs-datepicker/dist/css/datepicker-bs5\";\n\nimport styles from \"./editFields.module.css\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\n\ntype DatePickerAdapterArgs = {\n input: {\n name: string;\n value: string;\n onChange: (value: string | null) => void;\n };\n meta: {\n error?: string;\n };\n};\n\nfunction DatePickerAdapter({ input, meta }: DatePickerAdapterArgs) {\n const elemRef = useRef<HTMLInputElement>(null);\n const [displayValue, setDisplayValue] = useState(\n !isEmpty(input.value)\n ? moment(input.value).format(\n I18n.t(\"js.plugins.Locale.Formats.valid_date\"),\n )\n : \"\",\n );\n\n useEffect(() => {\n const datepicker = new Datepicker(elemRef.current);\n elemRef.current?.addEventListener(\n \"changeDate\",\n function (e: CustomEventInit) {\n const formattedDate = e.detail.date\n ? moment(\n e.detail.date,\n I18n.t(\"js.plugins.Locale.Formats.valid_date\"),\n ).format(\"YYYY-MM-DD\")\n : null;\n\n setDisplayValue(\n formattedDate\n ? moment(formattedDate).format(\n I18n.t(\"js.plugins.Locale.Formats.valid_date\"),\n )\n : \"\",\n );\n\n input.onChange(formattedDate);\n },\n );\n\n return () => {\n datepicker.destroy();\n };\n });\n\n function onChange(e) {\n const rawValue = e.target.value;\n setDisplayValue(rawValue);\n\n const date = moment(\n rawValue,\n I18n.t(\"js.plugins.Locale.Formats.valid_date\"),\n true,\n );\n\n if (date.isValid()) {\n input.onChange(date.format(\"YYYY-MM-DD\"));\n } else {\n input.onChange(null);\n }\n }\n\n return (\n <>\n <div className={`${styles.Date} input-group date`}>\n <input\n type=\"text\"\n className={\"form-control\"}\n value={displayValue}\n onChange={onChange}\n ref={elemRef}\n />\n <button\n className=\"input-group-text\"\n onClick={(e) => {\n e.preventDefault();\n elemRef.current?.focus();\n }}\n >\n <FontAwesomeIcon icon={faCalendar} />\n </button>\n </div>\n {meta?.error && <FieldError error={meta.error} />}\n </>\n );\n}\n\ntype DateFieldArgs = {\n name: string;\n disabled: boolean;\n required: boolean;\n id: string;\n};\n\nfunction DateField({ required, id, disabled, name }: DateFieldArgs) {\n return (\n <Field\n component={DatePickerAdapter}\n className={`property-${name} form-input`}\n name={name}\n required={required}\n id={id}\n disabled={disabled}\n />\n );\n}\n\nexport default DateField;\n","import React, { Component, Fragment, createRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Field } from \"redux-form\";\nimport { get } from \"lodash\";\n\nimport styles from \"./editFields.module.css\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\nimport loadAndConfigureCKEditor from \"../../../../helpers/ckeditor/loadAndConfigureCKEditor\";\n\nclass CKEditorAdpater extends Component {\n constructor(props) {\n super(props);\n this.ref = createRef();\n }\n\n async componentDidMount() {\n const CKEDITOR = await loadAndConfigureCKEditor();\n\n this.lastValue = this.props.input.value;\n this.editor = CKEDITOR.replace(this.ref.current, {\n codeSnippet_theme: \"github\",\n bodyClass: styles.Html,\n });\n\n this.editor.on(\"change\", () => {\n this.editor.updateElement();\n this.lastValue = this.ref.current.value;\n this.props.input.onChange(this.lastValue);\n });\n }\n\n componentDidUpdate() {\n if (!this.editor) return;\n\n const newValue = this.props.input.value;\n\n if (newValue !== this.lastValue) {\n this.lastValue = newValue;\n this.editor.setData(newValue);\n }\n }\n\n componentWillUnmount() {\n if (!this.editor) return;\n\n this.editor.destroy();\n }\n\n render() {\n const error = get(this.props, [\"meta\", \"error\"]);\n return (\n <Fragment>\n <textarea\n ref={this.ref}\n id={this.props.id}\n value={this.props.input.value}\n onChange={this.props.input.onChange}\n />\n {error && <FieldError error={error} />}\n </Fragment>\n );\n }\n}\nCKEditorAdpater.propTypes = {\n input: PropTypes.shape({\n value: PropTypes.string,\n onChange: PropTypes.func,\n }),\n id: PropTypes.string,\n meta: PropTypes.shape({ error: FieldError.propTypes.error }),\n};\n\nfunction HtmlField({ name, required, disabled, id }) {\n return (\n <Field\n name={name}\n required={required}\n component={CKEditorAdpater}\n disabled={disabled}\n id={id}\n />\n );\n}\nHtmlField.propTypes = {\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n content: PropTypes.string,\n disabled: PropTypes.bool,\n id: PropTypes.string,\n};\n\nexport default HtmlField;\n","import React, { Fragment, useMemo } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useDispatch } from \"react-redux\";\nimport {\n map,\n castArray,\n isArray,\n compact,\n debounce,\n groupBy,\n sortBy,\n} from \"lodash\";\nimport { Field } from \"redux-form\";\nimport Select from \"react-select\";\nimport CreatableSelect from \"react-select/creatable\";\nimport AsyncSelect from \"react-select/async\";\nimport AsyncCreatableSelect from \"react-select/async-creatable\";\n\nimport styles from \"./editFields.module.css\";\nimport { fetchRelationOptions } from \"actions/appCreator\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\nimport indexBy from \"../../../../helpers/indexBy\";\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 values: value.values,\n isNew: value.isNew,\n };\n};\n\nconst formatValue = (state) =>\n map(compactArray(state), ({ id, displayValue, values, isNew }) => ({\n value: id,\n label: displayValue,\n values,\n isNew,\n }));\n\nconst compactArray = (arr) => compact(castArray(arr));\n\nconst formatOptionsBasedOnApps = (options, relatedApps) => {\n options = compactArray(options);\n const appDetailsById = indexBy(relatedApps, \"id\");\n const optionsGroupedByAppId = groupBy(options, \"app_id\");\n return map(optionsGroupedByAppId, (optionsInApp, app_id) => ({\n label: appDetailsById[app_id]?.name,\n options: formatValue(optionsInApp),\n }));\n};\n\nfunction formatCreateLabel(label) {\n return (\n <span>\n <i className=\"fa fa-plus\" /> {label}\n </span>\n );\n}\n\nfunction SelectAdapter({\n input,\n options,\n multiple,\n required,\n id,\n disabled,\n allow_create_related,\n async,\n appId,\n className,\n meta: { error },\n}) {\n const dispatch = useDispatch();\n const loadOptions = useMemo(\n () =>\n debounce(async (value, callback) => {\n const { payload } = await dispatch(\n fetchRelationOptions({ appId, propertyName: input.name, q: value }),\n );\n callback(formatValue(payload));\n }, 375),\n [appId, input.name],\n );\n\n let 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 options,\n isMulti: multiple,\n isClearable: !required,\n isDisabled: disabled,\n inputId: id,\n placeholder: I18n.t(\"js.apps.properties.relation.placeholder\"),\n noOptionsMessage: () => I18n.t(\"plugins.select2.no_match\"),\n className,\n styles: { menu: (base) => ({ ...base, zIndex: 999 }) },\n };\n\n if (allow_create_related) {\n props.onCreateOption = (value) => {\n const newValue = {\n label: value,\n isNew: true,\n value: `new_${value}`,\n values: { name: value },\n };\n input.onChange(multiple ? [...input.value, newValue] : newValue);\n };\n props.formatCreateLabel = formatCreateLabel;\n }\n if (async) {\n props.loadOptions = (value, callback) => {\n loadOptions(value, callback);\n };\n }\n\n let Component;\n\n if (async && allow_create_related) {\n Component = AsyncCreatableSelect;\n } else if (async && !allow_create_related) {\n Component = AsyncSelect;\n } else if (!async && allow_create_related) {\n Component = CreatableSelect;\n } else {\n Component = Select;\n }\n\n return (\n <Fragment>\n <Component {...props} classNamePrefix={\"Select\"} />\n {error && <FieldError error={error} />}\n </Fragment>\n );\n}\nSelectAdapter.propTypes = {\n input: PropTypes.object,\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.string,\n label: PropTypes.string,\n app_id: PropTypes.string,\n }),\n ),\n related_apps: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string,\n }),\n ),\n multiple: PropTypes.bool,\n required: PropTypes.bool,\n id: PropTypes.string,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n allow_create_related: PropTypes.bool,\n async: PropTypes.bool,\n polymorphic: PropTypes.bool,\n loadOptions: PropTypes.func,\n meta: PropTypes.shape({ error: FieldError.propTypes.error }),\n};\n\nfunction RelationField({\n name,\n required,\n options,\n multiple,\n disabled,\n id,\n allow_create_related,\n async,\n appId,\n polymorphic,\n related_apps,\n}) {\n const sortedOptions = sortBy(options, [\"displayValue\"]);\n return (\n <Field\n component={SelectAdapter}\n name={name}\n required={required}\n multiple={multiple}\n options={\n polymorphic\n ? formatOptionsBasedOnApps(sortedOptions, related_apps)\n : formatValue(sortedOptions)\n }\n disabled={disabled}\n normalize={normalizeValue}\n format={formatValue}\n id={id}\n props={{\n allow_create_related,\n className: `${styles.Relation} property-${name}`,\n async,\n appId,\n }}\n />\n );\n}\nRelationField.propTypes = {\n name: PropTypes.string.isRequired,\n ...SelectAdapter.propTypes,\n};\n\nexport default RelationField;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport Address from \"components/appCreator/properties/edit/AddressField\";\nimport Email from \"components/appCreator/properties/edit/EmailField\";\nimport Image from \"components/appCreator/properties/edit/ImageField\";\nimport MembershipRelation from \"components/appCreator/properties/edit/MembershipField\";\nimport Number from \"components/appCreator/properties/edit/NumberField\";\nimport Selection from \"components/appCreator/properties/edit/SelectionField\";\nimport Text from \"components/appCreator/properties/edit/TextField\";\nimport Url from \"components/appCreator/properties/edit/UrlField\";\nimport Tag from \"components/appCreator/properties/edit/TagField\";\nimport DatePicker from \"components/appCreator/properties/edit/DateField\";\nimport Html from \"components/appCreator/properties/edit/HtmlField\";\nimport File from \"components/appCreator/properties/edit/FileField\";\nimport RelationField from \"components/appCreator/properties/edit/RelationField\";\n\nconst PROPERTIES = {\n address: Address,\n email: Email,\n image: Image,\n membership: MembershipRelation,\n selection: Selection,\n text: Text,\n url: Url,\n number: Number,\n tag: Tag,\n file: File,\n date: DatePicker,\n html: Html,\n relation: RelationField,\n};\n\nexport function isManualFocusHandlingRequired(prop) {\n return prop.type === \"text\" && prop.multiline;\n}\n\nfunction canUpdate(property, item) {\n const can = item?.can || property.can || {};\n\n if (`update[${property.name}]` in can) return can[`update[${property.name}]`];\n if (\"update\" in can) return can.update;\n\n return true;\n}\n\nfunction PropertyEdit({ property, id, appId, inputRef, item }) {\n const { name, type } = property;\n const Component = PROPERTIES[type];\n\n if (Component) {\n return (\n <Component\n {...property}\n disabled={!canUpdate(property, item)}\n id={id}\n appId={appId} // deprecated\n inputRef={inputRef}\n />\n );\n } else {\n return (\n <p>\n Unsupported field type "{type}" for property "{name}\n "\n </p>\n );\n }\n}\n\nPropertyEdit.propTypes = {\n property: PropTypes.object.isRequired,\n value: PropTypes.any,\n appId: PropTypes.string,\n id: PropTypes.string,\n inputRef: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.shape({ current: PropTypes.any }),\n ]),\n};\n\nexport default PropertyEdit;\n","import PropTypes from \"prop-types\";\nimport React, { useRef, useState } from \"react\";\nimport { map, isPlainObject, isArray, each, set, isEmpty, get } from \"lodash\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport ControlGroup from \"components/shared/fields/ControlGroup\";\nimport Hint from \"components/shared/fields/Hint\";\nimport PropertyEdit, {\n isManualFocusHandlingRequired,\n} from \"components/appCreator/properties/PropertyEdit\";\nimport { isPropRequired } from \"components/appCreator/properties/helpers\";\nimport Headline from \"components/appCreator/properties/show/Headline\";\n\nfunction Fields({ properties, fieldErrors, appId, item }) {\n const [fieldIdBase] = useState(appId || uuidv4());\n const focusHandlers = useRef({});\n const handleNewInputRef = (name) => (newRef) => {\n focusHandlers.current[name] = () => newRef.focus();\n };\n const handleLabelClick = (e) => {\n const name = e.currentTarget.dataset.propertyName;\n if (focusHandlers.current[name]) focusHandlers.current[name]();\n };\n\n const errors = {};\n each(fieldErrors, (error, key) => {\n set(errors, key, error);\n });\n\n return map(properties, (prop, i) => {\n const fieldId = `${fieldIdBase}-${prop.name}`;\n const name = get(prop, \"name\");\n const propErrors = get(errors, [name, prop.name]) || get(errors, prop.name);\n const propHasErrors = !isEmpty(propErrors);\n\n if (prop.type === \"statistics\") return null;\n if (prop.type === \"headline\")\n return (\n <>\n <Headline key={i} property={prop} />\n <Hint hint={prop.hint} />\n </>\n );\n\n return (\n <ControlGroup\n key={i}\n name={prop.name}\n label={prop.label}\n required={isPropRequired(prop)}\n htmlFor={fieldId}\n className={`${prop.type}-property`}\n error={propHasErrors}\n onLabelClick={handleLabelClick}\n >\n <PropertyEdit\n property={prop}\n appId={appId} // deprecated\n id={fieldId}\n error={propHasErrors}\n inputRef={\n isManualFocusHandlingRequired(prop)\n ? handleNewInputRef(prop.name)\n : null\n }\n item={item}\n />\n <Hint hint={prop.hint} />\n {map(\n isPlainObject(propErrors) || isArray(propErrors)\n ? propErrors\n : [propErrors],\n (error, i) => (\n <span key={i} className=\"help-block text-danger\">\n {error}\n </span>\n ),\n )}\n </ControlGroup>\n );\n });\n}\n\nFields.propTypes = {\n properties: PropTypes.array,\n fieldErrors: PropTypes.object,\n name: PropTypes.string,\n appId: PropTypes.string,\n options: PropTypes.object,\n};\n\nexport default Fields;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport FieldError from \"./FieldError\";\nimport styles from \"../../properties/edit/editFields.module.css\";\nimport classNames from \"classnames\";\n\nfunction SimpleInput({\n input,\n meta: { error },\n wrapperClassName,\n prefix,\n postfix,\n ...otherProps\n}) {\n let inputElement = <input {...input} {...otherProps} />;\n\n if (prefix || postfix)\n inputElement = (\n <div className=\"input-group\">\n {prefix && <span className=\"input-group-text\">{prefix}</span>}\n {inputElement}\n {postfix && <span className=\"input-group-text\">{postfix}</span>}\n </div>\n );\n\n return (\n <div className={classNames(styles.SimpleInput, wrapperClassName)}>\n {inputElement}\n {error && <FieldError error={error} />}\n </div>\n );\n}\n\nSimpleInput.propTypes = {\n meta: PropTypes.shape({ error: FieldError.propTypes.error }),\n input: PropTypes.object,\n};\n\nexport default SimpleInput;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\n\nimport styles from \"./showFields.module.css\";\n\nfunction Email({ value }) {\n return !isEmpty(value) ? (\n <a\n className={styles.Email}\n href={`mailto:${value}`}\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n >\n {value}\n </a>\n ) : (\n <span className={styles.Email} />\n );\n}\nEmail.propTypes = {\n value: PropTypes.string,\n};\n\nexport default Email;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { castArray, map, compact } from \"lodash\";\n\nimport styles from \"./showFields.module.css\";\n\nexport const defaultImageUrl = (id, size) =>\n `/api/storage/images/${id}/get/${size}`;\n\nfunction Image({ value }) {\n return (\n <div className={styles.Image}>\n {map(\n compact(castArray(value)),\n ({ id, name, imageUrl, thumbnailUrl }) => (\n <a\n key={id}\n href={imageUrl || defaultImageUrl(id, \"1920x1200\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img\n src={thumbnailUrl || defaultImageUrl(id, \"200x200\")}\n alt={name}\n />\n </a>\n ),\n )}\n </div>\n );\n}\nconst imageShape = PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string,\n imageUrl: PropTypes.string, // for storybook\n thumbnailUrl: PropTypes.string, // for storybook\n});\nImage.propTypes = {\n value: PropTypes.oneOfType([PropTypes.arrayOf(imageShape), imageShape]),\n};\n\nexport default Image;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\n\nfunction Url({ value }) {\n return !isEmpty(value) ? (\n <a href={`${value.url}`} target=\"_blank\" rel=\"noopener noreferrer\">\n {value.text || value.url}\n </a>\n ) : null;\n}\nUrl.propTypes = {\n value: PropTypes.shape({\n url: PropTypes.string.isRequired,\n text: PropTypes.string,\n }),\n};\n\nexport default Url;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport GenericValueList from \"./helpers/GenericValueList\";\n\nfunction File({ value }) {\n return (\n <GenericValueList\n values={value}\n component={(file) => (\n <a className=\"file-link\" href={`/files/${file.id}`} title={file.name}>\n <i className=\"icon icons-file\">\n <span className={`i-${file.extension}`}>{file.extension}</span>\n </i>\n <span className=\"file-name\">{file.name}</span>\n </a>\n )}\n />\n );\n}\nFile.propTypes = {\n value: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string,\n id: PropTypes.string,\n extension: PropTypes.string,\n }),\n ),\n};\n\nexport default File;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport GenericValueList from \"./helpers/GenericValueList\";\n\nimport styles from \"./showFields.module.css\";\n\nfunction Relation({ value, property }) {\n return (\n <GenericValueList\n values={value}\n component={({ id, displayValue }) => (\n <a\n className={styles.Relation}\n href={`/apps/${property.related_app_id}/items/${id}`}\n >\n {displayValue}\n </a>\n )}\n />\n );\n}\nconst relationPropType = PropTypes.shape({\n id: PropTypes.string,\n displayValue: PropTypes.string,\n});\nRelation.propTypes = {\n value: PropTypes.oneOfType([\n PropTypes.arrayOf(relationPropType),\n relationPropType,\n ]),\n property: PropTypes.shape({\n related_app_id: PropTypes.string,\n }),\n};\n\nexport default Relation;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\n\nimport { defaultImageUrl } from \"./Image\";\nimport GenericValueList from \"./helpers/GenericValueList\";\n\nfunction imageLoadingError({ currentTarget }) {\n currentTarget.onerror = null; // prevents looping\n if (currentTarget.src !== Assets[\"profile_50x50.jpg\"])\n currentTarget.src = Assets[\"profile_50x50.jpg\"];\n}\n\nfunction MemberLink({ id, imageId, displayValue, thumbnailUrl }) {\n const image = (\n <img\n className=\"rounded-full w-5 h-5\"\n src={\n thumbnailUrl ||\n (isEmpty(imageId)\n ? Assets[\"profile_50x50.jpg\"]\n : defaultImageUrl(imageId, \"50x50\"))\n }\n onError={imageLoadingError}\n aria-hidden\n />\n );\n\n return (\n <>\n {id ? (\n <a className=\"flex gap-1 items-center\" href={`/members/${id}`}>\n {image}\n <span className={\"truncate\"}>{displayValue}</span>\n </a>\n ) : (\n <span className=\"flex gap-1 items-center\">\n {image}\n <span className={\"truncate\"}>\n {window.Preload.current_network.config.anonymize_membership ===\n \"disabled\"\n ? displayValue\n : window.Preload.current_network.config.anonymize_membership_name}\n </span>\n </span>\n )}\n </>\n );\n}\n// id is null if the underlying Membership is deleted\nMemberLink.propTypes = {\n id: PropTypes.string,\n displayValue: PropTypes.string,\n imageId: PropTypes.string,\n thumbnailUrl: PropTypes.string, // for storybook\n};\n\nfunction MembershipRelation({ value, options }) {\n return (\n <GenericValueList values={value} component={MemberLink} {...options} />\n );\n}\nMembershipRelation.propTypes = {\n value: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.shape(MemberLink.propTypes)),\n PropTypes.shape(MemberLink.propTypes),\n ]),\n};\n\nexport default MembershipRelation;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { get } from \"lodash\";\n\nimport styles from \"./showFields.module.css\";\n\nfunction DateView({ value, displayValue }) {\n return (\n <time dateTime={value} className={styles.Date}>\n {get(displayValue, \"displayValue\") || displayValue || value}\n </time>\n );\n}\nDateView.propTypes = {\n value: PropTypes.string,\n displayValue: PropTypes.string,\n};\n\nexport default DateView;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty } from \"lodash\";\n\nimport styles from \"./showFields.module.css\";\n\nfunction Statistics({ value }) {\n return !isEmpty(value) ? (\n <span\n className={styles.Statistics}\n title={I18n.t(\"js.apps.properties.statistics.view_count\", {\n view_count: value.view_count,\n })}\n >\n <i className=\"fa fa-eye\" />\n {value.view_count}\n </span>\n ) : null;\n}\nStatistics.propTypes = {\n value: PropTypes.shape({\n view_count: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n }),\n};\n\nexport default Statistics;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty, compact } from \"lodash\";\n\nimport styles from \"./showFields.module.css\";\n// TODO: optional show map\nfunction Address({ value = {}, property = {} }) {\n return (\n <address className={styles.Address}>\n {property.with_name && !isEmpty(value.name) ? (\n <span className=\"name\">{value.name}</span>\n ) : null}\n <span className=\"street-number\">\n {compact([value.street, value.number]).join(\" \")}\n </span>\n <span className=\"zip-city\">\n {compact([value.zip, value.city]).join(\" \")}\n </span>\n {!isEmpty(value.country) ? (\n <span className=\"country\">{value.country}</span>\n ) : null}\n </address>\n );\n}\nAddress.propTypes = {\n value: PropTypes.shape({\n name: PropTypes.string,\n street: PropTypes.string,\n number: PropTypes.string,\n zip: PropTypes.string,\n city: PropTypes.string,\n country: PropTypes.string,\n }),\n property: PropTypes.shape({\n with_name: PropTypes.bool,\n }),\n};\n\nexport default Address;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { unescape } from \"lodash\";\n\nimport styles from \"./showFields.module.css\";\n\nfunction Html({ value }) {\n return (\n <div\n className={styles.Html}\n dangerouslySetInnerHTML={{\n __html: unescape(value),\n }}\n />\n );\n}\n\nHtml.propTypes = {\n value: PropTypes.string,\n};\n\nexport default Html;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { get, isEmpty } from \"lodash\";\n\nimport Text from \"../properties/show/Text\";\nimport Email from \"../properties/show/Email\";\nimport Image from \"../properties/show/Image\";\nimport Url from \"../properties/show/Url\";\nimport File from \"../properties/show/File\";\nimport Selection from \"../properties/show/Selection\";\nimport Relation from \"../properties/show/Relation\";\nimport MembershipRelation from \"../properties/show/MembershipRelation\";\nimport DateView from \"../properties/show/DateView\";\nimport Statistics from \"../properties/show/Statistics\";\nimport Address from \"../properties/show/Address\";\nimport Tag from \"../properties/show/Tag\";\nimport Html from \"../properties/show/Html\";\nimport Headline from \"../properties/show/Headline\";\n\nconst PROPERTIES = {\n address: Address,\n email: Email,\n image: Image,\n membership: MembershipRelation,\n selection: Selection,\n text: Text,\n url: Url,\n number: Text,\n tag: Tag,\n file: File,\n date: DateView,\n statistics: Statistics,\n html: Html,\n relation: Relation,\n headline: Headline,\n};\n\nfunction PropertyShow({ property, options, item }) {\n const type = get(property, \"type\");\n const name = get(property, \"name\");\n const value = get(item, [\"values\", name]);\n const displayValue =\n get(item, [\"values\", \"$_displayValues_\", name]) ||\n get(item, [\"display_values\", name]);\n\n const Component = PROPERTIES[type];\n if (Component) {\n if (isEmpty(value) && isEmpty(displayValue)) return null;\n\n return (\n <Component\n property={property}\n options={options}\n value={value}\n displayValue={displayValue}\n item={value} // deprecated\n />\n );\n } else {\n return <div>Unknown property type</div>;\n }\n}\nPropertyShow.propTypes = {\n property: PropTypes.shape({\n type: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n }),\n item: PropTypes.shape({\n values: PropTypes.shape({\n $_displayValues_: PropTypes.object,\n // this includes all plain values under the name as key\n }).isRequired,\n display_values: PropTypes.object,\n }),\n options: PropTypes.object,\n};\n\nexport default PropertyShow;\n","import React, { Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Field, FormSection } from \"redux-form\";\nimport { map } from \"lodash\";\nimport classnames from \"classnames\";\n\nimport styles from \"./editFields.module.css\";\nimport SimpleInput from \"components/appCreator/items/form/SimpleInput\";\nimport SelectionField from \"./SelectionField\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\n\nconst STATES = {\n Deutschland: [\n \"Baden-Württemberg\",\n \"Bayern\",\n \"Berlin\",\n \"Brandenburg\",\n \"Bremen\",\n \"Hamburg\",\n \"Hessen\",\n \"Mecklenburg-Vorpommern\",\n \"Niedersachsen\",\n \"Nordrhein-Westfalen\",\n \"Rheinland-Pfalz\",\n \"Saarland\",\n \"Sachsen\",\n \"Sachsen-Anhalt\",\n \"Schleswig-Holstein\",\n \"Thüringen\",\n ],\n};\n\nfunction createCountrySelectorFor(country) {\n function Select({\n className,\n id,\n required,\n input,\n meta: { error },\n placeholder,\n }) {\n return (\n <Fragment>\n <SelectionField\n {...input}\n className={className}\n required={required}\n name=\"state\"\n placeholder={placeholder}\n options={map(STATES[country], (state) => ({\n value: state,\n label: state,\n }))}\n id={id}\n />\n {error && <FieldError error={error} />}\n </Fragment>\n );\n }\n\n Select.propTypes = {\n className: PropTypes.string,\n id: PropTypes.string,\n placeholder: PropTypes.string,\n required: PropTypes.bool,\n input: PropTypes.object,\n meta: PropTypes.shape({ error: FieldError.propTypes.error }),\n };\n\n return Select;\n}\n\nconst DEFAULT_LABELS = {\n name: \"Name\",\n street: \"Straße\",\n number: \"Nr.\",\n zip: \"PLZ\",\n city: \"Stadt\",\n state: \"Bundesland\",\n country: \"Land\",\n};\n\nfunction AddressField({\n name,\n disabled,\n required = {},\n with_name,\n labels = DEFAULT_LABELS,\n force_country,\n id,\n}) {\n const placeholder = (name) =>\n required[name] ? `${labels[name]} *` : labels[name];\n\n function fieldFor(fieldName, { className, ...remainingProps } = {}) {\n return (\n <Field\n component={SimpleInput}\n disabled={disabled}\n type=\"text\"\n className={classnames(\n `property-${name}-${fieldName} form-input`,\n className,\n )}\n name={fieldName}\n required={required[fieldName]}\n placeholder={placeholder(fieldName)}\n id={id ? `${id}-${fieldName}` : null}\n {...remainingProps}\n />\n );\n }\n\n return (\n <FormSection name={name} className={`flex flex-col space-y-2`}>\n {with_name ? (\n <div className={\"flex\"}>\n {fieldFor(\"name\", { id: id, wrapperClassName: \"flex-1\" })}\n </div>\n ) : null}\n <div className={`flex space-x-2`}>\n {fieldFor(\"street\", {\n id: with_name ? null : id,\n wrapperClassName: \"flex-1\",\n })}\n {fieldFor(\"number\", { wrapperClassName: \"w-24\" })}\n </div>\n <div className={`flex space-x-2`}>\n {fieldFor(\"zip\", { wrapperClassName: \"w-36\" })}\n {fieldFor(\"city\", { wrapperClassName: \"flex-1\" })}\n </div>\n <div\n className={classnames(`flex`, {\n [styles.StateRow]: !!STATES[force_country],\n })}\n >\n {fieldFor(\"state\", {\n wrapperClassName: \"flex-1\",\n component: STATES[force_country]\n ? createCountrySelectorFor(force_country)\n : SimpleInput,\n })}\n </div>\n <div className={`flex`}>\n {fieldFor(\"country\", {\n className: classnames(`property-${name}-name form-input`),\n placeholder: force_country || placeholder(\"country\"),\n disabled: !!force_country || disabled,\n wrapperClassName: \"flex-1\",\n })}\n </div>\n </FormSection>\n );\n}\n\nAddressField.propTypes = {\n name: PropTypes.string.isRequired,\n required: PropTypes.objectOf(PropTypes.bool),\n force_country: PropTypes.string,\n labels: PropTypes.objectOf(PropTypes.string),\n with_name: PropTypes.bool,\n id: PropTypes.string,\n disabled: PropTypes.bool,\n};\n\nexport default AddressField;\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { Field } from \"redux-form\";\n\nimport styles from \"./editFields.module.css\";\nimport SimpleInput from \"components/appCreator/items/form/SimpleInput\";\n\nfunction EmailField({ name, required, id, disabled }) {\n return (\n <Field\n component={SimpleInput}\n type=\"email\"\n className={`${styles.Email} property-${name} form-input`}\n name={name}\n required={required}\n id={id}\n disabled={disabled}\n />\n );\n}\nEmailField.propTypes = {\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n id: PropTypes.string,\n disabled: PropTypes.bool,\n};\n\nexport default EmailField;\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { Field } from \"redux-form\";\n\nimport FileUploadField from \"components/shared/fields/FileUploadField\";\nimport styles from \"./editFields.module.css\";\n\nfunction FileField({ name, required, multiple, disabled }) {\n return (\n <Field\n className={styles.File}\n name={name}\n required={required}\n component={FileUploadField}\n multiple={multiple}\n disabled={disabled}\n />\n );\n}\nFileField.propTypes = {\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n multiple: PropTypes.bool,\n disabled: PropTypes.bool,\n};\n\nexport default FileField;\n","import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { Field } from \"redux-form\";\nimport { isString, isNumber } from \"lodash\";\n\nimport styles from \"./editFields.module.css\";\nimport SimpleInput from \"components/appCreator/items/form/SimpleInput\";\n\nconst round = (value, precision = 0) => {\n if (isNumber(value)) return value.toFixed(precision);\n if (isString(value)) return Number.parseFloat(value).toFixed(precision);\n\n return value;\n};\n\nfunction NumberInput({ input, precision, ...otherProps }) {\n return (\n <SimpleInput\n {...otherProps}\n input={input}\n onBlur={(e) => {\n input.onChange(round(e.target.value, precision) * 1);\n input.onBlur(e);\n }}\n />\n );\n}\n\nNumberInput.propTypes = {\n precision: PropTypes.number,\n input: PropTypes.shape({\n onChange: PropTypes.func,\n onBlur: PropTypes.func,\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n }),\n};\n\nfunction NumberField({\n name,\n required,\n id,\n prefix,\n postfix,\n precision,\n disabled,\n max,\n min,\n}) {\n return (\n <Field\n className={`property-${name} form-input ${styles.Numbe}`}\n component={NumberInput}\n name={name}\n type=\"number\"\n required={required}\n id={id}\n max={max}\n min={min}\n props={{ precision }}\n disabled={disabled}\n prefix={prefix}\n postfix={postfix}\n />\n );\n}\n\nNumberField.propTypes = {\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n id: PropTypes.string,\n prefix: PropTypes.string,\n postfix: PropTypes.string,\n precision: PropTypes.number,\n disabled: PropTypes.bool,\n max: PropTypes.number,\n min: PropTypes.number,\n};\n\nexport default NumberField;\n","import React, { Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Field } from \"redux-form\";\nimport {\n map,\n get,\n find,\n isArray,\n isNil,\n castArray,\n flatMap,\n isEmpty,\n reject,\n includes,\n without,\n uniq,\n} from \"lodash\";\nimport Select from \"react-select\";\n\nimport styles from \"./editFields.module.css\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\n\n// Extract the value prop from the selected react-select value\n// { value: \"dr\", label: \"Dr.\" } => \"dr\"\n// [{ value: \"dr\", label: \"Dr.\" }] => [\"dr\"]\nconst normalizeValue = (value, multiple) => {\n if (value === null) return [];\n if (isArray(value)) return flatMap(value, normalizeValue);\n return multiple ? [get(value, \"value\")] : get(value, \"value\");\n};\n\nconst createFormatValue = (options) =>\n // Map option identifiers, like [\"dr\"], to their options\n // used in react-select, like [{ value: \"dr\", label: \"Dr.\" }]\n function formatValue(value) {\n if (value === null) return [];\n if (isArray(value)) return map(value, formatValue);\n\n return find(options, { value });\n };\n\nexport function SelectAdapter({\n input,\n meta: { error },\n options,\n multiple,\n required,\n id,\n disabled,\n className,\n placeholder,\n}) {\n return (\n <Fragment>\n <div className=\"remove-input-txt-border\">\n <Select\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 className={className}\n options={reject(options, (option) => isEmpty(option.value))}\n isMulti={multiple}\n isClearable={!required}\n isDisabled={disabled}\n inputId={id}\n placeholder={\n placeholder || I18n.t(\"js.apps.properties.relation.placeholder\")\n }\n noOptionsMessage={() => I18n.t(\"plugins.select2.no_match\")}\n classNamePrefix=\"form-select\"\n unstyled\n />\n </div>\n {error && <FieldError error={error} />}\n </Fragment>\n );\n}\n\nSelectAdapter.propTypes = {\n input: PropTypes.object,\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.string,\n label: PropTypes.string,\n }),\n ),\n multiple: PropTypes.bool,\n required: PropTypes.bool,\n id: PropTypes.string,\n placeholder: PropTypes.string,\n disabled: PropTypes.bool,\n meta: PropTypes.shape({ error: FieldError.propTypes.error }),\n};\n\nfunction CheckboxRadioAdapter({\n input,\n meta: { error },\n options,\n multiple,\n disabled,\n required,\n}) {\n const type = multiple ? \"checkbox\" : \"radio\";\n const value = castArray(input.value);\n\n const onChange = (e) => {\n if (!multiple) return input.onChange(e.target.dataset.value);\n\n if (e.target.checked) {\n input.onChange(uniq([...value, e.target.dataset.value]));\n } else {\n input.onChange(without(value, e.target.dataset.value));\n }\n };\n\n const finalOptions =\n !multiple && !required\n ? [\n {\n value: \"-1\",\n label: I18n.t(\"js.apps.properties.selection.no_selection\"),\n },\n ...options,\n ]\n : options;\n\n return map(finalOptions, (option, i) => (\n <Fragment key={i}>\n {isEmpty(option.value) ? (\n <h5>{option.label}</h5>\n ) : (\n <label key={option.value} className={type}>\n <input\n type={type}\n checked={includes(value, option.value)}\n data-value={option.value}\n onChange={onChange}\n disabled={disabled}\n />\n {option.label}\n </label>\n )}\n {error && <FieldError error={error} />}\n </Fragment>\n ));\n}\n\nCheckboxRadioAdapter.propTypes = SelectAdapter.propTypes;\n\nfunction SelectionField({\n name,\n required,\n options,\n multiple,\n disabled,\n select: rawSelect,\n id,\n placeholder,\n}) {\n // select is default true\n const select = isNil(rawSelect) ? true : rawSelect;\n\n return (\n <Field\n component={select ? SelectAdapter : CheckboxRadioAdapter}\n name={name}\n required={required}\n multiple={multiple}\n options={options}\n disabled={disabled}\n placeholder={placeholder}\n normalize={(value) => (select ? normalizeValue(value, multiple) : value)}\n format={select ? createFormatValue(options) : null}\n id={id}\n props={{ className: `${styles.Selection} property-${name} flex-1` }}\n />\n );\n}\n\nSelectionField.propTypes = {\n name: PropTypes.string.isRequired,\n select: PropTypes.bool,\n ...SelectAdapter.propTypes,\n};\n\nexport default SelectionField;\n","import React, { createContext, Fragment, useCallback, useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport {\n map,\n castArray,\n isArray,\n compact,\n debounce,\n startsWith,\n isEmpty,\n} from \"lodash\";\nimport { Field } from \"redux-form\";\nimport AsyncSelect from \"react-select/async\";\nimport AsyncCreatableSelect from \"react-select/async-creatable\";\n\nimport styles from \"./editFields.module.css\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"../../../../helpers/reactQueryApi\";\nimport { stringify } from \"query-string\";\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 name: value.label,\n };\n};\n\nconst formatValue = (state) =>\n map(compact(castArray(state)), ({ id, name }) => ({\n value: id,\n label: name,\n }));\n\nfunction formatCreateLabel(label) {\n return (\n <span>\n <i className=\"fa fa-plus\" /> {label}\n </span>\n );\n}\n\nfunction SelectAdapter({\n input,\n meta: { error },\n required,\n id,\n disabled,\n className,\n internal,\n multiple,\n allowCreate,\n}) {\n const tagParentsFromContext = useContext(TagParentsContext);\n if (internal && isEmpty(tagParentsFromContext))\n console.error(\n \"TagField is supposed to be internal, but no tag parents were provided via TagParentsContext\",\n );\n const tagParents =\n internal && !isEmpty(tagParentsFromContext)\n ? tagParentsFromContext.join(\",\")\n : null;\n\n const { mutate: loadOptions } = useMutation(\n ({ q }) =>\n fetchApi(\n `/tags/find?${stringify({\n q,\n tag_parents: tagParents,\n exclude_new: true,\n })}`,\n ),\n {\n onSuccess: (data, variables) => {\n variables.callback(formatValue(data));\n },\n },\n );\n\n const debouncedLoadOptions = useCallback(\n debounce(\n (value, callback) => loadOptions({ q: value + \"*\", callback }),\n 375,\n ),\n [loadOptions],\n );\n\n let 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.tag_select.placeholder\"),\n noOptionsMessage: ({ inputValue }) =>\n isEmpty(inputValue)\n ? I18n.t(\"plugins.select2.enter_more_characters\", { count: 1 })\n : I18n.t(\"plugins.select2.no_match\"),\n className,\n loadOptions: debouncedLoadOptions,\n formatOptionLabel: ({ value, label }) =>\n startsWith(value, \"new\") ? formatCreateLabel(label) : label,\n styles: { menu: (base) => ({ ...base, zIndex: 999 }) },\n isMulti: multiple,\n // creation props\n formatCreateLabel: formatCreateLabel,\n createOptionPosition: \"first\",\n onCreateOption: (value) => {\n const newValue = {\n label: value,\n value: `new_${value}`,\n new: true,\n };\n input.onChange([...input.value, newValue]);\n },\n };\n\n const SelectComponent = allowCreate ? AsyncCreatableSelect : AsyncSelect;\n\n return (\n <Fragment>\n <div className=\"remove-input-txt-border\">\n <SelectComponent\n {...props}\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n unstyled\n />\n </div>\n {error && <FieldError error={error} />}\n </Fragment>\n );\n}\nSelectAdapter.propTypes = {\n input: PropTypes.object,\n required: PropTypes.bool,\n id: PropTypes.string,\n disabled: PropTypes.bool,\n multiple: PropTypes.bool,\n allowCreate: PropTypes.bool,\n className: PropTypes.string,\n meta: PropTypes.shape({ error: FieldError.propTypes.error }),\n};\n\nexport const TagParentsContext = createContext(null);\n\nfunction TagField({\n name,\n required,\n internal,\n disabled,\n id,\n appId,\n allowCreate = true,\n multiple = true,\n tagParents,\n}) {\n const field = (\n <Field\n component={SelectAdapter}\n name={name}\n required={required}\n disabled={disabled}\n normalize={normalizeValue}\n multiple={multiple}\n allowCreate={allowCreate}\n format={formatValue}\n id={id}\n props={{\n className: `${styles.Tag} property-${name}`,\n internal,\n }}\n />\n );\n if (appId) {\n console.warn(\n \"TagField appId prop is deprecated, \" +\n \"please use tagParents prop or TagParentsContext.Provider instead\",\n );\n return (\n <TagParentsContext.Provider value={[`app:${appId}`]}>\n {field}\n </TagParentsContext.Provider>\n );\n }\n\n if (tagParents) {\n return (\n <TagParentsContext.Provider value={tagParents}>\n {field}\n </TagParentsContext.Provider>\n );\n }\n\n return field;\n}\nTagField.propTypes = {\n name: PropTypes.string.isRequired,\n tagParents: PropTypes.arrayOf(PropTypes.string),\n ...SelectAdapter.propTypes,\n};\n\nexport default TagField;\n","import React, { useCallback } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Field } from \"redux-form\";\n\nimport FieldError from \"components/appCreator/items/form/FieldError\";\nimport SimpleInput from \"components/appCreator/items/form/SimpleInput\";\nimport MarkdownEditor from \"components/shared/markdownEditor\";\n\nimport styles from \"./editFields.module.css\";\nimport { isPlainObject, isFunction } from \"lodash\";\n\nfunction MarkdownEditorAdapter({ input, meta, disabled, inputRef }) {\n const setComposerRefCallback = useCallback(\n (newRef) => {\n if (isFunction(inputRef)) inputRef(newRef);\n else if (isPlainObject(inputRef)) inputRef.current = newRef;\n },\n [inputRef],\n );\n\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 readOnly={disabled}\n setComposerRefCallback={setComposerRefCallback}\n />\n {meta.error && <FieldError error={meta.error} />}\n </div>\n );\n}\n\nMarkdownEditorAdapter.propTypes = {\n input: PropTypes.shape({\n onChange: PropTypes.func,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n value: PropTypes.string,\n name: PropTypes.string,\n }),\n meta: PropTypes.shape(FieldError.propTypes),\n disabled: PropTypes.bool,\n id: PropTypes.string,\n inputRef: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.shape({ current: PropTypes.any }),\n ]),\n};\n\nfunction TextField({\n name,\n required,\n multiline,\n disabled,\n id,\n autoFocus,\n inputRef,\n maxlength,\n}) {\n const props = multiline\n ? {\n component: MarkdownEditorAdapter,\n inputRef: inputRef,\n }\n : { component: SimpleInput, ref: inputRef };\n\n return (\n <Field\n id={id}\n type=\"text\"\n className={`property-${name} form-input ${styles.Text}`}\n name={name}\n required={required}\n disabled={disabled}\n autoFocus={autoFocus}\n maxLength={maxlength}\n {...props}\n />\n );\n}\n\nTextField.propTypes = {\n name: PropTypes.string.isRequired,\n required: PropTypes.bool,\n multiline: PropTypes.bool,\n disabled: PropTypes.bool,\n id: PropTypes.string,\n autoFocus: PropTypes.bool,\n inputRef: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.shape({ current: PropTypes.any }),\n ]),\n maxlength: PropTypes.number,\n};\n\nexport default TextField;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport styles from \"./showFields.module.css\";\n\nfunction Headline({ property }) {\n return (\n <div className={styles.Headline}>\n {React.createElement(`h${property.size || \"3\"}`, null, property.label)}\n </div>\n );\n}\nHeadline.propTypes = {\n property: PropTypes.shape({\n label: PropTypes.string,\n size: PropTypes.number,\n }),\n};\n\nexport default Headline;\n","import React, { createContext, useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { get } from \"lodash\";\n\nimport GenericValueList from \"./helpers/GenericValueList\";\n\n// Don't link selection values by default\n// Provide url function via SelectionUrlContext if you want to link them\nexport function selectionFilterUrl() {\n return null;\n}\nexport const SelectionUrlContext = createContext(selectionFilterUrl);\n\nfunction MaybeLink({ href, children }) {\n return href ? <a href={href}>{children}</a> : children;\n}\nMaybeLink.propTypes = {\n href: PropTypes.string,\n children: PropTypes.node.isRequired,\n};\n\nfunction Selection({ displayValue, property }) {\n const selectionFilterUrl = useContext(SelectionUrlContext);\n\n return (\n <GenericValueList\n values={displayValue}\n component={(value) => (\n <MaybeLink href={selectionFilterUrl({ ...value, property })}>\n {get(value, [\"displayValue\"]) || get(value, [\"label\"]) || value}\n </MaybeLink>\n )}\n />\n );\n}\nSelection.propTypes = {\n displayValue: PropTypes.oneOfType([\n PropTypes.arrayOf(\n PropTypes.shape({ label: PropTypes.string, value: PropTypes.string }),\n ),\n PropTypes.arrayOf(PropTypes.string),\n ]),\n property: PropTypes.shape({\n name: PropTypes.string.isRequired,\n }),\n};\n\nexport default Selection;\n","import React, { createContext, useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { get } from \"lodash\";\nimport classnames from \"classnames\";\n\nimport { currentAppUrlSelector } from \"selectors/navigation\";\nimport GenericValueList from \"./helpers/GenericValueList\";\nimport { stringify } from \"query-string\";\nimport SharedTag from \"components/shared/Tag\";\n\nexport const tagFilterUrl = ({ name: q }) => `/search?${stringify({ q })}`;\nexport const TagUrlContext = createContext(tagFilterUrl);\n\nfunction Tag({ value, options, property }) {\n const tagUrl = useContext(TagUrlContext);\n const showAsLink = get(options, \"showAsLink\") || false;\n\n return (\n <GenericValueList\n values={value}\n listStyle=\"flex flex-col gap-2\"\n listItemStyle={classnames({ label: !showAsLink, link: showAsLink })}\n component={(tag) =>\n showAsLink ? (\n <a href={tagUrl({ ...tag, property })}>#{tag.name}</a>\n ) : (\n <SharedTag name={tag.name} href={tagUrl({ ...tag, property })} />\n )\n }\n />\n );\n}\n\nTag.propTypes = {\n value: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string,\n id: PropTypes.string,\n }),\n ),\n appUrl: PropTypes.string,\n options: PropTypes.shape({ showAsLink: PropTypes.bool }),\n property: PropTypes.shape({\n name: PropTypes.string.isRequired,\n }),\n};\n\nexport default connect((state) => ({\n appUrl: currentAppUrlSelector(state),\n}))(Tag);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\n// TODO Application.markdown escapes colored text\nfunction Text({ value, property = {} }) {\n return property.multiline ? (\n <div\n className=\"prose break-words\"\n dangerouslySetInnerHTML={{\n __html: Application.markdown(value),\n }}\n />\n ) : (\n <div className=\"truncate\">{value}</div>\n );\n}\n\nText.propTypes = {\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n property: PropTypes.shape({ multiline: PropTypes.bool }),\n};\nexport default Text;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map, castArray, compact, isEmpty } from \"lodash\";\nimport classnames from \"classnames\";\n\nfunction GenericValueList({ values, component, listItemStyle, listStyle }) {\n return (\n <ul\n className={classnames({\n [`${listStyle}`]: !isEmpty(listStyle),\n })}\n >\n {map(compact(castArray(values)), (val, i) => (\n <li key={val.id || i} className={listItemStyle || \"\"}>\n {component(val)}\n </li>\n ))}\n </ul>\n );\n}\n\nGenericValueList.propTypes = {\n values: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n component: PropTypes.func.isRequired,\n listItemStyle: PropTypes.string,\n listStyle: PropTypes.string,\n};\n\nexport default GenericValueList;\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faShare as faRegularShare,\n faSpinner as faRegularSpinner,\n faCalendarDay as faRegularCalendarDay,\n faFilter as faRegularFilter,\n faCircle as faRegularCircle,\n faTableCells as faRegularTableCells,\n faList as faRegularList,\n faCogs as faRegularCogs,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCaretLeft as faSolidCaretLeft,\n faCaretRight as faSolidCaretRight,\n faCircle as faSolidCircle,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport DropDown from \"components/shared/DropDown\";\nimport { ViewType } from \"components/appointments/useAppointmentView\";\nimport moment from \"moment\";\nimport { groupBy, includes, isEmpty, map, sortBy, find, compact } 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 hideActions?: 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 hideActions,\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 ? find(\n compact(calendars),\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={faRegularShare} 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={faSolidCaretLeft} />\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={faRegularSpinner} className=\"fa-spin\" />\n ) : (\n <FontAwesomeIcon icon={faRegularCalendarDay} 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={faSolidCaretRight} />\n </button>\n </div>\n\n <div className=\"order-2 sm:order-3\">\n {toggleExcludedCalendarIds && (\n <>\n <DropDown.Toggle\n active={!isEmpty(excludedCalendarIds)}\n title={I18n.t(\"js.calendars.overview.filter_calendars\")}\n disabled={!calendars || calendars.length === 0}\n icon={faRegularFilter}\n ></DropDown.Toggle>\n <CalendarFilterDropdown\n calendars={calendars || []}\n excludedCalendarIds={excludedCalendarIds || []}\n toggleExcludedCalendarIds={toggleExcludedCalendarIds}\n />\n </>\n )}\n {setViewType && (\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={faRegularTableCells} />\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={faRegularList} />\n </button>\n </div>\n )}\n {hideActions || (\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 <DropDown.Toggle />\n <DropDown className=\"dropdown-menu context-menu\">\n <DropDown.Item\n url=\"/calendars/manage\"\n icon={faRegularCogs}\n text={I18n.t(\"js.calendars.overview.headline.manage_calendars\")}\n />\n <DropDown.Item\n url=\"/calendars/subscribe\"\n icon={faRegularCalendarDay}\n text={I18n.t(\n \"js.calendars.overview.headline.calendar_subscribe\",\n )}\n />\n </DropDown>\n </div>\n )}\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 <DropDown.Item\n icon={!isEmpty(excludedCalendarIds) ? faRegularCircle : faSolidCircle}\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 <DropDown.Item\n key={calendar.id}\n icon={\n includes(excludedCalendarIds, calendar.id)\n ? faRegularCircle\n : faSolidCircle\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 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 { faComments } from \"@fortawesome/pro-regular-svg-icons\";\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 icon={faComments} className={\"fa-sm text-muted\"} />\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 hideActions,\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 if (hideActions) return;\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 {!hideActions && (\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 )}\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 let 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 if (appointment.unknown_calendars) {\n markers = markers.concat(\n map(appointment.unknown_calendars, \"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, hideActions }) {\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 hideActions={hideActions}\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 { 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\nfunction useTranslation(\n targetLanguage: string | undefined,\n contentType: string,\n contentId: string | undefined,\n) {\n return useQuery(\n `/translations/${targetLanguage}/${contentType}/${contentId}`,\n {\n enabled: !!(targetLanguage && contentId),\n refetchOnWindowFocus: false,\n },\n );\n}\n\nexport function useAppointment<T = Appointment>(\n id?: string,\n translateTo?: string,\n) {\n const url = `/appointments/${id}`;\n\n const { data, ...rest } = useQuery<T>(url, {\n enabled: !!id,\n refetchOnWindowFocus: false,\n });\n\n const { data: translated } = useTranslation(translateTo, \"appointment\", id);\n\n return {\n data: data && translated ? { ...data, ...translated } : data,\n ...rest,\n };\n}\n\nexport function useCalendars(groupSlug: string = \"\") {\n return useQuery<Calendar[]>(\n `${groupSlug ? `/groups/${groupSlug}` : \"\"}/calendars`,\n {\n refetchOnWindowFocus: false,\n },\n );\n}\n\nexport function createAppointment(body) {\n return fetchApi(`/appointments`, {\n method: \"POST\",\n body,\n });\n}\nexport function useCreateAppointment(options) {\n return useMutation(createAppointment, options);\n}\n\nexport function updateAppointment({ appointmentId, ...body }) {\n return fetchApi(`/appointments/${appointmentId}`, {\n method: \"PUT\",\n body,\n });\n}\nexport function useUpdateAppointment(options) {\n return useMutation(updateAppointment, options);\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faArrowsRepeat, faClock } from \"@fortawesome/pro-regular-svg-icons\";\nimport { isSameDay } from \"date-fns\";\n\nimport {\n AppointmentDate as AppointmentDateType,\n Appointment,\n} from \"../../../@types/appointments\";\nimport formatDate from \"helpers/formatDate\";\nimport { TZDate } from \"@date-fns/tz\";\n\ntype AppointmentDateArgs = {\n date: AppointmentDateType;\n isRecurring?: boolean;\n recurrence_pattern?: Appointment[\"recurrence_pattern\"];\n next_occurrence_url?: string;\n next_occurrence_date?: string;\n};\n\nexport function useAppointmentDate(date: AppointmentDateType) {\n const appointmentStart = new Date(date.start);\n const appointmentEnd = date.end ? new Date(date.end) : null;\n const formattedStart = formatDate(\n appointmentStart,\n date.all_day ? \"PPPP\" : I18n.t(\"js.time.formats.date_fns.long_datetime\"),\n );\n\n const formattedEnd = appointmentEnd\n ? isSameDay(appointmentStart, appointmentEnd)\n ? formatDate(appointmentEnd, \"HH:mm\")\n : formatDate(\n appointmentEnd,\n date.all_day\n ? \"PPPP\"\n : I18n.t(\"js.time.formats.date_fns.long_datetime\"),\n )\n : null;\n\n return { appointmentStart, appointmentEnd, formattedStart, formattedEnd };\n}\n\nexport default function AppointmentDate({\n date,\n isRecurring = false,\n recurrence_pattern,\n next_occurrence_url,\n next_occurrence_date,\n}: AppointmentDateArgs) {\n const { appointmentStart, appointmentEnd, formattedStart, formattedEnd } =\n useAppointmentDate(date);\n\n function FormattedTimeZone() {\n return (\n <div>\n <span className=\"timezone text-muted\">{`${date.time_zone\n ?.replace(/\\//g, \", \")\n .replace(/_/g, \" \")} (${formatDate(\n appointmentStart,\n \"z\",\n )} UTC${formatDate(appointmentStart, \"xxxxx\")})`}</span>\n </div>\n );\n }\n\n return (\n <>\n {isRecurring && (\n <div className=\"detail-date detail-block flex gap-2\">\n <FontAwesomeIcon icon={faArrowsRepeat} className=\"detail-icon\" />\n <div className=\"flex flex-col\">\n <div>\n {I18n.t(\"js.calendars.recurring_appointment.starts_at\") +\n \" \" +\n formatDate(appointmentStart, \"PPPP\")}\n </div>\n <div>\n {recurrence_pattern?.recurrence_end_time\n ? I18n.t(\"js.calendars.recurring_appointment.ends_at\") +\n \" \" +\n formatDate(\n new TZDate(\n recurrence_pattern.recurrence_end_time,\n date.time_zone,\n ),\n \"PPPP\",\n )\n : I18n.t(\"js.calendars.recurring_appointment.no_end\")}\n </div>\n <div>\n {I18n.t(\"js.calendars.recurring_appointment.frequency\") +\n \" \" +\n (recurrence_pattern?.recurrence_interval === 1\n ? I18n.t(\n `js.calendars.appointment.recurrence-pattern.frequency.${recurrence_pattern.recurrence_frequency}`,\n )\n : I18n.t(\n \"js.calendars.appointment.recurrence-pattern.custom.frequency.label\",\n {\n interval: recurrence_pattern?.recurrence_interval,\n frequency: I18n.t(\n `js.calendars.appointment.recurrence-pattern.custom_frequency.${recurrence_pattern?.recurrence_frequency}`,\n ),\n },\n ))}\n </div>\n </div>\n </div>\n )}\n <div className=\"detail-date detail-block flex gap-2\">\n <FontAwesomeIcon icon={faClock} className=\"detail-icon\" />\n <div className=\"flex flex-col\">\n {isRecurring &&\n I18n.t(\"js.calendars.recurring_appointment.first_occurrence\")}\n {appointmentEnd && isSameDay(appointmentStart, appointmentEnd) ? (\n <>\n <div\n dangerouslySetInnerHTML={{\n __html: I18n.t(\n \"js.calendars.date_range.formatted_start_and_end_same_day_html\",\n {\n start_date: formatDate(appointmentStart, \"PPPP\"),\n start_time: formatDate(appointmentStart, \"HH:mm\"),\n end: formatDate(appointmentEnd, \"HH:mm\"),\n },\n ),\n }}\n />\n {!date.all_day && <FormattedTimeZone />}\n </>\n ) : (\n <div>\n {`${I18n.t(\"js.calendars.date_range.start\")}: `}\n <time className=\"font-semibold\">{formattedStart}</time>\n {formattedEnd && (\n <div>\n {`${I18n.t(\"js.calendars.date_range.end\")}: `}\n <time className=\"font-semibold\">{formattedEnd}</time>\n </div>\n )}\n {!date.all_day && <FormattedTimeZone />}\n {isRecurring && (\n <p>\n <b>\n {I18n.t(\n \"js.calendars.recurring_appointment.next_occurrence\",\n )}{\" \"}\n </b>\n {next_occurrence_url && next_occurrence_date ? (\n <a href={next_occurrence_url}>\n {formatDate(\n new Date(next_occurrence_date),\n I18n.t(\"js.time.formats.date_fns.long_datetime\"),\n )}\n </a>\n ) : (\n I18n.t(\n \"js.calendars.recurring_appointment.no_next_occurrence\",\n )\n )}\n </p>\n )}\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n","import { truncate } from \"lodash\";\nimport React, { useEffect, useState } from \"react\";\n\nexport default function AppointmentDescription({\n description,\n isRendered,\n translated,\n}: {\n description: string;\n isRendered: boolean;\n translated?: boolean;\n}) {\n const [truncateDescription, setTruncateDescription] = useState(true);\n\n const handleReadMore = (e) => {\n e.preventDefault();\n setTruncateDescription(false);\n };\n\n function truncateText(text: string) {\n return truncate(text, {\n length: 500,\n omission: `...<a href=\"#\" class=\"btn-link\" id=\"read-more-link\">${I18n.t(\n \"activitystreams.more\",\n )}</a>`,\n });\n }\n\n useEffect(() => {\n if (truncateDescription) {\n const link = document.getElementById(\"read-more-link\");\n if (link) {\n link.addEventListener(\"click\", handleReadMore as EventListener);\n }\n return () => {\n if (link) {\n link.removeEventListener(\"click\", handleReadMore as EventListener);\n }\n };\n }\n }, [truncateDescription, description]);\n\n const maybeTruncatedDescription = truncateDescription\n ? truncateText(description)\n : description;\n\n return (\n <>\n {isRendered ? (\n <div\n className=\"detail-description prose prose-sm\"\n dangerouslySetInnerHTML={{\n __html: maybeTruncatedDescription,\n }}\n />\n ) : (\n <p className=\"whitespace-pre overflow-auto\">\n {maybeTruncatedDescription}\n </p>\n )}\n {translated && (\n <span style={{ color: \"grey\", fontSize: \"x-small\" }}>(translated)</span>\n )}\n </>\n );\n}\n","import { isEmpty, pick, some, truncate, values } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faLocationDot } from \"@fortawesome/pro-regular-svg-icons\";\nimport React from \"react\";\nimport { Location } from \"../../../@types/appointments\";\n\nexport default function AppointmentLocation(\n location: Location & { showMap?: boolean },\n) {\n const locationIsExtended = some(\n [\"address1\", \"address2\", \"zip\", \"city\", \"link\", \"country\"],\n (key) => !isEmpty(location[key]),\n );\n\n function getLocationLinkText() {\n switch (location.meeting_link_type) {\n case \"ms_teams\":\n return \"Microsoft Teams Meeting\";\n case \"google_meet\":\n return \"Google Meet\";\n case \"zoom\":\n return \"Zoom Meeting\";\n default:\n return location.link && location.link?.length > 65\n ? truncate(location.link, { length: 65 })\n : location.link;\n }\n }\n\n const addressForUri = encodeURIComponent(\n values(\n pick(location, [\"address1\", \"address2\", \"zip\", \"city\", \"country\"]),\n ).join(\" \"),\n );\n\n return (\n <>\n {(!isEmpty(location.name) || locationIsExtended) && (\n <div className=\"detail-location detail-block flex gap-2\">\n <FontAwesomeIcon className=\"detail-icon\" icon={faLocationDot} />\n <address>\n <>\n {location.name && (\n <div className=\"font-bold\">{location.name}</div>\n )}\n {locationIsExtended && (\n <>\n {location.address1 && <div>{location.address1}</div>}\n {location.address2 && <div>{location.address2}</div>}\n {(location.zip || location.city) && (\n <div>{`${location.zip} ${location.city}`}</div>\n )}\n {location.country && <div>{location.country}</div>}\n {location.link && (\n <div>\n <a\n href={location.link}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n >\n {getLocationLinkText()}\n </a>\n </div>\n )}\n </>\n )}\n </>\n </address>\n </div>\n )}\n {location.maps_url && location.showMap && (\n <div className=\"detail-map\">\n <a\n href={`https://www.google.de/maps?q=${addressForUri}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <img src={location.maps_url} className=\"w-full\" />\n </a>\n </div>\n )}\n </>\n );\n}\n","import React from \"react\";\nimport {\n AppointmentDate as AppointmentDateType,\n AppointmentMeeting as AppointmentMeetingType,\n} from \"../../../@types/appointments\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faComments,\n faClone,\n faDesktop,\n faPlayCircle,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport useTooltip from \"../../../hooks/useTooltip\";\nimport { useAppointmentDate } from \"components/appointments/details/AppointmentDate\";\n\ntype AppointmentMeetingArgs = {\n date: AppointmentDateType;\n meeting: AppointmentMeetingType;\n appointmentName: string;\n canStartMeeting: boolean;\n appointmentId: string;\n};\n\nexport default function AppointmentMeeting({\n date,\n meeting,\n appointmentName,\n canStartMeeting,\n appointmentId,\n}: AppointmentMeetingArgs) {\n const tooltipRef = useTooltip<HTMLAnchorElement>();\n\n const { formattedStart, formattedEnd } = useAppointmentDate(date);\n\n const dateStr = formattedEnd\n ? `${formattedStart} - ${formattedEnd}`\n : formattedStart;\n\n function copyToClipboard() {\n navigator.clipboard\n .writeText(\n `${appointmentName}\\n${dateStr}\\n\\n${I18n.t(\n \"js.calendars.appointment.meeting.dial_in_number\",\n )} ${meeting.conference_call_phone_number}\\n${I18n.t(\n \"js.calendars.appointment.meeting.access_code\",\n )} ${meeting.conference_call_access_code}\\n${I18n.t(\n \"js.calendars.appointment.meeting.join_link\",\n )} ${meeting.join_url}\\n\\n${I18n.t(\n \"js.calendars.appointment.meeting.app_url\",\n )} ${meeting.app_url}`,\n )\n .then(() => {\n toastr.success(I18n.t(\"js.calendars.appointment.meeting.copied\"));\n })\n .catch(() => {\n toastr.error(I18n.t(\"js.generic_error\"));\n });\n }\n\n return (\n <div className=\"detail-meeting detail-block\">\n <div className=\"flex flex-row justify-between\">\n <div className=\"flex flex-row gap-2\">\n <FontAwesomeIcon className=\"detail-icon\" icon={faComments} />\n <strong>{I18n.t(\"js.calendars.appointment.meeting.label\")}</strong>\n <span className=\"room-name\">{meeting.room_name}</span>\n </div>\n <a\n ref={tooltipRef}\n data-bs-toggle=\"tooltip\"\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n copyToClipboard();\n }}\n className=\"copy-to-clipboard text-xl\"\n title={I18n.t(\"js.calendars.appointment.meeting.copy\")}\n >\n <FontAwesomeIcon icon={faClone} />\n </a>\n </div>\n <div className=\"flex flex-row mt-2 justify-evenly\">\n <div>\n <p className=\"text-center\">\n <a\n href={meeting.join_url}\n className=\"btn btn-primary\"\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n title={I18n.t(\"js.calendars.appointment.meeting.join_link\")}\n >\n <FontAwesomeIcon className=\"mr-2\" icon={faDesktop} />\n {I18n.t(\"js.calendars.appointment.meeting.join\")}\n </a>\n </p>\n {canStartMeeting && (\n <p className=\"text-center mt-2\">\n <a\n href={`${appointmentId}/start-meeting`}\n className=\"btn btn-light\"\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n title={I18n.t(\"js.calendars.appointment.meeting.start_link\")}\n data-method=\"post\"\n >\n <FontAwesomeIcon className=\"mr-2\" icon={faPlayCircle} />\n {I18n.t(\"js.calendars.appointment.meeting.start_link\")}\n </a>\n </p>\n )}\n </div>\n <div>\n <p>\n {I18n.t(\"js.calendars.appointment.meeting.dial_in_number\")}\n <br />\n <span>{meeting.conference_call_phone_number}</span>\n </p>\n <p>\n {I18n.t(\"js.calendars.appointment.meeting.access_code\")}\n <br />\n <span>{meeting.conference_call_access_code}</span>\n </p>\n </div>\n </div>\n </div>\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[] | undefined,\n date: string,\n) {\n if (!appointments) return {};\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 {\n useQuery,\n UseQueryResult,\n useMutation,\n UseMutationOptions,\n} from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { Blog } from \"components/blogs/types\";\n\nexport function useBlog(id: string | undefined): UseQueryResult<Blog> {\n return useQuery(`/blogs/${id}`, { enabled: !!id });\n}\n\nexport function useSaveBlog(\n blog: Blog,\n options:\n | Omit<\n UseMutationOptions<any, { message: string }, { blog: Blog }>,\n \"mutationFn\"\n >\n | undefined,\n) {\n return useMutation(\n (body: { blog: Blog }) =>\n fetchApi(`/blogs/${blog.id}`, { method: \"PUT\", body }),\n options,\n );\n}\n","import { useMutation, UseMutationOptions, useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport queryClient from \"helpers/queryClient\";\nimport { SimpleMembership } from \"../../@types\";\nimport { ColorObject } from \"components/administration/designManager/types\";\nimport { stringify } from \"query-string\";\nimport { Article } from \"components/articles/types\";\n\ntype ChannelPayload = {\n id: string;\n slug: string;\n title: string;\n description: string;\n image: {\n id: string;\n name: string;\n content_type: string;\n image_url: string;\n small_thumb: string;\n large_thumb: string;\n size: number;\n extension: string;\n type: string;\n } | null;\n status: string;\n i: {\n can: { [rule: string]: boolean | undefined };\n subscribed: boolean;\n favorited: boolean;\n };\n blog_id: string;\n design: ChannelDesign | null;\n};\n\nexport type ChannelDesign = {\n colors: {\n [name: string]: ColorObject | undefined;\n };\n derivedColors?: {\n [name: string]: ColorObject | undefined;\n } | null;\n};\n\nexport function useChannels() {\n return useQuery<{\n start_page: ChannelPayload[];\n subscribed: ChannelPayload[];\n recent: ChannelPayload[];\n popular: ChannelPayload[];\n }>(\"/channels\", {\n refetchOnWindowFocus: false,\n initialData: { start_page: [], subscribed: [], recent: [], popular: [] },\n });\n}\n\nexport function useChannel(slug: string | undefined) {\n return useQuery<ChannelPayload>(`/channels/${slug}`, {\n enabled: !!slug && slug !== \"new\",\n refetchOnWindowFocus: false,\n });\n}\n\nexport function updateChannelFavorited(slug, favorited) {\n const channel = queryClient.getQueryData<ChannelPayload>(`/channels/${slug}`);\n if (!channel) return;\n\n queryClient.setQueryData(`/channels/${slug}`, {\n ...channel,\n i: { ...channel.i, favorited },\n });\n}\n\nexport function updateChannelSubscription(slug: string, subscribed: boolean) {\n const channel = queryClient.getQueryData<ChannelPayload>(`/channels/${slug}`);\n if (!channel) return;\n\n queryClient.setQueryData(`/channels/${slug}`, {\n ...channel,\n i: { ...channel.i, subscribed },\n });\n}\n\ntype WidgetPayload = {\n type: string;\n name: string;\n title: string;\n title_background_override: null | string;\n label: null | \"current\" | \"spotlight\" | \"important\";\n hide_title?: boolean;\n};\n\nexport type LoadedWidgetPayload = WidgetPayload & {\n id: string;\n author: SimpleMembership;\n created_at: string;\n images?: { id: string }[];\n};\n\nexport const useWidgets = ({ channelSlug }: { channelSlug?: string }) =>\n useQuery<LoadedWidgetPayload[]>(`/channels/${channelSlug}/widgets`, {\n refetchOnWindowFocus: false,\n enabled: !!channelSlug,\n });\n\nexport const useWidget = ({\n channelSlug,\n widgetId,\n}: {\n channelSlug?: string;\n widgetId?: string;\n}) =>\n useQuery<LoadedWidgetPayload>(\n `/channels/${channelSlug}/widgets/${widgetId}`,\n {\n refetchOnWindowFocus: false,\n enabled: !!widgetId && !!channelSlug,\n },\n );\n\nexport const useDeleteWidget = (\n channelSlug: string,\n options?: UseMutationOptions<void, { message: string }, string>,\n) =>\n useMutation((widgetId: string) => {\n return fetchApi(`/channels/${channelSlug}/widgets/${widgetId}/`, {\n method: \"DELETE\",\n });\n }, options);\n\nexport function persistWidget(\n channelSlug: string,\n widgetId: string | undefined,\n body: WidgetPayload,\n) {\n return fetchApi(\n `/channels/${channelSlug}/widgets${widgetId ? `/${widgetId}` : \"\"}`,\n { method: widgetId ? \"PUT\" : \"POST\", body },\n );\n}\nexport const usePersistWidget = (\n {\n channelSlug,\n widgetId,\n }: {\n channelSlug: string;\n widgetId?: string;\n },\n options?: Omit<\n UseMutationOptions<any, { message: string }, WidgetPayload, unknown>,\n \"mutationFn\"\n >,\n) =>\n useMutation(\n (body: WidgetPayload) => persistWidget(channelSlug, widgetId, body),\n options,\n );\n\ntype ArticlesPayload = {\n total: number;\n articles: Article[];\n};\n\nexport function useArticles(\n channelSlug?: string,\n currentPage?: number,\n extraQuery?: { omitDraft?: boolean },\n) {\n return useQuery<ArticlesPayload>(\n `/channels/${channelSlug}/blog/articles?${stringify({\n page: currentPage,\n ...extraQuery,\n })}`,\n {\n enabled: !!channelSlug,\n },\n );\n}\n","import React from \"react\";\nimport { useParams, useRoutes } from \"helpers/tixxt-router\";\nimport { ColorObject } from \"components/administration/designManager/types\";\nimport { useChannel } from \"components/channels/api\";\nimport { createPortal } from \"react-dom\";\nimport { map } from \"lodash\";\nimport { colorObjToCSSProperties } from \"components/administration/designManager/themeToCss\";\n\nconst routes = [\n { path: \"/channels/:channelSlug\", element: <ChannelOverride /> },\n { path: \"/channels/:channelSlug/*\", element: <ChannelOverride /> },\n { path: \"/channels/:channelSlug/design/edit\", element: <NoChannel /> },\n { path: \"*\", element: <NoChannel /> },\n];\n\nexport default function ApplyOverrideChannelTheme() {\n const element = useRoutes(routes);\n\n return element;\n}\n\nfunction ChannelOverride() {\n const { channelSlug } = useParams();\n const { data: channel } = useChannel(channelSlug);\n\n if (channel?.design) {\n const css = channelDesignToCss(channel.design);\n\n return createPortal(<style>{css}</style>, document.head);\n }\n\n return null;\n}\n\nfunction NoChannel() {\n return null;\n}\n\nexport function channelDesignToCss(theme: {\n derivedColors?: {\n [name: string]: ColorObject | undefined;\n } | null;\n}) {\n const { derivedColors } = theme;\n const cssContent: string[] = [];\n\n cssContent.push(\":root {\");\n\n for (const variable in derivedColors) {\n if (variable.indexOf(\"channel-\") != 0) continue;\n\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 return cssContent.join(\"\\n\");\n}\n","import { LayoutType } from \"components/channels/types\";\n\n// class helpers\n\nexport function getWidgetContentHeight(w: number) {\n return (\n {\n 1: \"h-[21rem]\",\n 2: \"h-[42rem]\",\n 3: \"h-[63rem]\",\n }[w] + \" sm:h-[21rem]\"\n );\n}\n\nexport function getWidgetContentColumns(w: number) {\n return {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n }[w];\n}\n\nexport function getWidgetWidthByType(type: LayoutType) {\n return {\n full: [\"w-full\"],\n \"half-1-2\": [\"w-1/3\", \"w-2/3\"],\n \"half-2-1\": [\"w-2/3\", \"w-1/3\"],\n third: [\"w-1/3\", \"w-1/3\", \"w-1/3\"],\n }[type];\n}\n\nexport function getWidgetColspan(w: number) {\n return {\n 1: \"sm:col-span-1\",\n 2: \"sm:col-span-2\",\n 3: \"sm:col-span-3\",\n }[w];\n}\n\nexport function getWidgetContainerResponsiveHeight(w: number) {\n return (\n {\n 1: \"max-sm:h-[24rem]\",\n 2: \"max-sm:h-[48rem]\",\n 3: \"max-sm:h-[72rem]\",\n }[w] + \" sm:h-[24rem]\"\n );\n}\n\n// type helpers\n\nexport function getWidgetColspanType(type: LayoutType) {\n return {\n full: [\"colspan3\"],\n \"half-1-2\": [\"col1\", \"colspan2\"],\n \"half-2-1\": [\"colspan2\", \"col1\"],\n third: [\"col1\", \"col2\", \"col3\"],\n }[type];\n}\n\nexport function getWidgetColumnIndex(type: LayoutType, colspan: string) {\n return {\n full: { colspan3: 0 },\n \"half-1-2\": { col1: 0, colspan2: 1 },\n \"half-2-1\": { colspan2: 0, col1: 1 },\n third: { col1: 0, col2: 1, col3: 2 },\n }[type][colspan];\n}\n","import { useMutation, useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { LayoutRow, LayoutType } from \"components/channels/types\";\n\ntype LayoutRowParams = {\n id: string;\n type: LayoutType;\n widget_ids: (string | null)[];\n};\n\ntype LayoutResponse = {\n rows: LayoutRow[];\n};\n\nexport function useChannelLayout(channelSlug: string | undefined) {\n return useQuery<LayoutResponse>(`/channels/${channelSlug}/layout`, {\n enabled: !!channelSlug,\n });\n}\n\nexport function useUpdateChannelLayout(channelSlug: string) {\n return useMutation<LayoutResponse, Error, LayoutRowParams[]>((newItems) =>\n fetchApi(`/channels/${channelSlug}/layout`, {\n method: \"PUT\",\n body: { rows: newItems },\n }),\n );\n}\n","import { chunk } from \"lodash\";\n\nexport function smartChunk<T>(\n whatever: T[],\n limitPerCol: number,\n numberCols: number,\n): T[][] {\n const total = whatever.length;\n\n // Try all possible variants, depending on numberCols\n // i = number of columns to chunk\n for (let i = 0; i < numberCols; i++) {\n if (total <= numberCols - i + limitPerCol * i) {\n const out: T[][] = [];\n const standaloneCount = numberCols - i;\n // `Chunk ${total} into ${standaloneCount} standalone and ${i} chunked `,\n for (let j = 0; j < standaloneCount; j++) {\n // Standalone\n if (whatever[j]) out.push([whatever[j]]);\n }\n // Chunk remaining and concat\n return out.concat(\n chunk(whatever.slice(standaloneCount, total), limitPerCol),\n );\n }\n }\n\n return chunk(whatever, limitPerCol);\n}\n","import React, { useContext } from \"react\";\nimport { SimpleMembership } from \"../../../@types\";\nimport { WidgetContext } from \"components/channels/widgets/WidgetContainer\";\nimport { times } from \"lodash\";\nimport classNames from \"classnames\";\nimport { ProfileImage } from \"components/shared/SimpleMembershipShow\";\nimport { smartChunk } from \"components/channels/widgets/smartChunk\";\nimport { getWidgetContentColumns } from \"components/channels/helpers\";\n\nconst N_PER_COL = 3;\n\nexport default function PeopleWidget({\n memberships,\n profile_fields,\n}: {\n memberships?: (SimpleMembership & { profile: { [key: string]: string } })[];\n profile_fields?: string[];\n}) {\n const { w } = useContext(WidgetContext);\n\n const byColumn = memberships ? smartChunk(memberships, N_PER_COL, w) : [];\n\n return (\n <div\n className={classNames(\n \"grid gap-4 h-full grid-cols-1 divide-neutral max-sm:divide-y sm:divide-x\",\n getWidgetContentColumns(w),\n {\n \"grid-rows-3\": w == 3,\n \"grid-rows-2\": w == 2,\n \"grid-rows-1\": w == 1,\n },\n \"sm:grid-rows-1\",\n )}\n >\n {times(w, (n) => (\n <div\n className={classNames(\"px-4 grid grid-rows-3 gap-4 h-[21rem]\")}\n key={n}\n >\n {byColumn[n]?.map((membership) =>\n byColumn[n].length == 1 ? (\n <StandalonePerson\n key={membership.id}\n membership={membership}\n profile_fields={profile_fields}\n />\n ) : (\n <RowPerson\n key={membership.id}\n membership={membership}\n profile_fields={profile_fields}\n />\n ),\n )}\n </div>\n ))}\n </div>\n );\n}\n\ntype PersonProps = {\n membership: SimpleMembership & { profile: { [key: string]: string } };\n profile_fields?: string[];\n};\n\nfunction StandalonePerson({ membership, profile_fields }: PersonProps) {\n return (\n <div\n className={\"row-span-3 flex flex-col items-center justify-center\"}\n key={membership.id}\n >\n <ProfileImage\n membership={membership}\n size={128}\n className={\"w-24 h-24\"}\n />\n <a\n href={membership.html_url || \"#\"}\n className={\"font-semibold mt-6 leading-6\"}\n >\n {membership.name}\n </a>\n {profile_fields?.map((f) => (\n <span key={f} className={\"text-sm leading-6\"}>\n {membership.profile[f]}\n </span>\n ))}\n </div>\n );\n}\n\nfunction RowPerson({ membership, profile_fields }: PersonProps) {\n return (\n <div className={\"grow flex gap-2 items-center h-full\"} key={membership.id}>\n <div>\n <ProfileImage\n membership={membership}\n size={80}\n className={\"w-10 h-10\"}\n />\n </div>\n <div className={\"flex flex-col leading-tight\"}>\n <a href={membership.html_url || \"#\"} className={\"font-semibold\"}>\n {membership.name}\n </a>\n {profile_fields?.map((f) => (\n <span key={f} className={\"text-sm\"}>\n {membership.profile[f]}\n </span>\n ))}\n </div>\n </div>\n );\n}\n","import React, { useContext } from \"react\";\nimport { WidgetContext } from \"components/channels/widgets/WidgetContainer\";\nimport { times } from \"lodash\";\nimport classNames from \"classnames\";\nimport { smartChunk } from \"components/channels/widgets/smartChunk\";\nimport Loading from \"components/shared/Loading\";\nimport { getWidgetContentColumns } from \"components/channels/helpers\";\nimport { useParams } from \"helpers/tixxt-router\";\n\nconst N_PER_COL = 4;\n\nexport default function ImagesWidget({\n id,\n images,\n}: {\n id?: string;\n images?: { id: string }[];\n}) {\n const { w } = useContext(WidgetContext);\n const params = useParams();\n\n const byColumn = images ? smartChunk(images, N_PER_COL, w) : [];\n const hiddenCount = images ? images.length - w * N_PER_COL : 0;\n\n return (\n <div\n className={classNames(\n \"grid gap-1 overflow-hidden grid-cols-1 rounded-bl rounded-br\",\n getWidgetContentColumns(w),\n )}\n >\n {times(w, (n) => {\n const layout =\n byColumn[n]?.length > 2 ? 4 : byColumn[n]?.length == 2 ? 2 : 1;\n\n return (\n <div\n key={n}\n className={`grid gap-1 overflow-hidden images-widget--${layout}`}\n >\n {byColumn[n]?.map((image, m) => {\n const hasHidden = hiddenCount > 0 && n == w - 1 && m == 3;\n return (\n <div\n key={m}\n className={classNames({ \"relative group\": hasHidden })}\n >\n {image.id ? (\n <a\n href={`/channels/${params.channelSlug}/widgets/${id}`}\n className={\n \"flex overflow-hidden items-center justify-center w-full h-full\"\n }\n >\n <img\n alt=\"\"\n aria-hidden\n src={`/api/storage/images/${image.id}/get/435x435`}\n className={classNames(\n \"w-full h-full object-cover object-center transition hover:scale-110\",\n {\n \"grayscale blur-sm group-hover:blur-none group-hover:scale-110\":\n hasHidden,\n },\n )}\n />\n </a>\n ) : (\n <Loading />\n )}\n {hasHidden && (\n <a\n href={`/channels/${params.channelSlug}/widgets/${id}`}\n className={\n \"absolute inset-0 flex justify-center items-center gap-1 \" +\n \"text-white text-5xl font-bold hover:text-white hover:no-underline \" +\n \"backdrop-brightness-50 hover:backdrop-brightness-75 transition\"\n }\n >\n <span>+</span>\n <span>{hiddenCount}</span>\n </a>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}\n","import React from \"react\";\n\nexport default function BannerWidget({\n image,\n title,\n banner_background_color,\n hide_title,\n banner_title_color,\n}: {\n id?: string;\n image?: { id: string; state: string };\n banner_background_color: string;\n banner_title_color: string;\n title: string;\n hide_title?: boolean;\n}) {\n return (\n <div\n className=\"w-full bg-cover bg-center flex flex-col justify-end rounded h-[24rem]\"\n title={title}\n style={\n image?.id && image?.state !== \"removed\"\n ? {\n backgroundImage: `url(\"/api/storage/images/${image.id}/get/1920x1200\")`,\n }\n : { backgroundColor: banner_background_color }\n }\n >\n {title && !hide_title && (\n <div\n className=\"flex text-4xl font-bold text-center p-4\"\n style={{ color: banner_title_color }}\n >\n {title}\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nexport default function TextWidget({ html_content }: { html_content: string }) {\n return (\n <div\n className=\"widget text-widget p-4 overflow-hidden\"\n dangerouslySetInnerHTML={{ __html: html_content }}\n />\n );\n}\n","import React, { useContext } from \"react\";\n\ntype RssItem = {\n title: string;\n url: string;\n};\n\ntype RssData = {\n headline: string;\n items: RssItem[];\n};\n\ntype Props = {\n id?: string;\n preview_data?: RssData;\n};\n\nimport { WidgetContext } from \"components/channels/widgets/WidgetContainer\";\nimport { chunk } from \"lodash\";\nimport classNames from \"classnames\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { useQuery } from \"react-query\";\n\nexport default function ChannelRssWidget({ id, preview_data }: Props) {\n const params = useParams();\n const { data } = useQuery<{ rss_data: RssData }>(\n `/channels/${params.channelSlug}/widgets/${id}`,\n {\n enabled: !!id,\n },\n );\n const rss_data = data?.rss_data || preview_data;\n const { w } = useContext(WidgetContext);\n const maxItems: number = w * 4;\n const limitedItems: RssItem[] = rss_data?.items.slice(0, maxItems) || [];\n const itemsPerColumn: number = Math.ceil(limitedItems.length / w);\n const itemsByColumn: RssItem[][] = chunk(limitedItems, itemsPerColumn);\n\n return (\n <>\n {rss_data && (\n <div className=\"widget rss-widget\">\n <div\n className={classNames(\"grid divide-x gap-4\", {\n \"grid-cols-1\": w === 1,\n \"grid-cols-2\": w === 2,\n \"grid-cols-3\": w === 3,\n })}\n >\n {itemsByColumn.map((columnItems: RssItem[], n: number) => (\n <ul key={n} className=\"list-disc p-4 prose\">\n {columnItems.map((item: RssItem, index: number) => (\n <li key={index} className=\"mx-4\">\n <a\n href={item.url}\n title={item.title}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"line-clamp-2 no-underline hover:underline\"\n >\n {item.title}\n </a>\n </li>\n ))}\n </ul>\n ))}\n </div>\n </div>\n )}\n </>\n );\n}\n","import React, { useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faCircleChevronLeft as faSolidCircleChevronLeft,\n faCircleChevronRight as faSolidCircleChevronRight,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { map } from \"lodash\";\nimport classNames from \"classnames\";\n\ntype ItemCarouselArgs = {\n children: React.ReactNode[] | React.ReactNode;\n visibleItemsCount: number;\n containerWidth: number;\n containerHeight: string;\n totalItems: number;\n navigationButtonsStyle?: React.CSSProperties;\n};\n\nexport default function ItemCarousel({\n children,\n visibleItemsCount,\n containerWidth,\n totalItems,\n containerHeight,\n navigationButtonsStyle,\n}: ItemCarouselArgs) {\n const [currentIndex, setCurrentIndex] = useState(0);\n const maxIndex = Math.max(0, Math.ceil(totalItems / visibleItemsCount) - 1);\n\n const handlePrev = () => {\n setCurrentIndex((prev) => Math.max(0, prev - 1));\n };\n\n const handleNext = () => {\n setCurrentIndex((prev) => Math.min(maxIndex, prev + 1));\n };\n\n const totalGap = 8 * visibleItemsCount; // gap-2 is 8px\n const itemPercent = 100 / visibleItemsCount;\n const gapPerItem = (8 / visibleItemsCount) * (visibleItemsCount - 1);\n const translateAmount =\n currentIndex * (containerWidth + (totalGap - 8 * (visibleItemsCount - 1)));\n\n return (\n <div style={{ width: containerWidth }}>\n <div className={classNames(\"carousel__container\", containerHeight)}>\n {currentIndex > 0 && (\n <button\n onClick={handlePrev}\n className=\"carousel__button--prev\"\n style={navigationButtonsStyle}\n >\n <FontAwesomeIcon icon={faSolidCircleChevronLeft} size=\"2xl\" />\n </button>\n )}\n {currentIndex < maxIndex && (\n <button\n onClick={handleNext}\n className=\"carousel__button--next\"\n style={navigationButtonsStyle}\n >\n <FontAwesomeIcon icon={faSolidCircleChevronRight} size=\"2xl\" />\n </button>\n )}\n\n <div\n className={classNames(\n \"carousel__content overflow-hidden\",\n containerHeight,\n )}\n >\n <div\n className=\"flex gap-2 transition-transform duration-1000 max-h-[21rem]\"\n style={{\n transform: `translateX(-${translateAmount}px)`,\n }}\n >\n {map(children as React.ReactNode[], (child, index) => (\n <div\n key={index}\n className={classNames(\n \"flex flex-col shrink-0\",\n containerHeight,\n )}\n style={{\n width: `calc(${itemPercent}% - ${gapPerItem}px)`,\n }}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { useEffect, useState } from \"react\";\n\nexport default function useContainerWidth(\n containerRef: React.RefObject<HTMLDivElement> | null,\n) {\n const [containerWidth, setContainerWidth] = useState(0);\n\n useEffect(() => {\n const resizeObserver = new ResizeObserver(() => {\n if (containerRef?.current) {\n const elementWidth =\n containerRef?.current.getBoundingClientRect().width;\n setContainerWidth(elementWidth);\n }\n });\n\n if (containerRef?.current) {\n resizeObserver.observe(containerRef?.current);\n }\n\n return () => {\n if (containerRef?.current) {\n resizeObserver.unobserve(containerRef?.current);\n }\n };\n }, []);\n\n return containerWidth;\n}\n","import React, { useContext } from \"react\";\nimport { WidgetContext } from \"components/channels/widgets/WidgetContainer\";\nimport { map } from \"lodash\";\nimport Loading from \"components/shared/Loading\";\nimport { Article } from \"components/articles/types\";\nimport formatDate from \"helpers/formatDate\";\nimport ItemCarousel from \"components/shared/ItemCarousel\";\nimport useContainerWidth from \"components/shared/hooks/useContainerWidth\";\n\nexport default function BlogWidget({\n latest_articles,\n title_background_override,\n}: {\n latest_articles: Article[];\n title_background_override: string;\n}) {\n const { w, containerRef } = useContext(WidgetContext);\n const containerWidth = useContainerWidth(containerRef);\n\n return latest_articles ? (\n <ItemCarousel\n containerWidth={containerWidth}\n visibleItemsCount={w}\n totalItems={latest_articles?.length || 12}\n containerHeight=\"h-[21rem]\"\n navigationButtonsStyle={\n title_background_override\n ? {\n color: title_background_override,\n }\n : undefined\n }\n >\n {map(latest_articles, (article, index) => (\n <React.Fragment key={index}>\n <a\n className=\"blog_widget__title block bg-cover bg-center w-full h-[11.5rem]\"\n href={`/blogs/${article.blog_id}/articles/${article.id}`}\n style={{\n backgroundImage: `url(\"${\n article.image_path\n ? article.image_path\n : Assets[\"blogs/article_placeholder.webp\"]\n }\")`,\n }}\n />\n <div className=\"grow\">\n <a\n className=\"text-lg font-bold p-3 line-clamp-3 text-ellipsis overflow-hidden pb-0 text-normal\"\n href={`/blogs/${article.blog_id}/articles/${article.id}`}\n >\n {article.title}\n </a>\n </div>\n {article.created_at && (\n <div className=\"text-sm text-muted p-3\">\n {formatDate(new Date(article.created_at), \"dd.MM.y\")}\n </div>\n )}\n </React.Fragment>\n ))}\n </ItemCarousel>\n ) : (\n <Loading />\n );\n}\n","import React, { useContext } from \"react\";\nimport { Appointment } from \"../../../@types/appointments\";\nimport { WidgetContext } from \"components/channels/widgets/WidgetContainer\";\nimport AppointmentDate from \"components/appointments/details/AppointmentDate\";\nimport AppointmentLocation from \"components/appointments/details/AppointmentLocation\";\nimport AppointmentMeeting from \"components/appointments/details/AppointmentMeeting\";\nimport { isEmpty } from \"lodash\";\nimport AppointmentDescription from \"components/appointments/details/AppointmentDescription\";\n\ntype AppointmentsWidgetProps = {\n appointment?: Appointment;\n};\n\nexport default function AppointmentsWidget({\n appointment,\n}: AppointmentsWidgetProps) {\n const { w } = useContext(WidgetContext);\n if (!appointment) return null;\n\n return (\n <div className=\"widget appointments-widget p-4 flex flex-col gap-4 overflow-hidden\">\n <div className=\"flex gap-8\">\n {w > 1 ? (\n <div className=\"overflow-hidden rounded-full self-start shrink-0 hidden sm:block\">\n <img\n className=\"object-cover object-center h-36 w-36\"\n src={\n appointment.event_image?.large_thumb ||\n Assets[\"appointments/event_image_default.jpg\"]\n }\n alt={\"\"}\n aria-hidden\n />\n </div>\n ) : null}\n <div className=\"grow flex flex-col gap-4 text-sm\">\n <h4 className=\"text-lg font-bold\">\n <a href={`/appointments/${appointment.id}`}>{appointment.name}</a>\n </h4>\n <AppointmentDate\n date={appointment.date}\n isRecurring={false} // @todo:\n recurrence_pattern={appointment.recurrence_pattern}\n next_occurrence_date={appointment.next_occurrence_date}\n next_occurrence_url={appointment.next_occurrence_url}\n />\n <AppointmentLocation {...appointment.location} showMap={false} />\n {appointment.meeting && appointment.meeting.join_url && (\n <AppointmentMeeting\n date={appointment.date}\n meeting={appointment.meeting}\n appointmentName={appointment.name}\n canStartMeeting={appointment.can.start_meeting}\n appointmentId={appointment.id}\n />\n )}\n </div>\n </div>\n <AppointmentDescription\n description={\n appointment.description_rendered || appointment.description\n }\n isRendered={!isEmpty(appointment.description_rendered)}\n translated={false}\n />\n </div>\n );\n}\n","import React, { useContext } from \"react\";\nimport { Article } from \"components/articles/types\";\nimport ItemCarousel from \"components/shared/ItemCarousel\";\nimport { WidgetContext } from \"components/channels/widgets/WidgetContainer\";\nimport { map } from \"lodash\";\nimport { useNavigate } from \"helpers/tixxt-router\";\nimport useContainerWidth from \"components/shared/hooks/useContainerWidth\";\n\nexport default function SpotlightWidget({\n articles,\n hide_title,\n label,\n title_background_override,\n}: {\n articles: Article[];\n label?: string | null;\n hide_title: boolean;\n title_background_override: string;\n}) {\n const navigate = useNavigate();\n const { containerRef } = useContext(WidgetContext);\n const containerWidth = useContainerWidth(containerRef);\n\n return (\n articles && (\n <ItemCarousel\n containerWidth={containerWidth}\n visibleItemsCount={1}\n totalItems={articles?.length}\n navigationButtonsStyle={\n title_background_override\n ? {\n color: title_background_override,\n }\n : undefined\n }\n containerHeight={hide_title ? \"h-[24rem]\" : \"h-[21rem]\"}\n >\n {map(articles, (article) => (\n <div\n key={article.id}\n className=\"w-full h-full bg-cover bg-center hover:cursor-pointer\"\n onClick={() =>\n navigate(`/blogs/${article.blog_id}/articles/${article.id}`)\n }\n style={{\n backgroundImage: `url(\"${\n article.image_path\n ? article.image_path\n : Assets[\"blogs/article_placeholder.webp\"]\n }\")`,\n }}\n >\n <div className=\"flex flex-col gap-2 z-50 w-full h-full justify-end px-14 pb-14 bg-gradient-to-t from-[#000000]/95 to-transparent\">\n {label && (\n <div>\n <span\n className={`widget__label widget__label--${label} font-medium`}\n >\n {I18n.t(`js.channels.widgets.labels.${label}`)}\n </span>\n </div>\n )}\n <span className=\"text-2xl font-bold text-white line-clamp-3 overflow-hidden text-ellipsis\">\n {article.title}\n </span>\n </div>\n </div>\n ))}\n </ItemCarousel>\n )\n );\n}\n","import classNames from \"classnames\";\nimport React, { useContext } from \"react\";\nimport { WidgetContext } from \"components/channels/widgets/WidgetContainer\";\nimport { getWidgetContentColumns } from \"components/channels/helpers\";\nimport FileIcon from \"components/shared/FileIcon\";\nimport FolderIcon from \"components/shared/FolderIcon\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCalendar } from \"@fortawesome/pro-regular-svg-icons\";\n\ntype ExternalLinkViewArgs = {\n image_url: string;\n url: string;\n title: string;\n description: string | null;\n type: string;\n};\n\nfunction getFileType(title: string): string {\n const extension = title.split(\".\").pop()?.toLowerCase();\n return extension || \"\";\n}\n\nexport default function LinkView({\n image_url,\n url,\n title,\n description,\n type,\n}: ExternalLinkViewArgs) {\n const { w } = useContext(WidgetContext);\n\n return (\n <div\n className={classNames(\n \"grid h-full grid-cols-1 grid-rows-1\",\n getWidgetContentColumns(w),\n )}\n >\n {w > 1 && (\n <div\n className=\"block bg-cover bg-center\"\n style={{\n backgroundImage: `url(\"${image_url}\")`,\n }}\n />\n )}\n <div\n className={classNames(\"flex flex-col p-3 gap-3\", {\n \"col-span-2\": w === 3,\n })}\n >\n <div className=\"flex gap-2 items-start\">\n {type === \"file\" && <FileIcon extension={getFileType(title)} />}\n {type === \"folder\" && <FolderIcon className=\"text-2xl\" />}\n {type === \"appointment\" && (\n <FontAwesomeIcon className=\"text-2xl\" icon={faCalendar} />\n )}\n <a className=\"font-medium\" href={url}>\n {title}\n </a>\n </div>\n <div className=\"h-full\">{description}</div>\n <a href={url}>\n <p className=\"text-muted text-sm overflow-hidden text-ellipsis pb-2\">\n {url}\n </p>\n </a>\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { EmbedLink } from \"components/channels/widgets/widgetsFields/linkWidget/types\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faToggleOff, faToggleOn } from \"@fortawesome/pro-solid-svg-icons\";\n\ntype EmbedLinkViewArgs = {\n embed: EmbedLink;\n image_url: string | null;\n secureEmbedServiceUrl?: string;\n};\n\nexport default function EmbedLinkView({\n embed,\n image_url,\n secureEmbedServiceUrl,\n}: EmbedLinkViewArgs) {\n const [showEmbed, setShowEmbed] = useState(false);\n\n return showEmbed ? (\n secureEmbedServiceUrl ? (\n <iframe\n className=\"border-none h-full w-full\"\n src={secureEmbedServiceUrl}\n allow=\"fullscreen\"\n />\n ) : (\n <div\n className=\"widget__link_embed h-full w-full\"\n dangerouslySetInnerHTML={{ __html: embed.html }}\n />\n )\n ) : (\n <div\n className=\"flex h-full w-full items-center justify-center bg-cover bg-center\"\n style={{\n gridTemplateAreas: \"stack\",\n backgroundImage: image_url ? `url(\"${image_url}\")` : \"none\",\n }}\n >\n {!image_url && embed.provider_icon && (\n <i className={classNames(\"provider-icon fa-5x\", embed.provider_icon)} />\n )}\n <div\n className=\"flex h-full w-full items-end\"\n style={{ gridArea: \"stack\" }}\n >\n <span\n className=\"p-3 font-medium justify-center items-center flex w-full gap-2 group toggle-embed-icon text-center bg-white/80 cursor-pointer\"\n onClick={(e) => {\n e.preventDefault();\n setShowEmbed(true);\n }}\n >\n <FontAwesomeIcon\n className=\"inline group-hover:hidden\"\n icon={faToggleOff}\n size=\"2xl\"\n />\n <FontAwesomeIcon\n className=\"hidden group-hover:inline\"\n icon={faToggleOn}\n size=\"2xl\"\n />\n {I18n.t(\"js.activitystreams.embed.show\")}\n </span>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { first, get, isEmpty } from \"lodash\";\nimport { CrawlerLink } from \"components/channels/widgets/widgetsFields/linkWidget/types\";\nimport LinkView from \"components/channels/widgets/widgetsFields/linkWidget/LinkView\";\nimport EmbedLinkView from \"components/channels/widgets/widgetsFields/linkWidget/EmbedLinkView\";\n\nfunction getImageAsset(type: string) {\n switch (type) {\n case \"activity\":\n return \"widgets/activity_placeholder.jpg\";\n case \"file\":\n case \"folder\":\n return \"widgets/file_placeholder.jpg\";\n case \"appointment\":\n return \"appointments/event_image_default.jpg\";\n default:\n return \"widgets/link_placeholder.jpg\";\n }\n}\n\ntype LinkWidgetArgs = {\n link?: CrawlerLink;\n url: string;\n selected_image: string | null;\n override_image: { id: string; state: string }[];\n override_description: string | null;\n};\n\nexport default function LinkWidget({\n url,\n selected_image,\n override_image,\n override_description,\n link,\n}: LinkWidgetArgs) {\n const type =\n link?.crawl_type ||\n (!isEmpty(link?.embed) && \"embed\") ||\n link?.id?.split(\"_\")[0] ||\n \"external_link\";\n\n return (\n link &&\n (!isEmpty(link.embed) ? (\n <EmbedLinkView\n embed={link.embed}\n secureEmbedServiceUrl={link.secure_embed_service_url}\n image_url={\n override_image\n ? `/api/storage/images/${get(\n first(override_image),\n \"id\",\n )}/get/1920x1200`\n : selected_image\n }\n />\n ) : (\n <LinkView\n image_url={`${\n override_image\n ? `/api/storage/images/${get(\n first(override_image),\n \"id\",\n )}/get/1920x1200`\n : selected_image\n ? selected_image\n : Assets[getImageAsset(type)]\n }`}\n url={url}\n title={link.title}\n type={type}\n description={\n !isEmpty(override_description)\n ? override_description\n : link.description\n }\n />\n ))\n );\n}\n","import React from \"react\";\nimport PeopleWidget from \"components/channels/widgets/PeopleWidget\";\nimport ImagesWidget from \"components/channels/widgets/ImagesWidget\";\nimport BannerWidget from \"components/channels/widgets/BannerWidget\";\nimport TextWidget from \"components/channels/widgets/TextWidget\";\nimport ChannelRssWidget from \"components/channels/widgets/RssWidget\";\nimport BlogWidget from \"components/channels/widgets/BlogWidget\";\nimport AppointmentsWidget from \"components/channels/widgets/AppointmentsWidget\";\nimport SpotlightWidget from \"components/channels/widgets/SpotlightWidget\";\nimport LinkWidget from \"components/channels/widgets/LinkWidget\";\n\ntype PeopleWidgetProps = Parameters<typeof PeopleWidget>[0];\ntype TextWidgetProps = Parameters<typeof TextWidget>[0];\ntype ImagesWidgetProps = Parameters<typeof ImagesWidget>[0];\ntype ChannelRsssWidgetProps = Parameters<typeof ChannelRssWidget>[0];\ntype BlogWidgetProps = Parameters<typeof BlogWidget>[0];\ntype AppointmentsWidgetProps = Parameters<typeof AppointmentsWidget>[0];\ntype SpotlightWidgetProps = Parameters<typeof SpotlightWidget>[0];\ntype BannerWidgetProps = Parameters<typeof BannerWidget>[0];\ntype LinkWidgetProps = Parameters<typeof LinkWidget>[0];\n\ntype WidgetProps =\n | ({ type: \"people\" } & PeopleWidgetProps)\n | ({ type: \"text\" } & TextWidgetProps)\n | ({ type: \"images\" } & ImagesWidgetProps)\n | ({ type: \"banner\" } & BannerWidgetProps)\n | ({ type: \"rss\" } & ChannelRsssWidgetProps)\n | ({ type: \"blog\" } & BlogWidgetProps)\n | ({ type: \"appointments\" } & AppointmentsWidgetProps)\n | ({ type: \"spotlight\" } & SpotlightWidgetProps)\n | ({ type: \"link\" } & LinkWidgetProps)\n | { type: string };\n\nexport default function WidgetByType({ type, ...props }: WidgetProps) {\n switch (type) {\n case \"people\": {\n const peopleProps = props as PeopleWidgetProps;\n return <PeopleWidget {...peopleProps} />;\n }\n case \"text\": {\n const textProps = props as TextWidgetProps;\n return <TextWidget {...textProps} />;\n }\n case \"images\": {\n const imagesProps = props as ImagesWidgetProps;\n return <ImagesWidget {...imagesProps} />;\n }\n case \"banner\": {\n const bannerProps = props as BannerWidgetProps;\n return <BannerWidget {...bannerProps} />;\n }\n case \"rss\": {\n const rssProps = props as ChannelRsssWidgetProps;\n return <ChannelRssWidget {...rssProps} />;\n }\n case \"blog\": {\n const blogProps = props as BlogWidgetProps;\n return <BlogWidget {...blogProps} />;\n }\n case \"appointments\": {\n const appointmentsWidgetProps = props as AppointmentsWidgetProps;\n return <AppointmentsWidget {...appointmentsWidgetProps} />;\n }\n case \"spotlight\": {\n const spotlightProps = props as SpotlightWidgetProps;\n return <SpotlightWidget {...spotlightProps} />;\n }\n case \"link\": {\n const linkProps = props as LinkWidgetProps;\n return <LinkWidget {...linkProps} />;\n }\n default:\n return window.Settings?.development ? (\n <div className={\"alert alert-info prose\"}>\n TODO Implement case for <code>{type}</code> in WidgetByTypes\n </div>\n ) : null;\n }\n}\n","import { memoize } from \"lodash\";\nimport { mostReadable } from \"@ctrl/tinycolor\";\n\nconst readableTextColor = memoize((bgColor: string): string | undefined => {\n const normalText = getComputedStyle(document.body).getPropertyValue(\n \"--normal-text\",\n );\n return mostReadable(bgColor, [normalText, \"white\"], {\n includeFallbackColors: true,\n })?.toHexString();\n});\n\nexport default readableTextColor;\n","import React, { createContext, CSSProperties, useRef } from \"react\";\nimport classNames from \"classnames\";\nimport \"./widgets.css\";\nimport readableTextColor from \"helpers/readableTextColor\";\nimport Loading from \"components/shared/Loading\";\nimport {\n getWidgetColspan,\n getWidgetContentHeight,\n getWidgetContainerResponsiveHeight,\n} from \"components/channels/helpers\";\n\ntype Props = {\n title: string;\n titleBackgroundOverride: string | null;\n className?: string;\n w: number; // number of colums this widget occupies (1-3)\n children?: React.ReactNode;\n loading?: boolean;\n contentClassName?: string;\n style?: CSSProperties;\n label?: null | \"current\" | \"spotlight\" | \"important\";\n collapseToSingleColumn?: boolean;\n singleRowOnly?: boolean;\n hideTitle?: boolean;\n};\n\nexport const WidgetContext = createContext<{\n w: number;\n containerRef: React.RefObject<HTMLDivElement> | null;\n}>({ w: 1, containerRef: null });\n\nexport default function WidgetContainer({\n title,\n titleBackgroundOverride,\n hideTitle = false,\n w,\n children,\n loading,\n className,\n contentClassName,\n style,\n label,\n collapseToSingleColumn,\n singleRowOnly,\n}: Props) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n if (collapseToSingleColumn && window.innerWidth < 640) w = 1;\n\n return (\n <WidgetContext.Provider value={{ w, containerRef }}>\n <div\n ref={containerRef}\n className={classNames(\n \"widget__container\",\n w && getWidgetColspan(w),\n w && getWidgetContainerResponsiveHeight(singleRowOnly ? 1 : w),\n className,\n )}\n style={style}\n >\n {!hideTitle && (\n <div\n className={\n \"widget__title flex items-center px-4 font-semibold text-sm rounded-tl rounded-tr gap-2\"\n }\n style={\n titleBackgroundOverride\n ? {\n backgroundColor: titleBackgroundOverride,\n color:\n readableTextColor(titleBackgroundOverride) ||\n \"var(--normal-text)\",\n }\n : undefined\n }\n >\n {label && (\n <span className={`widget__label widget__label--${label}`}>\n {I18n.t(`js.channels.widgets.labels.${label}`)}\n </span>\n )}\n <span>{title}</span>\n </div>\n )}\n <div\n className={classNames(\n \"widget__content rounded-bl rounded-br grid\",\n getWidgetContentHeight(w),\n contentClassName,\n )}\n >\n {loading ? <Loading /> : null}\n {children}\n </div>\n </div>\n </WidgetContext.Provider>\n );\n}\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 {\n faComment as faRegularComment,\n faXmark as faRegularXmark,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCircle as faSolidCircle,\n faEyeSlash as faSolidEyeSlash,\n} from \"@fortawesome/pro-solid-svg-icons\";\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 icon={faRegularComment} className={\"mr-1 text-primary\"} />\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={faSolidCircle}\n className={\"chat__status--online\"}\n />\n );\n\n case statusOption.busy:\n return (\n <FontAwesomeIcon\n icon={faSolidCircle}\n className={\"chat__status--busy\"}\n />\n );\n case statusOption.invisible:\n return (\n <FontAwesomeIcon\n icon={faSolidEyeSlash}\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={faRegularXmark} />\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 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 { faChevronRight } from \"@fortawesome/pro-regular-svg-icons\";\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={faChevronRight}\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, { useState } from \"react\";\nimport { map, get, isEmpty, groupBy } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinner, faSearch } from \"@fortawesome/pro-regular-svg-icons\";\nimport classNames from \"classnames\";\nimport { useQuery } from \"react-query\";\nimport { stringify } from \"query-string\";\n\nimport ChatHeader from \"../shared/ChatHeader\";\nimport GroupedItems from \"../shared/GroupedItems\";\nimport Tile from \"./Tile\";\nimport { BackToRootButton } from \"../shared/BackButton\";\n\nfunction useAvailableChats(q) {\n return useQuery(\n `/directory?${stringify({\n q,\n only_my_groups: true,\n only_chat_enabled: true,\n })}`,\n { refetchOnWindowFocus: false },\n );\n}\n\nconst getGroupCategoryName = (c) => get(c, [\"category\", \"plural_name\"]);\nconst categoryOrMemberType = (memberOrGroup) =>\n memberOrGroup.type === \"member\"\n ? \"member\"\n : getGroupCategoryName(memberOrGroup);\n\nexport default function NewChat() {\n const [query, setQuery] = useState(\"\");\n const { data, isLoading } = useAvailableChats(query);\n\n const { member, ...groupsByCategoryName } = groupBy(\n data?.entries,\n categoryOrMemberType,\n );\n\n function submitSearch(e) {\n e.preventDefault();\n setQuery(e.target.q.value);\n }\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={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={isLoading}\n >\n {isLoading ? (\n <FontAwesomeIcon className={\"fa-spin\"} icon={faSpinner} />\n ) : (\n <FontAwesomeIcon icon={faSearch} />\n )}\n </button>\n </div>\n </form>\n {isEmpty(member) || query.length === 0 ? 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","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 { faVolumeOff, faEllipsisH } from \"@fortawesome/pro-solid-svg-icons\";\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={faVolumeOff}\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={faEllipsisH} />\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 {\n faSpinner,\n faCheck,\n faCheckDouble,\n} from \"@fortawesome/pro-solid-svg-icons\";\n\nexport const getIcon = (deliveryStatus) => {\n switch (deliveryStatus) {\n case \"pushed\":\n return <FontAwesomeIcon icon={faSpinner} className=\"fa-sm fa-spin\" />;\n case \"persisted\":\n return <FontAwesomeIcon icon={faCheck} className=\"fa-sm\" />;\n case \"received\":\n return <FontAwesomeIcon icon={faCheckDouble} className=\"fa-sm\" />;\n case \"read\":\n return <FontAwesomeIcon icon={faCheckDouble} 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 { faPaperPlane } from \"@fortawesome/pro-solid-svg-icons\";\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={faPaperPlane} />\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 { faArrowLeft } from \"@fortawesome/pro-solid-svg-icons\";\n\nconst BackButton = ({ onClick, counter }) => (\n <button\n onClick={onClick}\n className=\"btn btn-light btn-sm backButton relative\"\n >\n <FontAwesomeIcon icon={faArrowLeft} />\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 { faUser, faUsers } from \"@fortawesome/pro-solid-svg-icons\";\n\nconst ICONS = {\n member: faUser,\n group: faUsers,\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 { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport React from \"react\";\nimport useTooltip from \"../../hooks/useTooltip\";\n\nexport default function DirectoryActionButton({\n disabled,\n icon,\n text,\n onClick,\n type,\n title,\n}: {\n icon: { icon: IconProp; className?: string };\n text: string;\n type?: \"primary\" | \"danger\";\n onClick?: () => void;\n disabled?: boolean;\n title?: string;\n}) {\n const tooltipRef = useTooltip<HTMLButtonElement>();\n return (\n <button\n ref={tooltipRef}\n className={classNames(\"btn btn-sm\", {\n \"btn-light\": !type,\n \"btn-primary\": type === \"primary\",\n \"btn-danger\": type === \"danger\",\n disabled: disabled,\n })}\n title={title}\n disabled={disabled}\n onClick={(e) => {\n e.preventDefault();\n onClick && onClick();\n }}\n >\n <FontAwesomeIcon\n className={classNames(\"mr-1\", icon.className)}\n icon={icon.icon}\n />\n {text}\n </button>\n );\n}\n","import React from \"react\";\nimport { ceil, toString } from \"lodash\";\nimport Pagination from \"components/shared/Pagination\";\nimport { setSearchParam } from \"helpers/tixxt-router\";\nimport PageLoading from \"components/shared/PageLoading\";\n\ntype DirectoryPaginationArgs = {\n currentPage: number;\n isLoading: boolean;\n pagination?: {\n total: number;\n page: number;\n per_page: number;\n };\n children: React.ReactNode;\n};\n\nexport default function DirectoryPagination({\n pagination,\n currentPage,\n isLoading,\n children,\n}: DirectoryPaginationArgs) {\n const PaginationComponent = () => (\n <div className=\"flex justify-end\">\n <Pagination\n page={currentPage}\n totalPages={pagination && ceil(pagination.total / pagination.per_page)}\n onPaginate={(page: number) => setSearchParam(\"page\", toString(page))}\n loading={isLoading}\n />\n </div>\n );\n\n if (pagination && pagination.total > 5000) {\n return <p>{I18n.t(\"js.directory.too_large_collection\")}</p>;\n }\n\n return (\n <>\n <PaginationComponent />\n {isLoading ? (\n <PageLoading />\n ) : (\n <div className=\"flex flex-col divide-y divide-neutral media-list\">\n {children}\n </div>\n )}\n <PaginationComponent />\n </>\n );\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { map } from \"lodash\";\nimport classNames from \"classnames\";\n\ntype DirectoryRowArgs = {\n title: string;\n url: string;\n imageUrl?: string;\n fallbackIcon?: IconProp;\n actions?: React.ReactNode;\n badges?: React.ReactNode;\n children?: React.ReactNode;\n titleIcons?: { icon: IconProp; title: string }[];\n};\n\nexport default function DirectoryRow({\n title,\n url,\n imageUrl,\n fallbackIcon,\n children,\n actions,\n badges,\n titleIcons,\n}: DirectoryRowArgs) {\n return (\n <div className=\"flex flex-col sm:flex-row flex-wrap py-3 gap-3\">\n <div className=\"flex gap-3 items-start\">\n <div className=\"w-16 h-16 flex-shrink-0 items-center justify-center\">\n {imageUrl ? (\n <img\n className=\"h-16 w-16 rounded-full object-cover\"\n src={imageUrl}\n alt={title}\n />\n ) : (\n fallbackIcon && (\n <div className=\"flex h-16 w-16 items-center align-middle justify-center border border-neutral border-solid border-1 rounded-full bg-neutral\">\n <FontAwesomeIcon\n className=\"max-h-16 max-w-16 text-white\"\n icon={fallbackIcon}\n size=\"2xl\"\n />\n </div>\n )\n )}\n </div>\n <div className=\"media-body grow\">\n <div className=\"flex flex-1 gap-2\">\n <div className=\"flex gap-1 items-center\">\n {titleIcons &&\n map(titleIcons, (icon, index) => (\n <FontAwesomeIcon\n key={index}\n icon={icon.icon}\n title={icon.title}\n />\n ))}\n <a className=\"media-heading font-medium\" href={url}>\n {title}\n </a>\n <div className=\"flex flex-wrap gap-2\">{badges && badges}</div>\n </div>\n </div>\n {children}\n </div>\n </div>\n {actions && (\n <div className=\"flex sm:justify-end items-center flex-grow\">\n <div\n className={classNames(\n \"max-sm:flex max-sm:flex-wrap max-sm:gap-2 max-sm:[&>*]:w-full max-sm:w-full\",\n { \"btn-group\": window.innerWidth > 640 },\n )}\n >\n {actions}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport React from \"react\";\n\ntype BadgeArgs = {\n tooltipTitle: string;\n title: string;\n className?: string;\n icon?: IconProp;\n style?: { [key: string]: string };\n};\n\nexport default function DirectoryRowBadge({\n tooltipTitle,\n title,\n icon,\n className,\n style,\n}: BadgeArgs) {\n return (\n <span\n className={classNames(\"badge self-center\", className)}\n data-bs-toggle=\"tooltip\"\n title={tooltipTitle}\n style={style}\n >\n {icon && <FontAwesomeIcon className=\"mr-1\" icon={icon} />}\n {title}\n </span>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { range, map, isString } from \"lodash\";\nimport classnames from \"classnames\";\n\nconst FILTER = map(range(65, 91), (charCode) => String.fromCharCode(charCode));\n\ntype GlossaryArgs = {\n onSelect: (letter: string) => void;\n selectedLetter?: string;\n};\n\nexport default function Glossary({ onSelect, selectedLetter }: GlossaryArgs) {\n const [selected, setSelected] = useState(selectedLetter || \"\");\n\n function select(\n e: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n filter: string,\n ) {\n e.preventDefault();\n setSelected(filter);\n onSelect(filter);\n }\n\n useEffect(() => {\n isString(selectedLetter) && setSelected(selectedLetter);\n }, [selectedLetter]);\n\n return (\n <div className=\"row glossaryWrapper\">\n <div className=\"span12\">\n <div className=\"search-form\">\n <div className=\"a-z-filter mt-4 flex flex-wrap gap-1\">\n <a\n href=\"#\"\n className={classnames(\"letter\", {\n \"active underline\": selected === \"\",\n })}\n onClick={(e) => select(e, \"\")}\n >\n {I18n.t(\"js.apps.app.glossary.all_link\")}\n </a>\n {map(FILTER, (filter) => (\n <a\n href={`#${filter}`}\n key={String(filter)}\n className={classnames(\"letter\", {\n \"active underline\": selected === filter,\n })}\n onClick={(e) => select(e, filter)}\n >\n {filter}\n </a>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faMagnifyingGlass,\n faFilter,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport classNames from \"classnames\";\nimport { isEmpty, omit } from \"lodash\";\nimport Glossary from \"components/shared/Glossary\";\nimport { setSearchParam } from \"helpers/tixxt-router\";\nimport { Filter } from \"components/directory/types\";\n\ntype DirectoryToolbarArgs = {\n isLoading: boolean;\n filter: Filter;\n searchField: string;\n actions?: React.ReactNode;\n showFilterInitially?: boolean;\n children?: React.ReactNode;\n};\n\nexport default function DirectoryToolbar({\n isLoading,\n filter,\n actions,\n searchField,\n showFilterInitially = false,\n children,\n}: DirectoryToolbarArgs) {\n const hasActiveFilters = !isEmpty(omit(filter, [\"q\", \"page\"]));\n const [showFilter, setShowFilter] = useState(\n showFilterInitially || hasActiveFilters,\n );\n const [queryString, setQueryString] = useState(filter.q || \"\");\n const [searchedString, setSearchedString] = useState(filter.q || \"\");\n const [selectedLetter, selectLetter] = useState(filter.letter || \"\");\n\n useEffect(() => {\n if (hasActiveFilters) {\n setShowFilter(showFilterInitially || hasActiveFilters);\n }\n }, [hasActiveFilters]);\n\n function onSearch(e?: any) {\n e.preventDefault();\n\n if (!isEmpty(queryString)) {\n selectLetter(\"\");\n }\n\n setSearchedString(queryString);\n }\n\n useEffect(() => {\n setSearchParam(\"q\", searchedString);\n setSearchParam(\"page\", \"\");\n }, [searchedString]);\n\n useEffect(() => {\n setSearchParam(\"letter\", selectedLetter);\n setSearchParam(\"page\", \"\");\n }, [selectedLetter]);\n\n // reset q and letter filters for navigating between group tabs\n useEffect(() => {\n setQueryString(filter.q || \"\");\n selectLetter(filter.letter || \"\");\n }, [filter]);\n\n return (\n <div className=\"border-box mt-6 p-3\">\n <div className=\"flex flex-col gap-1 md:gap-0 md:flex-row md:divide-x md:divide-neutral\">\n <div className=\"grow input-group md:mr-2 w-auto\">\n <input\n type=\"text\"\n placeholder={I18n.t(\"js.directory.search.in\", {\n field: searchField,\n })}\n value={queryString}\n onChange={(e) => setQueryString(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && onSearch(e)}\n disabled={isLoading}\n />\n <button\n className=\"btn btn-primary\"\n onClick={onSearch}\n disabled={isLoading}\n >\n <FontAwesomeIcon icon={faMagnifyingGlass} />\n </button>\n </div>\n <div className=\"flex flex-wrap gap-1 justify-end sm:flex-nowrap sm:divide-x sm:divide-neutral sm:gap-0\">\n <div>\n <button\n className={classNames(\"btn btn-light md:mx-2\", {\n active: showFilter,\n })}\n onClick={(e) => {\n e.preventDefault();\n setShowFilter(!showFilter);\n }}\n disabled={isLoading}\n >\n <FontAwesomeIcon icon={faFilter} />\n </button>\n </div>\n {actions && actions}\n </div>\n </div>\n {showFilter && (\n <div className=\"search-filter-bar\">\n <div className=\"flex flex-col space-y-4\">\n <Glossary\n onSelect={(letter: string) => {\n setQueryString(\"\");\n setSearchedString(\"\");\n selectLetter(letter);\n }}\n selectedLetter={selectedLetter}\n />\n </div>\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCirclePlus } from \"@fortawesome/pro-regular-svg-icons\";\nimport React from \"react\";\nimport { Filter } from \"components/directory/types\";\nimport DirectoryToolbar from \"components/directory/DirectoryToolbar\";\nimport { setSearchParam } from \"helpers/tixxt-router\";\n\ntype ToolBarArgs = {\n isLoading: boolean;\n filter: Filter;\n};\n\nexport default function ToolBar({ isLoading, filter }: ToolBarArgs) {\n return (\n <DirectoryToolbar\n isLoading={isLoading}\n filter={filter}\n searchField={I18n.t(\"js.directory.channel_tab\")}\n showFilterInitially\n actions={\n <div className=\"flex gap-2\">\n {Preload.current_member?.can.create_channels && (\n <a\n className=\"btn btn-primary sm:ml-2 flex gap-1 items-center\"\n href=\"/channels/new\"\n title={I18n.t(\"js.directory.headline_tools.create_channel\")}\n >\n <FontAwesomeIcon icon={faCirclePlus} />\n {I18n.t(\"js.directory.headline_tools.create_channel\")}\n </a>\n )}\n </div>\n }\n >\n <div className=\"flex flex-row gap-2 mt-4\">\n <div className=\"search-subscribed\">\n <label className=\"checkbox\">\n <input\n name=\"only_subscriptions\"\n type=\"checkbox\"\n checked={filter.only_subscribed === \"true\" || false}\n onChange={(e) => {\n e.preventDefault();\n setSearchParam(\n \"only_subscribed\",\n filter.only_subscribed === \"true\" ? \"\" : \"true\",\n );\n setSearchParam(\"page\", \"\");\n }}\n disabled={isLoading}\n />\n {I18n.t(\"js.directory.search.channel_subscriptions\")}\n </label>\n </div>\n </div>\n </DirectoryToolbar>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport {\n faBullhorn,\n faBellSlash,\n faBell,\n} from \"@fortawesome/pro-regular-svg-icons\";\n\nimport DirectoryRow from \"components/directory/DirectoryRow\";\nimport DirectoryActionButton from \"components/directory/DirectoryActionButton\";\nimport DirectoryRowBadge from \"components/directory/DirectoryRowBadge\";\nimport useChannelSubscription from \"components/shared/hooks/useChannelSubscriptionToggle\";\n\nexport type Channel = {\n id: string;\n slug: string;\n title: string;\n description: string;\n status: string;\n image: { _id: string };\n subscribers_count: number;\n is_subscribed: boolean;\n};\n\nexport default function ChannelRow({\n slug,\n title,\n description,\n image,\n subscribers_count,\n is_subscribed,\n status,\n}: Channel) {\n const [isSubscribed, setIsSubscribed] = useState(is_subscribed);\n const [subscribersCount, setSubscribersCount] = useState(subscribers_count);\n const { subscribeChannel, unsubscribeChannel } = useChannelSubscription({\n channelSlug: slug,\n onSuccessFunction: (subscribed) => {\n setIsSubscribed(subscribed);\n setSubscribersCount(\n subscribed ? subscribersCount + 1 : subscribersCount - 1,\n );\n },\n });\n\n // to update row on page navigation\n useEffect(() => {\n setIsSubscribed(is_subscribed);\n setSubscribersCount(subscribers_count);\n }, [is_subscribed, subscribers_count]);\n\n return (\n <DirectoryRow\n title={title}\n url={`/channels/${slug}`}\n imageUrl={image._id && `/api/storage/images/${image._id}/get`}\n fallbackIcon={faBullhorn}\n badges={\n (status === \"draft\" || status === \"archived\") && (\n <DirectoryRowBadge\n tooltipTitle={I18n.t(`js.directory.channel_row.status.${status}`)}\n title={I18n.t(`js.directory.channel_row.status.${status}`)}\n className=\"text-muted bg-gray-100\"\n />\n )\n }\n actions={\n <DirectoryActionButton\n icon={{\n icon: isSubscribed ? faBellSlash : faBell,\n }}\n text={\n isSubscribed\n ? I18n.t(\"js.directory.channel_row.unsubscribe.label\")\n : I18n.t(\"js.directory.channel_row.subscribe.label\")\n }\n title={\n isSubscribed\n ? \"\"\n : I18n.t(\"js.directory.channel_row.subscribe.title\")\n }\n onClick={() =>\n isSubscribed ? unsubscribeChannel() : subscribeChannel()\n }\n />\n }\n >\n <p className=\"text-muted text-sm\">\n {I18n.t(\"js.directory.channel_row.subscriptions_count\", {\n count: subscribersCount,\n })}\n </p>\n <p className=\"max-w-4xl mt-1 text-sm whitespace-pre-line\">\n {description}\n </p>\n </DirectoryRow>\n );\n}\n","import React from \"react\";\nimport { useQuery } from \"react-query\";\nimport ToolBar from \"components/directory/channels/ToolBar\";\nimport { isEmpty, map, toNumber } from \"lodash\";\nimport { stringify } from \"query-string\";\nimport ChannelRow, { Channel } from \"components/directory/channels/ChannelRow\";\nimport DirectoryPagination from \"components/directory/DirectoryPagination\";\nimport useDirectoryFilter from \"../hooks/useDirectoryFilter\";\nimport { Pagination } from \"components/directory/types\";\n\ntype ChannelData = {\n pagination: Pagination;\n entries: Channel[];\n};\n\nexport default function ChannelListView() {\n const { filter, currentPage } = useDirectoryFilter();\n\n const { data, isLoading } = useQuery<ChannelData, Error>(\n `/directory/channels.json?${stringify(filter)}`,\n );\n\n return (\n <div className=\"flex flex-col gap-y-4\">\n <ToolBar isLoading={isLoading} filter={filter} />\n <DirectoryPagination\n currentPage={toNumber(currentPage)}\n pagination={data && data.pagination}\n isLoading={isLoading}\n >\n {data && !isEmpty(data?.entries)\n ? map(data.entries, (channel) => (\n <ChannelRow key={channel.id} {...channel} />\n ))\n : I18n.t(\"js.directory.empty_collection\")}\n </DirectoryPagination>\n </div>\n );\n}\n","import { useSearchParams } from \"helpers/tixxt-router\";\nimport { Filter } from \"components/directory/types\";\n\nexport default function useDirectoryFilter(): {\n filter: Filter;\n currentPage: string;\n} {\n const [searchParams] = useSearchParams();\n\n const currentPage = searchParams.get(\"page\") || \"1\";\n\n function getCurrentFilter() {\n const currentFilter = {};\n\n searchParams.forEach((value, key) => (currentFilter[key] = value));\n\n return currentFilter;\n }\n\n return { filter: getCurrentFilter(), currentPage };\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { get, isEmpty, map } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faFolder, faChevronRight } from \"@fortawesome/pro-solid-svg-icons\";\n\nexport default function Breadcrumb({ folder, handleNavigate }) {\n return (\n <ul className=\"breadcrumb border-box mb-3 px-3 py-2 flex gap-3 align-center overflow-x-auto\">\n {map(get(folder, [\"folder_path\"], []), (parentFolder, i) => (\n <li key={parentFolder.id} className=\"whitespace-nowrap\">\n <a\n href={handleNavigate ? \"#\" : `/files/folders/${parentFolder.id}`}\n onClick={\n handleNavigate\n ? (e) => {\n e.preventDefault();\n handleNavigate({ id: parentFolder.id });\n }\n : null\n }\n className={\"mr-3\"}\n >\n {i === 0 ? <FontAwesomeIcon icon={faFolder} /> : parentFolder.name}\n </a>\n <FontAwesomeIcon\n icon={faChevronRight}\n className={\"fa-sm text-muted\"}\n />\n </li>\n ))}\n {folder ? (\n <li className=\"active text-muted\">\n {isEmpty(get(folder, [\"folder_path\"])) ? (\n <FontAwesomeIcon icon={faFolder} className={\"mr-2\"} />\n ) : null}\n {folder.name}\n </li>\n ) : (\n <li>\n <i className=\"fa fa-spinner fa-spin\" />\n </li>\n )}\n </ul>\n );\n}\nBreadcrumb.propTypes = {\n folder: PropTypes.shape({\n name: PropTypes.string.isRequired,\n folder_path: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n }),\n ),\n }),\n handleNavigate: PropTypes.func,\n};\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 {\n faUsers,\n faFolder,\n faSpinner,\n faChevronRight,\n faFolderOpen,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport { useFetchFolder } from \"./api\";\n\nconst getIcon = (type) => {\n switch (type) {\n case \"root_folder.group\":\n return <FontAwesomeIcon icon={faUsers} fixedWidth />;\n default:\n return <FontAwesomeIcon icon={faFolder} 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={faSpinner} 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={faChevronRight}\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={faFolderOpen}\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","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 { useMutation, UseMutationOptions, useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { map } from \"lodash\";\n\nexport const useFetchFolder = (id, namespace = \"folders\") => {\n return useQuery(`/api/storage/${namespace}/${id}?limit=1000`);\n};\n\ntype useRemoveFilesAndFolders = {\n type: \"files\" | \"folders\";\n body: { [key: string]: string[] };\n}[];\n\nexport function useRemoveFilesAndFolders(\n options?: UseMutationOptions<unknown, Error, useRemoveFilesAndFolders>,\n) {\n return useMutation<unknown, Error, useRemoveFilesAndFolders>(\n (requests) =>\n Promise.all(\n map(requests, ({ type, body }) =>\n fetchApi(`/api/storage/${type}`, { method: \"DELETE\", body }),\n ),\n ),\n options,\n );\n}\n\ntype useMoveFilesAndFoldersArgs = {\n targetFolderId: string;\n requests: {\n type: \"files\" | \"folders\";\n body: {\n [key: string]: string | string[];\n };\n }[];\n};\n\nexport function useMoveFilesAndFolders(\n options?: UseMutationOptions<unknown, Error, useMoveFilesAndFoldersArgs>,\n) {\n return useMutation<unknown, Error, useMoveFilesAndFoldersArgs>(\n ({ requests }) =>\n Promise.all(\n map(requests, ({ type, body }) =>\n fetchApi(`/api/storage/${type}/move`, { method: \"POST\", body }),\n ),\n ),\n options,\n );\n}\n","import React, { useState, useEffect, useRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport {\n get,\n isEmpty,\n difference,\n map,\n includes,\n endsWith,\n split,\n orderBy,\n compact,\n} from \"lodash\";\n\nimport Modal from \"components/shared/Modal\";\nimport useItemBatchSelection from \"components/shared/hooks/useItemBatchSelection\";\nimport useFolderResource from \"../hooks/useFolderResource\";\nimport FolderContentsTable from \"../table/FolderContentsTable\";\nimport SelectableFolderRow from \"../table/SelectableFolderRow\";\nimport SelectableFileRow from \"../table/SelectableFileRow\";\n\nfunction FileSelectModal({ closeModal, currentRootFolder, onSelectFiles }) {\n const { loading, currentFolder, handleNavigate, breadcrumb } =\n useFolderResource({ currentRootFolder });\n\n const headerRef = useRef(null);\n const [isHoveringHeader, setIsHoveringHeader] = useState(false);\n const [sortDirection, setSortDirection] = useState(1);\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 const files = get(currentFolder, \"files\");\n const ids = map(files, \"id\");\n\n const [selectedIds, selectIds] = useState([]);\n\n const onSelectItem = useItemBatchSelection(ids, selectedIds, selectIds);\n\n const allSelected = difference(ids, selectedIds).length === 0;\n\n const selectAll = (e) => {\n if (!e.target.checked) {\n selectIds([]);\n } else {\n selectIds(ids);\n }\n };\n\n const handleSort = () => {\n setSortDirection(sortDirection === 1 ? -1 : 1);\n };\n\n const contents = !isEmpty(currentFolder)\n ? [\n ...map(\n orderBy(\n get(currentFolder, \"subfolders\"),\n [\"name\"],\n [{ 1: \"asc\", [-1]: \"desc\" }[sortDirection]],\n ),\n (folder) => ({\n ...folder,\n type: split(folder.i18n_type, \".\")[0],\n }),\n ),\n ...map(\n orderBy(\n get(currentFolder, \"files\"),\n [\"name\"],\n [{ 1: \"asc\", [-1]: \"desc\" }[sortDirection]],\n ),\n (file) => ({\n ...file,\n type: \"file\",\n }),\n ),\n ]\n : null;\n\n const rowProps = (item) => {\n if (endsWith(item.type, \"folder\")) {\n return {\n disableSelection: true,\n handleNavigate: () =>\n handleNavigate({ id: item.id, namespace: item.namespace }),\n };\n } else {\n return {\n onSelectFile: onSelectItem,\n isSelected: includes(selectedIds, item.id),\n showCheckbox: !isEmpty(selectedIds),\n navigateDisabled: true,\n };\n }\n };\n\n const selectAllCheckbox = (\n <td className=\"col-checkbox\">\n {(isHoveringHeader || !isEmpty(selectedIds)) && !isEmpty(ids) ? (\n <input type=\"checkbox\" checked={allSelected} onChange={selectAll} />\n ) : null}\n </td>\n );\n\n const selectedFiles = compact(\n map(files, (file) => (includes(selectedIds, file.id) ? file : null)),\n );\n\n return (\n <Modal\n onClose={closeModal}\n title={I18n.t(\"js.files.select\")}\n modalActionProps={{\n submitText: \"js.files.select\",\n submit: (e) => {\n e.preventDefault();\n onSelectFiles(selectedFiles);\n closeModal();\n },\n closeModal: (e) => {\n e.preventDefault();\n closeModal();\n },\n }}\n >\n {breadcrumb}\n <div className=\"selectable overflow-x-auto\">\n <FolderContentsTable\n contents={contents}\n headerRef={headerRef}\n loading={loading}\n extraColumns={[]}\n extraPreColumn={selectAllCheckbox}\n FolderRow={SelectableFolderRow}\n FileRow={SelectableFileRow}\n rowProps={rowProps}\n handleSort={handleSort}\n sortBy={[\"name\", sortDirection]}\n context=\"modal\"\n onlyShowName\n />\n </div>\n </Modal>\n );\n}\nFileSelectModal.propTypes = {\n closeModal: PropTypes.func,\n onSelectFiles: PropTypes.func,\n currentRootFolder: PropTypes.object,\n};\n\nexport default FileSelectModal;\n","import React, { Fragment, useState } from \"react\";\n\nimport preventDefault from \"../../../helpers/components/preventDefault\";\nimport FileSelectModal from \"./FileSelectModal\";\nimport { FileData } from \"components/../@types/files\";\n\ntype FilesEditorViewArgs = {\n currentRootFolder: unknown;\n onSelectFiles: (selectedFiles: FileData[]) => void;\n disabled?: boolean;\n};\n\nexport default function FilesEditorView({\n currentRootFolder,\n onSelectFiles,\n disabled = false,\n}: FilesEditorViewArgs) {\n const [showModal, setShowModal] = useState(false);\n const closeModal = () => setShowModal(false);\n\n return (\n <Fragment>\n {\" \"}\n <span>{I18n.t(\"js.or\")}</span>\n <button\n className=\"btn btn-light btn-sm file-selector-select\"\n onClick={preventDefault(() => setShowModal(true))}\n disabled={disabled}\n >\n <i className=\"fa-regular fa-file pr-1\" />\n {I18n.t(\"js.files.file_selector.select\")}\n </button>\n {showModal && (\n <FileSelectModal\n closeModal={closeModal}\n currentRootFolder={currentRootFolder}\n onSelectFiles={onSelectFiles}\n />\n )}\n </Fragment>\n );\n}\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, { useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { get } from \"lodash\";\n\nimport { selectFolder } from \"actions/files\";\nimport { currentFolderMetaSelector } from \"selectors/folders\";\nimport Breadcrumb from \"../Breadcrumb\";\nimport { useFetchFolder } from \"../api\";\n\nfunction useFolderResource({ currentRootFolder }) {\n useEffect(() => {\n dispatch(\n selectFolder({\n id: currentFolderId,\n namespace: currentFolderNamespace,\n }),\n );\n }, [currentRootFolder.id]);\n\n const { id: currentRootFolderId, namespace: currentRootFolderNamespace } =\n currentRootFolder;\n const currentFolderMeta = useSelector(currentFolderMetaSelector);\n const currentFolderId = get(currentFolderMeta, [\"id\"], currentRootFolderId);\n const currentFolderNamespace = get(\n currentFolderMeta,\n [\"namespace\"],\n currentRootFolderNamespace,\n );\n\n const { data: currentFolder, isLoading: loading } = useFetchFolder(\n currentFolderId,\n currentFolderNamespace,\n );\n\n const dispatch = useDispatch();\n\n const handleNavigate = ({ id, namespace }) => {\n dispatch(selectFolder({ id, namespace }));\n };\n\n const breadcrumb = (\n <Breadcrumb folder={currentFolder} handleNavigate={handleNavigate} />\n );\n\n return { loading, currentFolder, handleNavigate, breadcrumb };\n}\n\nexport default useFolderResource;\n","import React, { Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport moment from \"moment-timezone\";\nimport { get, map } from \"lodash\";\n\nimport humanizeFileSize from \"../../../helpers/files/humanizeFileSize\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faEye, faCloudDownload } from \"@fortawesome/pro-regular-svg-icons\";\nimport { faFlagCheckered, faLock } from \"@fortawesome/pro-solid-svg-icons\";\n\nconst isImage = (contentType) =>\n contentType && contentType.indexOf(\"image/\") === 0;\nconst isPDF = (contentType) => contentType === \"application/pdf\";\nconst isOpenable = (contentType) => isImage(contentType) || isPDF(contentType);\n\nexport function FileName({\n id,\n handleNavigate,\n name,\n version,\n finalizedAt,\n lockedUntil,\n lockedById,\n navigateDisabled,\n}) {\n let displayName = name;\n const Preload = window.Preload;\n if (name.length > 71) {\n const firstHalf = name.slice(0, 35);\n const secondHalf = name.slice(-35, name.length);\n displayName = (\n <>\n {firstHalf}\n <span className={\"text-muted\"}>…</span>\n {secondHalf}\n </>\n );\n }\n return (\n <td className=\"col-name whitespace-nowrap\">\n {navigateDisabled ? (\n <span className=\"disabled\" title={name}>\n {displayName}\n </span>\n ) : (\n <a\n href={`/files/${id}`}\n onClick={handleNavigate}\n data-id={id}\n data-type=\"file\"\n title={name}\n >\n {displayName}\n </a>\n )}\n {version && version.major ? (\n <span className=\"text-muted\"> v{version.major}</span>\n ) : null}\n {finalizedAt ? (\n <FontAwesomeIcon\n icon={faFlagCheckered}\n className={\"mx-1 text-muted\"}\n title={I18n.t(\"js.files.overview.tooltip_final\")}\n />\n ) : null}\n {lockedUntil && lockedById != Preload.current_member.id ? (\n <FontAwesomeIcon\n icon={faLock}\n className={\"mx-1 text-muted\"}\n title={I18n.t(\"js.files.overview.tooltip_locked\")}\n />\n ) : null}\n </td>\n );\n}\nFileName.propTypes = {\n id: PropTypes.string,\n handleNavigate: PropTypes.func,\n name: PropTypes.string,\n version: PropTypes.shape({ major: PropTypes.number }),\n finalizedAt: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.instanceOf(Date),\n ]),\n lockedUntil: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.instanceOf(Date),\n ]),\n lockedById: PropTypes.string,\n navigateDisabled: PropTypes.bool,\n};\n\nfunction FileInfo({\n id,\n name,\n handleNavigate,\n version,\n size,\n author,\n updatedAt,\n finalizedAt,\n lockedUntil,\n lockedById,\n extraColumns,\n profile,\n contentType,\n navigateDisabled,\n}) {\n const openUrl = `/api/storage/files/${id}/get/${name}?_=v${get(\n version,\n \"major\",\n \"0\",\n )}`;\n const downloadUrl = `${openUrl}&download`;\n\n return (\n <Fragment>\n <FileName\n id={id}\n handleNavigate={handleNavigate}\n name={name}\n version={version}\n finalizedAt={finalizedAt}\n lockedUntil={lockedUntil}\n lockedById={lockedById}\n navigateDisabled={navigateDisabled}\n />\n {map(extraColumns, ({ Data }, i) => (\n <Data key={i} profile={profile} />\n ))}\n <td className=\"col-size whitespace-nowrap\">{humanizeFileSize(size)}</td>\n <td className=\"col-author max-w-[250px] truncate\">\n {get(author, \"deleted\")\n ? get(author, \"displayName\") ||\n window.Preload.current_network.config.anonymize_membership_name\n : get(author, \"displayName\") || get(author, \"name\") || null}\n </td>\n <td className=\"col-updated_at whitespace-nowrap\">\n {moment(updatedAt).calendar()}\n </td>\n <td className=\"col-actions text-right whitespace-nowrap\">\n {isOpenable(contentType) ? (\n <a\n href={openUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={I18n.t(\"js.files.show.open_file\")}\n className=\"mr-2\"\n >\n <FontAwesomeIcon icon={faEye} />\n </a>\n ) : null}\n <a\n href={downloadUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={I18n.t(\"js.files.show.download_file\")}\n aria-label={I18n.t(\"js.files.show.download_file\")}\n >\n <FontAwesomeIcon icon={faCloudDownload} />\n </a>\n </td>\n </Fragment>\n );\n}\nFileInfo.propTypes = {\n ...FileName.propTypes,\n size: PropTypes.number,\n author: PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string,\n displayName: PropTypes.string,\n }),\n updatedAt: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.instanceOf(Date),\n ]),\n extraColumns: PropTypes.arrayOf(\n PropTypes.shape({\n Header: PropTypes.func.isRequired,\n Data: PropTypes.func.isRequired,\n }),\n ),\n profile: PropTypes.object,\n contentType: PropTypes.string,\n};\n\nexport default FileInfo;\n","export default function humanizeFileSize(size) {\n if (!size) return \"0 B\";\n const i = Math.floor(Math.log(size) / Math.log(1024));\n return (\n (size / Math.pow(1024, i)).toFixed(i > 0 ? 2 : 0) +\n \" \" +\n [\"B\", \"kB\", \"MB\", \"GB\", \"TB\"][i]\n );\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport classNames from \"classnames\";\n\nimport FileIcon from \"../../shared/FileIcon\";\nimport FileInfo from \"./FileInfo\";\n\nconst FileRow = React.memo(function FileRow({\n id,\n name,\n extension,\n handleNavigate,\n version,\n size,\n author,\n updated_at,\n finalizedAt,\n lockedUntil,\n lockedById,\n extraColumns,\n profile = {},\n className,\n content_type,\n}) {\n return (\n <tr className={classNames(\"file-row\", className)}>\n <td className=\"col-icon file-icon text-center\" width=\"1%\">\n <FileIcon extension={extension} className={\"text-xl\"} />\n </td>\n <FileInfo\n id={id}\n name={name}\n handleNavigate={handleNavigate}\n version={version}\n size={size}\n author={author}\n updatedAt={updated_at}\n finalizedAt={finalizedAt}\n lockedUntil={lockedUntil}\n lockedById={lockedById}\n extraColumns={extraColumns}\n profile={profile}\n contentType={content_type}\n />\n </tr>\n );\n});\n\nFileRow.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n extension: PropTypes.string.isRequired,\n handleNavigate: PropTypes.func,\n version: PropTypes.shape({ major: PropTypes.number }),\n size: PropTypes.number,\n author: PropTypes.shape({\n id: PropTypes.string,\n displayName: PropTypes.string,\n }),\n updated_at: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.instanceOf(Date),\n ]),\n finalizedAt: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.instanceOf(Date),\n ]),\n lockedUntil: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.instanceOf(Date),\n ]),\n lockedById: PropTypes.string,\n extraColumns: PropTypes.arrayOf(\n PropTypes.shape({\n Header: PropTypes.func.isRequired,\n Data: PropTypes.func.isRequired,\n }),\n ),\n profile: PropTypes.object,\n className: PropTypes.string,\n striped: PropTypes.bool,\n content_type: PropTypes.string,\n};\n\nexport default FileRow;\nexport const FileRowPropTypes = FileRow.propTypes;\n","import React, { useMemo } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useSelector } from \"react-redux\";\nimport { compact, find, get, map, includes } from \"lodash\";\nimport { selectFileProfileColumnFields } from \"../../../selectors/propertySets\";\nimport propertySetStyles from \"../../shared/propertySets/propertySets.module.css\";\nimport PropertyShow from \"../../appCreator/properties/PropertyShow\";\nimport Sorter from \"../../shared/tables/Sorter\";\nimport { usePropertySet } from \"../../shared/propertySets/api\";\n\nconst isSortable = (property) =>\n includes([\"date\", \"text\", \"selection\"], property.type);\n\n// Hook to build extra columns for file profile property set\n// identified by given contextId and contextType\nconst useExtraColumns = ({ contextId, contextType }) => {\n const columnFields = useSelector(selectFileProfileColumnFields);\n\n const { isLoading: fileLoading, data: fileProfilePropertySet } =\n usePropertySet({\n name: \"file_profile\",\n contextId,\n contextType,\n });\n const { isLoading: folderLoading, data: folderProfilePropertySet } =\n usePropertySet({\n name: \"folder_profile\",\n contextId,\n contextType,\n });\n\n return useMemo(() => {\n const properties = (get(fileProfilePropertySet, \"properties\") || []).concat(\n get(folderProfilePropertySet, \"properties\"),\n );\n const columnProperties = compact(\n map(columnFields, (name) => find(properties, { name })),\n );\n\n const extraColumns = map(columnProperties, (property) => {\n function Header({ handleSort, sortBy }) {\n return (\n <th className={`col-profile-${property.name}`}>\n <Sorter\n attribute={`profile.${property.name}`}\n label={property.label}\n handleSort={handleSort}\n sortBy={sortBy}\n disabled={!isSortable(property)}\n />\n </th>\n );\n }\n function Data({ profile }) {\n return (\n <td className={propertySetStyles.value}>\n {profile ? (\n <PropertyShow item={{ values: profile }} property={property} />\n ) : null}\n </td>\n );\n }\n Data.propTypes = { profile: PropTypes.object };\n return { Header, Data };\n });\n\n return { extraColumns, loading: folderLoading || fileLoading };\n }, [\n columnFields,\n fileProfilePropertySet,\n folderProfilePropertySet,\n folderLoading,\n fileLoading,\n ]);\n};\n\nexport default useExtraColumns;\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport Sorter from \"../../shared/tables/Sorter\";\nimport { map, isEmpty, isNumber, filter } from \"lodash\";\nimport DefaultFileRow from \"./FileRow\";\nimport DefaultFolderRow from \"./FolderRow\";\nimport useExtraColumns from \"./useExtraColumns\";\n\nfunction Status({ t, colSpan, count, total }) {\n return (\n <tr>\n <td className=\"text-center p-4 text-muted italic\" colSpan={colSpan}>\n {I18n.t(`js.files.folder.${t}`)}\n {count !== undefined && count > 0\n ? ` (${count}${total !== undefined ? `/${total}` : \"\"})`\n : null}\n </td>\n </tr>\n );\n}\n\nconst FolderContentsTable = React.memo(function FolderContentsTable({\n contents,\n total_files_count,\n total_subfolders_count,\n onNavigateItem,\n sortBy,\n handleSort,\n extraColumns = [],\n loading,\n error,\n FileRow = DefaultFileRow,\n FolderRow = DefaultFolderRow,\n extraPreColumn,\n headerRef,\n onlyShowName,\n skipFileAttributes,\n context,\n rowProps = () => null,\n}) {\n const filteredContents = filter(\n contents,\n (content) => content.id != undefined,\n );\n\n const handleNavigate = useCallback(\n (e) => {\n if (!onNavigateItem) return null;\n\n e.preventDefault();\n const { id, type } = e.currentTarget.dataset;\n onNavigateItem({ id, type });\n },\n [onNavigateItem],\n );\n\n const [renderTable, setRenderTable] = useState(contents?.length !== 0);\n useEffect(() => {\n if (!loading) {\n const timeoutID = setTimeout(() => {\n setRenderTable(true);\n }, 50);\n return () => clearTimeout(timeoutID);\n }\n }, [loading]);\n\n return (\n <table className=\"tixxt-table min-w-full text-sm\">\n <thead className=\"sticky top-0 bg-white\">\n <tr ref={headerRef}>\n {extraPreColumn ? extraPreColumn : null}\n <th className=\"col-icon\" />\n <th className=\"col-name\">\n <Sorter\n attribute=\"name\"\n label={I18n.t(\"js.files.folder.file_name\")}\n handleSort={handleSort}\n sortBy={sortBy}\n />\n </th>\n {!onlyShowName ? (\n <>\n {map(extraColumns, ({ Header }, i) => (\n <Header key={i} handleSort={handleSort} sortBy={sortBy} />\n ))}\n {!skipFileAttributes ? (\n <>\n <th className=\"col-size\">\n <Sorter\n attribute=\"size\"\n label={I18n.t(\"js.files.folder.file_size\")}\n handleSort={handleSort}\n sortBy={sortBy}\n />\n </th>\n <th className=\"col-author\">\n <Sorter\n attribute=\"author\"\n label={I18n.t(\"js.files.folder.file_author\")}\n handleSort={handleSort}\n sortBy={sortBy}\n />\n </th>\n <th className=\"col-updated-at\">\n <Sorter\n attribute=\"updated_at\"\n label={I18n.t(\"js.files.folder.file_updated_at\")}\n handleSort={handleSort}\n sortBy={sortBy}\n />\n </th>\n <th className=\"col-actions\" />\n </>\n ) : null}\n </>\n ) : null}\n </tr>\n </thead>\n <tbody>\n {!renderTable && (\n <Status\n t=\"loading\"\n colSpan={6 + extraColumns.length}\n count={filteredContents.length}\n total={\n isNumber(total_files_count) && isNumber(total_subfolders_count)\n ? total_files_count + total_subfolders_count\n : undefined\n }\n />\n )}\n {!loading && error ? (\n <Status t=\"loading_error\" colSpan={6 + extraColumns.length} />\n ) : null}\n {!loading && !error && isEmpty(filteredContents) ? (\n <Status t=\"empty_message\" colSpan={6 + extraColumns.length} />\n ) : null}\n {renderTable &&\n map(filteredContents, (item) =>\n item.type === \"file\" ? (\n <FileRow\n key={item.folder_link_id || item.id}\n {...item}\n handleNavigate={handleNavigate}\n extraColumns={extraColumns}\n onlyShowName={onlyShowName}\n {...rowProps(item)}\n />\n ) : (\n <FolderRow\n key={item.id}\n {...item}\n handleNavigate={handleNavigate}\n extraColumns={extraColumns}\n onlyShowName={onlyShowName}\n context={context}\n {...rowProps(item)}\n />\n ),\n )}\n </tbody>\n </table>\n );\n});\n\nFolderContentsTable.propTypes = {\n contents: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.shape(DefaultFolderRow.propTypes),\n PropTypes.shape(DefaultFileRow.propTypes),\n ]),\n ),\n total_files_count: PropTypes.number,\n total_subfolders_count: PropTypes.number,\n loading: PropTypes.bool,\n error: PropTypes.node,\n onNavigateItem: PropTypes.func,\n sortBy: PropTypes.any, // [string, number] tuple\n handleSort: PropTypes.func,\n extraColumns: PropTypes.arrayOf(\n PropTypes.shape({\n Header: PropTypes.func.isRequired,\n Data: PropTypes.func.isRequired,\n }),\n ),\n FileRow: PropTypes.elementType,\n FolderRow: PropTypes.elementType,\n extraPreColumn: PropTypes.node,\n rowProps: PropTypes.func,\n headerRef: PropTypes.shape({ current: PropTypes.instanceOf(Element) }),\n onlyShowName: PropTypes.bool,\n skipFileAttributes: PropTypes.bool,\n};\n\nexport default FolderContentsTable;\n\nexport const FolderContentsTableWithProfile = React.memo(\n function FolderContentsTableWithProfile({\n contextId,\n contextType,\n ...tableProps\n }) {\n const { loading, extraColumns } = useExtraColumns({\n contextId,\n contextType,\n });\n\n if (loading)\n return (\n <div className=\"text-center p-4 text-muted italic\">\n {I18n.t(\"js.files.folder.loading\")}\n </div>\n );\n\n return <FolderContentsTable {...tableProps} extraColumns={extraColumns} />;\n },\n);\n\nFolderContentsTableWithProfile.propTypes = {\n contextId: PropTypes.string,\n contextType: PropTypes.string.isRequired,\n};\n","import React, { Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { map } from \"lodash\";\nimport preventDefault from \"helpers/components/preventDefault\";\n\nfunction FolderInfo({\n id,\n name,\n type,\n profile,\n navigateDisabled,\n handleNavigate,\n noExtraColspan,\n extraColumns,\n context,\n}) {\n return (\n <Fragment>\n <td className=\"col-name p-2\">\n {navigateDisabled ? (\n <span className=\"text-muted\">{name}</span>\n ) : (\n <a\n href={\n handleNavigate && context === \"modal\"\n ? \"#\"\n : `/files/folders/${id}`\n }\n onClick={\n context === \"modal\"\n ? preventDefault(() => handleNavigate())\n : handleNavigate\n }\n data-id={id}\n data-type={type}\n >\n {name}\n </a>\n )}\n </td>\n {map(extraColumns, ({ Data }, i) => (\n <Data key={i} profile={profile} />\n ))}\n {noExtraColspan ? null : <td colSpan={4} />}\n </Fragment>\n );\n}\n\nFolderInfo.propTypes = {\n id: PropTypes.string,\n name: PropTypes.string,\n type: PropTypes.string,\n profile: PropTypes.object,\n navigateDisabled: PropTypes.bool,\n handleNavigate: PropTypes.func,\n noExtraColspan: PropTypes.bool,\n extraColumns: PropTypes.arrayOf(\n PropTypes.shape({\n Header: PropTypes.func.isRequired,\n Data: PropTypes.func.isRequired,\n }),\n ),\n};\n\nexport default FolderInfo;\n","import React from \"react\";\n\nimport FolderIcon from \"../../shared/FolderIcon\";\nimport PropTypes from \"prop-types\";\nimport classNames from \"classnames\";\n\nimport FolderInfo from \"./FolderInfo\";\n\nconst FolderRow = React.memo(function FolderRow({\n id,\n name,\n type,\n handleNavigate,\n extraColumns,\n profile = {},\n navigateDisabled,\n noExtraColspan,\n className,\n striped,\n context,\n}) {\n return (\n <tr\n className={classNames(\"folder-row\", className, {\n striped,\n })}\n >\n <td className=\"col-icon folder-icon p-2 text-center\" width=\"1%\">\n <FolderIcon type={type} />\n </td>\n <FolderInfo\n id={id}\n name={name}\n handleNavigate={handleNavigate}\n extraColumns={extraColumns}\n profile={profile}\n context={context}\n navigateDisabled={navigateDisabled}\n noExtraColspan={noExtraColspan}\n />\n </tr>\n );\n});\n\nFolderRow.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired,\n handleNavigate: PropTypes.func,\n noExtraColspan: PropTypes.bool,\n extraColumns: PropTypes.arrayOf(\n PropTypes.shape({\n Header: PropTypes.func.isRequired,\n Data: PropTypes.func.isRequired,\n }),\n ),\n profile: PropTypes.object,\n navigateDisabled: PropTypes.bool,\n className: PropTypes.string,\n striped: PropTypes.bool,\n};\n\nexport const FolderRowPropTypes = FolderRow.propTypes;\nexport default FolderRow;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport classNames from \"classnames\";\n\nimport FileIcon from \"../../shared/FileIcon\";\nimport FileInfo, { FileName } from \"./FileInfo\";\nimport { FileRowPropTypes } from \"./FileRow\";\n\nconst hiddenStyle = { opacity: 0, visibility: \"hidden\" };\n\nconst SelectableFileRow = React.memo(function SelectableFileRow({\n id,\n name,\n extension,\n handleNavigate,\n version,\n size,\n author,\n updated_at,\n finalizedAt,\n lockedUntil,\n lockedById,\n extraColumns,\n profile = {},\n isSelected,\n onSelectFile,\n className,\n content_type,\n disableSelection,\n showCheckbox,\n onlyShowName,\n navigateDisabled,\n}) {\n const [hover, setHover] = useState(false);\n\n const active = hover || isSelected;\n const checkboxAvailable = (active || showCheckbox) && !disableSelection;\n\n return (\n <tr\n className={classNames(\"file-row\", className, {\n [\"hover:bg-primary/25 cursor-pointer\"]: !disableSelection || active,\n })}\n onMouseOver={!disableSelection ? () => setHover(true) : null}\n onMouseLeave={!disableSelection ? () => setHover(false) : null}\n onClick={\n !disableSelection\n ? () => {\n onSelectFile(id, true);\n }\n : null\n }\n >\n <td className=\"col-checkbox p-2 text-center\">\n <input\n type=\"checkbox\"\n value={id}\n checked={isSelected}\n disabled={!checkboxAvailable}\n style={checkboxAvailable ? null : hiddenStyle}\n onChange={\n !disableSelection\n ? () => {\n onSelectFile(id);\n }\n : null\n }\n />\n </td>\n <td className=\"col-icon file-icon text-center\" width=\"1%\">\n <FileIcon extension={extension} className={\"text-xl\"} />\n </td>\n {onlyShowName ? (\n <FileName\n id={id}\n handleNavigate={handleNavigate}\n name={name}\n version={version}\n finalizedAt={finalizedAt}\n lockedUntil={lockedUntil}\n lockedById={lockedById}\n navigateDisabled={navigateDisabled}\n />\n ) : (\n <FileInfo\n id={id}\n name={name}\n handleNavigate={handleNavigate}\n version={version}\n size={size}\n author={author}\n updatedAt={updated_at}\n finalizedAt={finalizedAt}\n lockedUntil={lockedUntil}\n lockedById={lockedById}\n extraColumns={extraColumns}\n profile={profile}\n contentType={content_type}\n />\n )}\n </tr>\n );\n});\n\nSelectableFileRow.propTypes = {\n ...FileRowPropTypes,\n isSelected: PropTypes.bool,\n onSelectFile: PropTypes.func,\n disableSelection: PropTypes.bool,\n showCheckbox: PropTypes.bool,\n onlyShowName: PropTypes.bool,\n};\n\nexport default SelectableFileRow;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport classNames from \"classnames\";\n\nimport FolderIcon from \"../../shared/FolderIcon\";\nimport FolderInfo from \"./FolderInfo\";\nimport { FolderRowPropTypes } from \"./FolderRow\";\n\nconst SelectableFolderRow = React.memo(function SelectableFolderRow({\n id,\n name,\n type,\n handleNavigate,\n extraColumns,\n profile = {},\n isSelected,\n onSelectFolder,\n disableSelection,\n navigateDisabled,\n noExtraColspan,\n className,\n showCheckbox,\n onlyShowName,\n context,\n}) {\n const [hover, setHover] = useState(false);\n const active = hover || isSelected;\n\n return (\n <tr\n className={classNames(\"folder-row\", className, {\n [\"hover:bg-primary/25 cursor-pointer\"]: !disableSelection || active,\n })}\n onMouseOver={!disableSelection ? () => setHover(true) : null}\n onMouseLeave={!disableSelection ? () => setHover(false) : null}\n onClick={!disableSelection ? () => onSelectFolder(id, true) : null}\n >\n <td className=\"col-checkbox p-2 text-center\">\n {(active || showCheckbox) && !disableSelection ? (\n <input\n type=\"checkbox\"\n value={id}\n checked={isSelected}\n onChange={() => onSelectFolder(id)}\n />\n ) : null}\n </td>\n <td className=\"col-icon folder-icon text-center\" width=\"1%\">\n <FolderIcon type={type} />\n </td>\n <FolderInfo\n id={id}\n name={name}\n handleNavigate={handleNavigate}\n extraColumns={onlyShowName ? null : extraColumns}\n profile={profile}\n navigateDisabled={navigateDisabled}\n context={context}\n noExtraColspan={onlyShowName ? true : noExtraColspan}\n />\n </tr>\n );\n});\n\nSelectableFolderRow.propTypes = {\n ...FolderRowPropTypes,\n isSelected: PropTypes.bool,\n onSelectFolder: PropTypes.func,\n enableSelection: PropTypes.bool,\n showCheckbox: PropTypes.bool,\n};\n\nexport default SelectableFolderRow;\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\";\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\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\";\nimport Article from \"../../activitystreams/types/Article\";\n\nconst LOOKUP = {\n appointment: Appointment,\n note: Note,\n question: Question,\n schedule: Survey,\n survey: Survey,\n article: Article,\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 ArticleTypes {\n title: string;\n teaser: string;\n body: string;\n article_id: string;\n blog_id: string;\n}\n\nfunction Article({ title, teaser, article_id, blog_id }: ArticleTypes) {\n return (\n <div className=\"article-view prose\">\n <h1 className={\"font-bold text-2xl\"}>{title}</h1>\n <h3>{teaser}</h3>\n <a href={`/blogs/${blog_id}/article/${article_id}`}>\n {I18n.t(\"js.activitystreams.activity.article.show_article\")}\n </a>\n </div>\n );\n}\n\nexport default Article;\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 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 { faArrowLeft } from \"@fortawesome/pro-solid-svg-icons\";\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 icon={faArrowLeft} className={\"text-primary mr-2\"} />\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 { 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 { 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 { 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, new_window }, i) => (\n <li key={i}>\n <a\n className=\"dropdown-item\"\n href={link}\n target={new_window ? \"_blank\" : undefined}\n rel=\"noreferrer\"\n >\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\";\nimport { useMutation, UseMutationResult } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport invariant from \"invariant\";\nimport { Group, State } from \"../../../@types\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { toggleFavorited } from \"reducers/groups\";\nimport ToggleFavoriteButton from \"components/shared/favoriteButtons/ToggleFavoriteButton\";\n\ntype FavoriteStatus = {\n favorited: boolean;\n} | null;\ntype MutateVariables = {\n favorite: boolean /* Wether to set or unset favorite status */;\n};\n\nfunction useToggleGroupFavorite(\n groupSlug: string,\n): [\n Group,\n UseMutationResult<FavoriteStatus, unknown, MutateVariables, unknown>,\n] {\n const group = useSelector((state: State) => state.groups.bySlug[groupSlug]);\n const dispatch = useDispatch();\n invariant(group, `Group ${groupSlug} not preloaded`);\n\n const mutation = useMutation<FavoriteStatus, unknown, MutateVariables>({\n mutationFn({ favorite }) {\n return fetchApi(`/api/v1/groups/${groupSlug}/favorite`, {\n method: favorite ? \"POST\" : \"DELETE\",\n });\n },\n onSuccess(data) {\n dispatch(\n toggleFavorited({\n groupSlug,\n favorited: data?.favorited || false,\n }),\n );\n },\n });\n\n return [group, mutation];\n}\n\nexport default function ToggleGroupFavoriteButton({\n groupSlug,\n}: {\n groupSlug: string;\n}) {\n const [{ favorited }, { mutate, isLoading }] =\n useToggleGroupFavorite(groupSlug);\n\n return (\n <ToggleFavoriteButton\n title={\n favorited\n ? I18n.t(\"js.page_title.remove_group_from_favorites\")\n : I18n.t(\"js.page_title.add_group_to_favorites\")\n }\n toggleFavorited={() => mutate({ favorite: !favorited })}\n isLoading={isLoading}\n favorited={favorited}\n />\n );\n}\n","import React from \"react\";\nimport { useMutation, UseMutationResult } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport classNames from \"classnames\";\nimport invariant from \"invariant\";\nimport { Group, State } from \"../../@types\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { toggleSubscribed } from \"../../reducers/groups\";\n\ntype SubscriptionStatus = {\n subscription_status: boolean;\n} | null;\ntype MutateVariables = {\n subscription_status: boolean /* Wether to set or unset favorite status */;\n};\n\nfunction useToggleGroupSubscribe(\n groupSlug: string,\n): [\n Group,\n UseMutationResult<SubscriptionStatus, unknown, MutateVariables, unknown>,\n] {\n const group = useSelector((state: State) => state.groups.bySlug[groupSlug]);\n const dispatch = useDispatch();\n invariant(group, `Group ${groupSlug} not preloaded`);\n\n const mutation = useMutation<SubscriptionStatus, unknown, MutateVariables>({\n mutationFn({ subscription_status }) {\n return fetchApi(`/groups/${groupSlug}/subscribe`, {\n method: subscription_status ? \"POST\" : \"DELETE\",\n });\n },\n onSuccess(data) {\n dispatch(\n toggleSubscribed({\n groupSlug,\n subscription_status: data?.subscription_status || false,\n }),\n );\n },\n });\n\n return [group, mutation];\n}\n\nexport default function ToggleGroupSubscribe({\n groupSlug,\n}: {\n groupSlug: string;\n}) {\n const [{ subscription_status }, { mutate, isLoading }] =\n useToggleGroupSubscribe(groupSlug);\n\n return (\n <li\n data-bs-toggle=\"tooltip\"\n title={\n subscription_status\n ? I18n.t(\"js.groups.group.unsubscribe_group\")\n : I18n.t(\"js.groups.group.subscribe_group\")\n }\n onClick={(e: React.MouseEvent<HTMLLIElement>) => {\n e.preventDefault();\n e.stopPropagation();\n !isLoading && mutate({ subscription_status: !subscription_status });\n }}\n >\n <a\n href=\"#\"\n className={classNames({ \"text-muted cursor-wait\": isLoading })}\n >\n {subscription_status\n ? I18n.t(\"js.groups.group.unsubscribe_group\")\n : I18n.t(\"js.groups.group.subscribe_group\")}\n </a>\n </li>\n );\n}\n","import React from \"react\";\n\nexport default function LeaveGroupOption({ groupSlug }: { groupSlug: string }) {\n return (\n <li>\n <a\n href={`/groups/${groupSlug}/join`}\n data-method={\"delete\"}\n data-confirm={I18n.t(\"js.directory.group_row.leave_group_confirmation\")}\n >\n {I18n.t(\"js.directory.group_row.leave_group\")}\n </a>\n </li>\n );\n}\n","import React, { useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\n\nimport { State } from \"../../@types\";\nimport ToggleGroupFavoriteButton from \"components/shared/favoriteButtons/ToggleGroupFavoriteButton\";\n\nimport classNames from \"classnames\";\nimport ToggleGroupSubscribe from \"components/shared/ToggleGroupSubscribeButton\";\nimport LeaveGroupOption from \"components/shared/GroupLeaveOption\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faEllipsisH } from \"@fortawesome/pro-solid-svg-icons\";\n\ninterface PageTitleTypes {\n title: string;\n subtitle?: string;\n renderHeadlineTools?: (() => React.ReactNode | null) | null;\n children?: React.ReactNode;\n setDocumentTitle?: boolean;\n}\n\n/*\n * Main \"dumb\" PageTitle component\n * Styles are duplicated in app/views/layouts/_content.html.haml\n */\nexport default function PageTitle({\n title,\n subtitle,\n renderHeadlineTools,\n children,\n setDocumentTitle = true,\n}: PageTitleTypes) {\n if (renderHeadlineTools)\n console.warn(\"Prop renderHeadlineTools on PageTitle is deprecated\");\n\n useEffect(() => {\n if (setDocumentTitle && !window.isApp) {\n document.title = `${title} | ${Preload.current_network.name}`;\n }\n }, [title]);\n\n return (\n <div className={\"tixxt__pagetitle\"}>\n <h1>{title}</h1>\n {subtitle ? <small>{subtitle}</small> : null}\n {children}\n </div>\n );\n}\n\n/*\n * Shows either the group name or the given title\n * Allows user to favorite the current group\n */\nexport function ContextPageTitle({\n groupSlug,\n title: titleProp,\n}: {\n groupSlug?: string;\n title?: string | null;\n}) {\n const group = useSelector((state: State) =>\n groupSlug ? state.groups.bySlug?.[groupSlug] : null,\n );\n const title = group?.name || titleProp;\n if (!title) return null;\n\n return (\n <PageTitle title={title}>\n {groupSlug && group && !Preload?.page_title ? (\n <>\n <div>\n <span className=\"dropdown\">\n <button\n className=\"btn btn-sm btn-light border-0 dropdown-toggle\"\n data-bs-toggle=\"dropdown\"\n >\n <FontAwesomeIcon icon={faEllipsisH} className={\"text-muted\"} />\n </button>\n <ul className=\"dropdown-menu context-menu left\">\n {Preload?.current_member?.authentication_token ? (\n <li>\n <a\n href={`/groups/${groupSlug}/activitystreams/${groupSlug}/activities.atom?auth_token=${Preload.current_member.authentication_token}`}\n data-turbo={\"false\"}\n >\n {I18n.t(\"composer.editor.layout.abo\")}\n </a>\n </li>\n ) : null}\n <ToggleGroupSubscribe groupSlug={groupSlug} />\n {group.can?.leave ? (\n <>\n <li className={\"divider\"} />\n <LeaveGroupOption groupSlug={groupSlug} />\n </>\n ) : null}\n </ul>\n </span>\n <ToggleGroupFavoriteButton groupSlug={groupSlug} />\n </div>\n </>\n ) : null}\n </PageTitle>\n );\n}\n\nexport function Subtitle({\n className,\n children,\n}: {\n className?: string;\n children: React.ReactNode;\n}) {\n return (\n <h2 className={classNames(\"uppercase font-semibold text-sm\", className)}>\n {children}\n </h2>\n );\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 { faArrowsRepeat } from \"@fortawesome/pro-regular-svg-icons\";\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={faArrowsRepeat}\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 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 {\n faAngleRight,\n faAngleLeft,\n faComments,\n} from \"@fortawesome/pro-regular-svg-icons\";\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 -{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={faAngleRight} />\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={faAngleLeft} />\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 let markers = map(appointment.calendar_ids, (calendar_id: string) => {\n const calendar = find(calendars, (calendar) => calendar.id === calendar_id);\n return calendar?.color;\n });\n\n if (appointment.unknown_calendars) {\n markers = markers.concat(map(appointment.unknown_calendars, \"color\"));\n }\n\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(markers, (color, index) => {\n if (!color) return null;\n\n return (\n <div\n key={index}\n className=\"calendar h-full w-1\"\n style={{ backgroundColor: `#${color}` }}\n ></div>\n );\n })}\n <span\n className={classNames(\"ml-1\", {\n \"line-through\": appointment.canceled,\n })}\n >\n {appointment.has_meeting && <FontAwesomeIcon icon={faComments} />}\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 {\n filter,\n flatMap,\n includes,\n intersection,\n isEmpty,\n map,\n orderBy,\n uniqBy,\n} 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 let contextCalendars = !isEmpty(group)\n ? filter(calendars, (cal) => cal.parent_id === group?.id)\n : calendars;\n contextCalendars = (contextCalendars || []).concat(\n uniqBy(flatMap(appointments, \"unknown_calendars\"), \"id\"),\n );\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.length >\n intersection(groupAppointmentsCalendarIds, excludedCalendarIds).length\n );\n });\n } else {\n contextAppointments = filter(appointments, (appointment) => {\n const calendar_ids = (appointment.calendar_ids || []).concat(\n map(appointment.unknown_calendars, \"id\"),\n );\n return (\n calendar_ids.length >\n intersection(excludedCalendarIds, calendar_ids).length\n );\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 const appointmentsByDate = collectAppointmentsByDate(\n filteredAppointments,\n 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 { faCalendarCirclePlus } from \"@fortawesome/pro-regular-svg-icons\";\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={faCalendarCirclePlus} />\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 { faBan, faPencil, faTrash } from \"@fortawesome/pro-regular-svg-icons\";\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={faBan} />\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={faPencil} />\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={faTrash} />\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 { faCopy } from \"@fortawesome/pro-regular-svg-icons\";\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={faCopy} />\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 { faCalendarPlus } from \"@fortawesome/pro-regular-svg-icons\";\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={faCalendarPlus} />\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={faCalendarPlus} />\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 parseHeader from \"./parseHeader\";\nimport { isEmpty } from \"lodash\";\n\nexport default async function fetchPaginatedData({ pageParam }) {\n const response = await fetch(pageParam);\n const data = await response.json();\n\n const linkHeader = response.headers.get(\"Link\");\n const nextUrl = parseHeader(linkHeader).next;\n\n return {\n data,\n nextPage: isEmpty(nextUrl) ? null : nextUrl,\n };\n}\n","import { useInfiniteQuery, useMutation } from \"react-query\";\n\nimport fetchPaginatedData from \"helpers/api/fetchPaginatedData\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nexport function useInvites({ filter, status, enabled }) {\n return useInfiniteQuery(\n [\"invites\", filter, status],\n ({\n pageParam = `/api/v1/invites?filter=${filter}&status=${status}&limit=50`,\n }) => fetchPaginatedData({ pageParam }),\n {\n getNextPageParam: (lastPage) => lastPage.nextPage,\n enabled,\n },\n );\n}\n\nexport function useAcceptInvite(options) {\n return useMutation(\n ({ inviteId }: { inviteId: string }) =>\n fetchApi(`/api/v1/invites/${inviteId}/accept`, {\n method: \"POST\",\n }),\n options,\n );\n}\n\nexport function useDeclineInvite(options) {\n return useMutation(\n ({ inviteId }: { inviteId: string }) =>\n fetchApi(`/api/v1/invites/${inviteId}/reject`, {\n method: \"POST\",\n }),\n options,\n );\n}\n","import React, { ReactNode } from \"react\";\nimport moment from \"moment\";\nimport { isEmpty, get } from \"lodash\";\n\nimport classnames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCalendar, faRotate } from \"@fortawesome/pro-regular-svg-icons\";\nimport { useAcceptInvite, useDeclineInvite } from \"components/invites/api\";\n\ntype AppointmentInviteMetaArgs = {\n status: string;\n accept: () => void;\n decline: () => void;\n canOptRetroactively: boolean;\n totalAttendeesEnforcedAndExceeded: boolean;\n inviteStatus: string;\n participation_locked: boolean;\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}: AppointmentInviteMetaArgs) {\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}\n\ntype AppointmentInviteDateArgs = {\n date: {\n all_day: boolean;\n end: string;\n same_day: boolean;\n start: string;\n id?: string;\n };\n frequency?: string;\n};\n// Reused in bitkom custom\nexport function AppointmentInviteDate({\n date,\n frequency,\n}: AppointmentInviteDateArgs) {\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}\n\ntype Invitable = {\n calendar_ids?: string[];\n date: AppointmentInviteDateArgs[\"date\"];\n id: string;\n name: string;\n status: string;\n frequency?: string;\n total_attendees_enforced_and_exceeded?: number;\n participation_locked: boolean;\n};\n\ntype AppointmentInviteArgs = {\n id: string;\n status: string;\n inviteStatus: string;\n invitable_type: string;\n author: {\n id: string;\n name: string;\n } | null;\n invitable: Invitable;\n renderDate: (invitable: Invitable) => ReactNode;\n reloadInvites: () => void;\n renderMeta: (props: {\n inviteStatus: string;\n status: string;\n decline: () => void;\n accept: () => void;\n canOptRetroactively: boolean;\n totalAttendeesEnforcedAndExceeded?: number;\n participation_locked: boolean;\n }) => ReactNode;\n};\n\nexport default function AppointmentInvite({\n invitable,\n invitable_type,\n author,\n status,\n inviteStatus,\n id,\n renderDate,\n renderMeta,\n reloadInvites,\n}: AppointmentInviteArgs) {\n const network = Tixxt.currentNetwork;\n const { mutate: declineInvite } = useDeclineInvite({\n onSuccess: () => reloadInvites(),\n });\n\n const { mutate: acceptInvite } = useAcceptInvite({\n onSuccess: () => {\n reloadInvites();\n },\n });\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 icon={faCalendar} className={\"fa-stack-2x\"} />\n <FontAwesomeIcon\n icon={faRotate}\n className={\"fa-stack-1x top-2 !h-[0.75em]\"}\n />\n </span>\n ) : (\n <FontAwesomeIcon\n icon={faCalendar}\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: () => declineInvite({ inviteId: id }),\n accept: () => 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}\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, { useMemo } from \"react\";\nimport { Control, Controller, UseFormRegister } from \"react-hook-form\";\n\nimport Label from \"components/shared/form/Label\";\nimport Checkbox from \"components/shared/form/fields/Checkbox\";\nimport classNames from \"classnames\";\nimport DirectoryPicker from \"components/shared/DirectoryPicker\";\nimport { networkMembershipRoles } from \"components/shared/PermissionPicker\";\n\nexport function ParticipantsPicker(props) {\n const participantsQuery = useMemo(\n () => ({\n include_consumers: Preload.current_network.config.consumers_enabled,\n include_membership_roles: true,\n }),\n [Preload.current_network.config.consumers_enabled],\n );\n\n return (\n <DirectoryPicker\n {...props}\n query={participantsQuery}\n multi\n extraOptions={networkMembershipRoles}\n />\n );\n}\n\nexport default function ParticipantsField({\n control,\n register,\n}: {\n control: Control<any>;\n register: UseFormRegister<any>;\n}) {\n return (\n <div className={\"control-group remove-input-txt-border\"}>\n <Label label={I18n.t(\"js.calendars.appointment.invites.label\")} />\n <div\n className={classNames(\"controls\", {\n \"border-box p-3\": Preload.current_network.config.consumers_enabled,\n })}\n >\n <Controller\n name=\"participants\"\n control={control}\n render={({ field }) => <ParticipantsPicker {...field} />}\n />\n <span className=\"text-muted text-sm\">\n {I18n.t(\"js.calendars.appointment.invites.disclaimer\")}\n </span>\n {Preload.current_network.config.consumers_enabled && (\n <div className=\"controls mt-2\">\n <Checkbox\n name=\"invite_consumers\"\n register={register}\n label={I18n.t(\n \"js.calendars.appointment.invites.invite_consumers\",\n )}\n />\n <span className=\"text-muted text-sm\">\n {I18n.t(\"js.calendars.appointment.invites.tooltip\")}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { map, filter } from \"lodash\";\n\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 { faSpinner } from \"@fortawesome/pro-regular-svg-icons\";\nimport { ParticipantsPicker } from \"components/appointments/form/ParticipantsField\";\nimport { ValueType } from \"components/shared/DirectoryPicker/types\";\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: ValueType[];\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 }) => <ParticipantsPicker {...field} />}\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={faSpinner}\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.id,\n );\n\n const groupIds = map(\n filter(selectedEntities, (entity) => entity.type === \"group\"),\n (g) => g.id,\n );\n\n const membershipRoleIds = map(\n filter(selectedEntities, (entity) => entity.type === \"membership_role\"),\n (mr) => mr.id,\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 { faSpinner } from \"@fortawesome/pro-regular-svg-icons\";\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 ? faSpinner : 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 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 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 {\n faCircleHalfStroke as faRegularCircleHalfStroke,\n faCircle as faRegularCircle,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport { faCircle as faSolidCircle } from \"@fortawesome/pro-solid-svg-icons\";\n\nconst PARTICIPANT_STATUS_LOOKUP = {\n open: { icon: faRegularCircleHalfStroke, className: \"muted\" },\n accepted: { icon: faSolidCircle, className: \"text-success\" },\n declined: { icon: faRegularCircle, 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 <DropDown.Toggle small />\n <DropDown className=\"context-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 {\n faBars as faRegularBars,\n faCloudArrowDown as faRegularCloudArrowDown,\n faFileCsv as faRegularFileCsv,\n faFileExcel as faRegularFileExcel,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCaretLeft as faSolidCaretLeft,\n faCaretDown as faSolidCaretDown,\n} from \"@fortawesome/pro-solid-svg-icons\";\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={faSolidCaretLeft} />\n <FontAwesomeIcon icon={faRegularBars} />\n </a>\n </div>\n {appointment?.can.download_attendees &&\n !isEmpty(appointment?.participants) && (\n <div className=\"btn-group pull-right\">\n <DropDown.Toggle\n icon={faRegularCloudArrowDown}\n iconClassName=\"mr-2\"\n >\n {I18n.t(\"js.calendars.appointment.invitees.label\")}\n <FontAwesomeIcon className=\"ml-2\" icon={faSolidCaretDown} />\n </DropDown.Toggle>\n <DropDown className=\"dropdown-menu\" alignment=\"start\">\n <DropDownItem\n icon={faRegularFileCsv}\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={faRegularFileExcel}\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 React, { Ref } from \"react\";\nimport { Controller, Control } from \"react-hook-form\";\nimport MarkDownEditor from \"../../markdownEditor\";\nimport Label from \"components/shared/form/Label\";\nimport { omit } from \"lodash\";\n\ntype TextFieldArgs = {\n name: string;\n control: Control<any>;\n label?: string;\n required?: boolean;\n placeholder?: string;\n textEditorRef?: Ref<HTMLDivElement>;\n};\nexport default function TextEditor({\n name,\n control,\n label,\n placeholder = \"\",\n required = false,\n textEditorRef,\n}: TextFieldArgs) {\n return (\n <div className=\"control-group\">\n {label && <Label label={label} required={required} />}\n <div ref={textEditorRef} className=\"controls\">\n <Controller\n name={name}\n control={control}\n rules={{\n required,\n }}\n render={({ field }) => {\n return (\n <MarkDownEditor\n {...omit(field, [\"ref\"])}\n content={field.value}\n placeholder={placeholder}\n />\n );\n }}\n />\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport moment from \"moment\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faClock as faRegularClock } from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faChevronUp as faSolidChevronUp,\n faChevronDown as faSolidChevronDown,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { ChangeHandler } from \"react-hook-form\";\n\ntype TimePickerArgs = {\n value: string;\n onChange: (value: string) => void | ChangeHandler;\n};\n\nexport default function TimePicker({\n value = moment().format(),\n onChange,\n}: TimePickerArgs) {\n const [showPicker, setShowPicker] = useState(false);\n const [selectedDateTime, setSelectedDateTime] = useState(moment(value));\n const [inputValue, setInputValue] = useState(\n moment(value).format(\"HH:mm\") || moment().format(\"HH:mm\"),\n );\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setSelectedDateTime(moment(value)); // update date if its changed from outside (e.g. datepicker)\n }, [value]);\n\n useEffect(() => {\n if (!selectedDateTime.isSame(moment(value))) {\n onChange(moment(selectedDateTime).format());\n }\n }, [selectedDateTime]);\n\n function handleClickOutside(event: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setShowPicker(false);\n }\n }\n\n useEffect(() => {\n document.addEventListener(\"click\", handleClickOutside);\n return () => {\n document.removeEventListener(\"click\", handleClickOutside);\n };\n }, []);\n\n function increaseHour(e?: React.MouseEvent<HTMLButtonElement>) {\n e?.preventDefault();\n\n const newDateTime = moment(selectedDateTime).add(1, \"hour\");\n setSelectedDateTime(newDateTime);\n setInputValue(newDateTime.format(\"HH:mm\"));\n }\n\n function decreaseHour(e?: React.MouseEvent<HTMLButtonElement>) {\n e?.preventDefault();\n\n const newDateTime = moment(selectedDateTime).subtract(1, \"hour\");\n setSelectedDateTime(newDateTime);\n setInputValue(newDateTime.format(\"HH:mm\"));\n }\n\n function increaseMinutes(e?: React.MouseEvent<HTMLButtonElement>) {\n e?.preventDefault();\n\n const minutes = selectedDateTime.minutes();\n const roundedMinutes = Math.floor(minutes / 5) * 5;\n\n selectedDateTime.minutes(roundedMinutes);\n\n const newDateTime = moment(selectedDateTime)\n .startOf(\"minute\")\n .add(5, \"minutes\");\n setSelectedDateTime(newDateTime);\n setInputValue(newDateTime.format(\"HH:mm\"));\n }\n\n function decreaseMinutes(e?: React.MouseEvent<HTMLButtonElement>) {\n e?.preventDefault();\n\n const minutes = selectedDateTime.minutes();\n const roundedMinutes = Math.ceil(minutes / 5) * 5;\n\n selectedDateTime.minutes(roundedMinutes);\n\n const newDateTime = moment(selectedDateTime).subtract(5, \"minutes\");\n setSelectedDateTime(newDateTime);\n setInputValue(newDateTime.format(\"HH:mm\"));\n }\n\n function parseTime(value: string) {\n const [inputHours, inputMinutes] = value.split(\":\");\n let hours = \"00\";\n let minutes = \"00\";\n\n if (/^[0-2]?[0-9]$/.test(inputHours)) {\n hours = inputHours.padStart(2, \"0\");\n if (parseInt(hours, 10) > 23) {\n hours = \"00\";\n }\n }\n\n if (/^[0-5]?[0-9]$/.test(inputMinutes)) {\n minutes = inputMinutes.padStart(2, \"0\");\n }\n\n return `${hours}:${minutes}`;\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n setInputValue(e.target.value);\n }\n function handleBlur() {\n const newTime = parseTime(inputValue);\n\n const [newHours, newMinutes] = newTime.split(\":\");\n\n const updatedDateTime = moment(selectedDateTime)\n .hours(parseInt(newHours, 10))\n .minutes(parseInt(newMinutes, 10));\n\n setSelectedDateTime(updatedDateTime);\n setInputValue(updatedDateTime.format(\"HH:mm\"));\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const input = e.target as HTMLInputElement;\n const { selectionStart, selectionEnd } = input;\n\n if (selectionStart === null || selectionEnd === null) {\n return;\n }\n\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n\n if (selectionStart < 3) {\n if (e.key === \"ArrowUp\") {\n increaseHour();\n } else if (e.key === \"ArrowDown\") {\n decreaseHour();\n }\n } else {\n if (e.key === \"ArrowUp\") {\n increaseMinutes();\n } else if (e.key === \"ArrowDown\") {\n decreaseMinutes();\n }\n }\n\n setTimeout(() => {\n if (inputRef && inputRef.current) {\n inputRef.current.selectionStart = selectionStart;\n inputRef.current.selectionEnd = selectionEnd;\n }\n }, 0);\n }\n }\n\n return (\n <div className=\"w-28\" ref={containerRef}>\n <div className=\"input-group w-28\">\n <input\n ref={inputRef}\n value={inputValue}\n type=\"text\"\n onFocus={() => setShowPicker(true)}\n onBlur={handleBlur}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={I18n.t(\"js.calendars.date_range.time_placeholder\")}\n />\n <button\n className=\"btn btn-light btn-sm\"\n onClick={(e) => {\n e.preventDefault();\n inputRef?.current?.focus();\n }}\n >\n <FontAwesomeIcon icon={faRegularClock} />\n </button>\n </div>\n {showPicker && (\n <div className=\"border-box absolute mt-1 p-3 z-20\">\n <div className=\"grid grid-cols-3 grid-rows-[1fr_25px_1fr] gap-y-2\">\n <button className=\"btn btn-sm btn-light\" onClick={increaseHour}>\n <FontAwesomeIcon icon={faSolidChevronUp} />\n </button>\n <div />\n <button className=\"btn btn-sm btn-light\" onClick={increaseMinutes}>\n <FontAwesomeIcon icon={faSolidChevronUp} />\n </button>\n <div className=\"text-center align-baseline\">\n {selectedDateTime.format(\"HH\")}\n </div>\n <div className=\"text-center align-baseline\">:</div>\n <div className=\"text-center align-baseline\">\n {selectedDateTime.format(\"mm\")}\n </div>\n <button className=\"btn btn-sm btn-light\" onClick={decreaseHour}>\n <FontAwesomeIcon icon={faSolidChevronDown} />\n </button>\n <div />\n <button className=\"btn btn-sm btn-light\" onClick={decreaseMinutes}>\n <FontAwesomeIcon icon={faSolidChevronDown} />\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useEffect, useRef } from \"react\";\nimport Datepicker from \"helpers/Datepicker\";\nimport moment from \"moment\";\nimport { isEmpty, noop } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCalendar } from \"@fortawesome/pro-regular-svg-icons\";\nimport TimePicker from \"components/shared/form/fields/TimePicker\";\nimport Label from \"components/shared/form/Label\";\nimport { Control, useController } from \"react-hook-form\";\n\ntype DateTimePickerArgs = {\n name: string;\n showTimePicker?: boolean;\n label?: string;\n showTimezone?: boolean;\n timeZone?: string;\n interval?: moment.Duration;\n required?: boolean | string;\n control?: Control<any>;\n defaultValue?: string;\n};\n\nexport default function DateTimePicker({\n name,\n showTimePicker = false,\n label,\n showTimezone = false,\n timeZone,\n interval,\n required = false,\n control,\n defaultValue,\n}: DateTimePickerArgs) {\n const { field } = useController({\n name,\n rules: { required },\n defaultValue: required ? defaultValue || moment().format() : \"\",\n control,\n });\n const pickerRef = useRef<HTMLInputElement>(null);\n\n function isDateSelectable(pickerDate: string) {\n const momentDate = moment(pickerDate);\n const startDate = moment(field.value).clone();\n if (momentDate.isBefore(startDate, \"day\")) {\n return false;\n }\n const checkDate = startDate.clone().startOf(\"day\");\n while (checkDate.isSameOrBefore(momentDate)) {\n if (checkDate.isSame(momentDate, \"day\")) {\n return true;\n }\n checkDate.add(interval);\n }\n return false;\n }\n\n useEffect(() => {\n const options = interval\n ? {\n beforeShowDay: (pickerDate: string) => ({\n enabled: isDateSelectable(pickerDate),\n }),\n }\n : {};\n\n const picker = new Datepicker(pickerRef.current, options);\n\n pickerRef.current?.addEventListener(\"changeDate\", (e: CustomEventInit) => {\n field.onChange(\n e.detail.date && moment(e.detail.date).isValid()\n ? moment(e.detail.date)\n .hours(moment(field.value).hours())\n .minutes(moment(field.value).minutes())\n .format()\n : \"\",\n );\n });\n\n return () => {\n picker.destroy();\n };\n }, [interval]);\n\n return (\n <div className=\"control-group items-center\">\n {label && <Label label={label} required={!!required} />}\n <div className=\"controls flex gap-2 items-start\">\n <div className=\"input-group w-36\">\n <input\n type=\"text\"\n ref={pickerRef}\n placeholder={I18n.t(\"js.calendars.date_range.date_placeholder\")}\n value={\n isEmpty(field.value)\n ? \"\"\n : moment(field.value).format(\n I18n.t(\"js.plugins.Locale.Formats.valid_date\"),\n )\n }\n onChange={noop}\n />\n <button\n className=\"btn btn-light btn-sm\"\n onClick={(e) => {\n e.preventDefault();\n pickerRef?.current?.focus();\n }}\n >\n <FontAwesomeIcon icon={faCalendar} />\n </button>\n </div>\n {showTimePicker && (\n <div className=\"grid grid-rows-2 grid-cols-1 sm:grid-rows-1 sm:grid-cols-[auto_1fr] gap-2 items-center\">\n <TimePicker onChange={field.onChange} value={field.value} />\n <span className=\"text-sm w-40\">\n {showTimezone &&\n timeZone &&\n `UTC ${moment.tz(field.value, timeZone).format(\"Z\")} (${moment\n .tz(field.value, timeZone)\n .format(\"z\")})`}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React, { ReactElement, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faChevronUp, faChevronDown } from \"@fortawesome/pro-regular-svg-icons\";\nimport { IconDefinition } from \"@fortawesome/pro-regular-svg-icons\";\nimport classNames from \"classnames\";\nimport { isString } from \"lodash\";\n\ntype PartialToggleArgs = {\n onToggle?: (showPartial: boolean) => void;\n label: string | ((showPartial: boolean) => string);\n showIcon?: IconDefinition;\n hideIcon?: IconDefinition;\n iconClassName?: string | ((showPartial: boolean) => string);\n shouldShowPartial?: boolean;\n children: ReactElement[] | ReactElement;\n};\n\nexport default function PartialToggle({\n label,\n showIcon,\n hideIcon,\n iconClassName,\n shouldShowPartial = false,\n children,\n onToggle,\n}: PartialToggleArgs) {\n const [showPartial, setShowPartial] = useState(shouldShowPartial);\n return (\n <>\n <button\n className={classNames(\n \"flex justify-between align-middle p-3 -mx-3 border-t border-t-neutral items-center hover:bg-neutral/10\",\n { \"mb-1\": showPartial, \"-mb-3\": !showPartial },\n )}\n onClick={(e) => {\n e.preventDefault();\n onToggle && onToggle(showPartial);\n setShowPartial(!showPartial);\n }}\n >\n {isString(label) ? label : label(showPartial)}\n <FontAwesomeIcon\n className={\n isString(iconClassName)\n ? iconClassName\n : iconClassName && iconClassName(showPartial)\n }\n icon={\n showPartial ? hideIcon || faChevronUp : showIcon || faChevronDown\n }\n />\n </button>\n {showPartial && children}\n </>\n );\n}\n","import React, { useState } from \"react\";\nimport {\n Control,\n Controller,\n ControllerRenderProps,\n useWatch,\n} from \"react-hook-form\";\nimport Label from \"components/shared/form/Label\";\nimport ReactSelect from \"react-select\";\nimport { isEmpty, map } from \"lodash\";\nimport moment from \"moment\";\nimport classNames from \"classnames\";\nimport { faXmark } from \"@fortawesome/pro-regular-svg-icons\";\nimport DateTimePicker from \"components/shared/form/fields/DateTimePicker\";\nimport PartialToggle from \"components/appointments/form/PartialToggle\";\n\nconst FREQUENCY_LOOKUP = {\n weekly: \"week\",\n monthly: \"month\",\n yearly: \"year\",\n daily: \"day\",\n custom: \"custom\",\n};\n\ntype RecurringSelectArgs = {\n name: string;\n label?: string;\n control: Control<any>;\n required?: boolean;\n startDate: string;\n};\n\nexport default function RecurringSelectField({\n name,\n label,\n control,\n required,\n startDate,\n}: RecurringSelectArgs) {\n return (\n <div className=\"control-group\">\n {label && <Label label={label} required={required} />}\n <div className=\"controls\">\n <Controller\n name={name}\n control={control}\n render={({ field }) => RecurringSelect({ field, startDate, control })}\n />\n </div>\n </div>\n );\n}\n\nfunction RecurringSelect({\n field,\n startDate,\n control,\n}: {\n field: ControllerRenderProps;\n startDate: string;\n control: Control<any>;\n}) {\n const { recurrence_frequency, recurrence_end_time, recurrence_interval } =\n useWatch({\n control,\n name: \"recurrence_pattern\",\n });\n const [showEndPicker, setShowEndPicker] = useState(\n !isEmpty(recurrence_end_time),\n );\n\n // eslint-disable-next-line prefer-const\n let [isCustom, setIsCustom] = useState(recurrence_frequency === \"custom\");\n isCustom = isCustom || (recurrence_interval && recurrence_interval !== 1);\n\n const level1Options = map(\n [\"never\", \"daily\", \"weekly\", \"monthly\", \"yearly\", \"custom\"],\n (pattern) => ({\n value: pattern,\n label: I18n.t(\n `js.calendars.appointment.recurrence-pattern.frequency.${pattern}`,\n ),\n }),\n );\n\n const customOptions = map(\n [\"daily\", \"weekly\", \"monthly\", \"yearly\"],\n (pattern) => ({\n value: pattern,\n label: I18n.t(\n `js.calendars.appointment.recurrence-pattern.custom_frequency.${pattern}`,\n ),\n }),\n );\n\n function level1HandleChange(value: {\n [key: string]: string | number | null;\n }) {\n const isCustomFrequency = value.recurrence_frequency === \"custom\";\n const isFieldFrequencyNever = field.value.recurrence_frequency === \"never\";\n\n setIsCustom(isCustomFrequency);\n\n if (!isCustomFrequency) {\n handleChange(value);\n }\n\n if (isCustomFrequency && isFieldFrequencyNever) {\n field.onChange({\n ...field.value,\n recurrence_frequency: \"daily\",\n });\n }\n }\n\n function handleChange(value: { [key: string]: string | number | null }) {\n if (value.recurrence_frequency) {\n if (value.recurrence_frequency !== recurrence_frequency) {\n field.onChange({\n ...field.value,\n recurrence_end_time: null,\n recurrence_interval:\n value.recurrence_frequency !== \"custom\" ? 1 : recurrence_interval, // Reset recurrence_interval if not custom\n ...value,\n });\n setShowEndPicker(false);\n return;\n }\n }\n\n field.onChange({\n ...field.value,\n ...value,\n });\n }\n\n return (\n <div className=\"border-box flex flex-col p-3 gap-y-3\">\n <div className=\"control-group\">\n <label className=\"control-label\">\n {I18n.t(\"js.calendars.appointment.recurrence_pattern.interval.label\")}\n </label>\n <div className=\"controls remove-input-txt-border\">\n <ReactSelect\n closeMenuOnSelect\n noOptionsMessage={() => I18n.t(\"js.plugins.select2.no_match\")}\n value={{\n value: isCustom ? \"custom\" : field.value.recurrence_frequency,\n label: I18n.t(\n `js.calendars.appointment.recurrence-pattern.frequency.${\n isCustom ? \"custom\" : recurrence_frequency\n }`,\n ),\n }}\n options={level1Options}\n onChange={(selectedOption) =>\n level1HandleChange({\n recurrence_frequency: selectedOption?.value,\n })\n }\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n isSearchable={false}\n unstyled\n />\n </div>\n </div>\n {isCustom && (\n <div className=\"control-group\">\n <label className=\"control-label\">\n {I18n.t(\"js.calendars.appointment.recurrence-pattern.custom.label\")}\n </label>\n <div className=\"controls flex items-center gap-x-2\">\n <input\n type=\"number\"\n className=\"form-control\"\n value={field.value.recurrence_interval || 1}\n onChange={(e) =>\n handleChange({ recurrence_interval: parseInt(e.target.value) })\n }\n min={1}\n />\n <ReactSelect\n value={{\n value: field.value.recurrence_frequency,\n label: I18n.t(\n `js.calendars.appointment.recurrence-pattern.custom_frequency.${recurrence_frequency}`,\n ),\n }}\n options={customOptions}\n onChange={(selectedOption) =>\n handleChange({ recurrence_frequency: selectedOption?.value })\n }\n className=\"form-select-container w-full\"\n classNamePrefix=\"form-select\"\n isSearchable={false}\n unstyled\n />\n </div>\n </div>\n )}\n {recurrence_frequency !== \"never\" && (\n <PartialToggle\n onToggle={(showPartial) => {\n handleChange({\n recurrence_end_time: showPartial\n ? null\n : field.value.recurrence_end_time ||\n moment(startDate)\n .add(\n recurrence_interval,\n FREQUENCY_LOOKUP[recurrence_frequency],\n )\n .format(),\n });\n }}\n label={(showPartial) =>\n showPartial\n ? I18n.t(\"js.calendars.date_range.remove_end\")\n : I18n.t(\"js.calendars.date_range.set_end.link\")\n }\n iconClassName={(showPartial) =>\n classNames({ \"text-danger\": showPartial })\n }\n hideIcon={faXmark}\n shouldShowPartial={showEndPicker}\n >\n <DateTimePicker\n name=\"recurrence_pattern.recurrence_end_time\"\n label={I18n.t(\"js.calendars.date_range.end_date.label\")}\n interval={moment.duration(\n recurrence_interval,\n FREQUENCY_LOOKUP[recurrence_frequency],\n )}\n />\n </PartialToggle>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { UseFormRegister } from \"react-hook-form\";\nimport Label from \"components/shared/form/Label\";\nimport PartialToggle from \"components/appointments/form/PartialToggle\";\n\ntype LocationFieldArgs = {\n register: UseFormRegister<any>;\n shouldShowLocationDetails?: boolean;\n};\nexport default function LocationField({\n register,\n shouldShowLocationDetails = false,\n}: LocationFieldArgs) {\n return (\n <div className=\"control-group\">\n {<Label label={I18n.t(\"js.calendars.appointment.location.label\")} />}\n <div className=\"controls border-box flex flex-col p-3 gap-y-3\">\n <div className=\"control-group\">\n <Label label={I18n.t(\"js.calendars.location.name.label\")} />\n <div className=\"controls\">\n <input\n type=\"text\"\n placeholder={I18n.t(\"js.calendars.location.name.placeholder\")}\n {...register(\"location.name\")}\n />\n </div>\n </div>\n <PartialToggle\n shouldShowPartial={shouldShowLocationDetails}\n label={I18n.t(\"js.calendars.location.extend\")}\n >\n <div className=\"control-group\">\n <Label label={I18n.t(\"js.calendars.location.address1.label\")} />\n <div className=\"controls\">\n <input\n type=\"text\"\n placeholder={I18n.t(\n \"js.calendars.location.address1.placeholder\",\n )}\n {...register(\"location.address1\")}\n />\n </div>\n </div>\n <div className=\"control-group\">\n <Label label={I18n.t(\"js.calendars.location.address2.label\")} />\n <div className=\"controls\">\n <input type=\"text\" {...register(\"location.address2\")} />\n </div>\n </div>\n <div className=\"control-group\">\n <Label\n label={`${I18n.t(\"js.calendars.location.zip.label\")} / ${I18n.t(\n \"js.calendars.location.city.label\",\n )}`}\n />\n <div className=\"controls flex gap-2\">\n <div className=\"w-36\">\n <input\n type=\"text\"\n pattern=\"[0-9]{5}(-[0-9]{4})?\"\n maxLength={10}\n placeholder={I18n.t(\"js.calendars.location.zip.label\")}\n {...register(\"location.zip\")}\n />\n </div>\n <input\n type=\"text\"\n placeholder={I18n.t(\"js.calendars.location.city.label\")}\n {...register(\"location.city\")}\n />\n </div>\n </div>\n <div className=\"control-group\">\n <Label label={I18n.t(\"js.calendars.location.link.label\")} />\n <div className=\"controls\">\n <input\n type=\"url\"\n placeholder={I18n.t(\"js.calendars.location.link.placeholder\")}\n {...register(\"location.link\")}\n />\n </div>\n </div>\n </PartialToggle>\n </div>\n </div>\n );\n}\n","import React, { useEffect } from \"react\";\nimport Label from \"components/shared/form/Label\";\nimport {\n Control,\n UseFormRegister,\n UseFormSetValue,\n useWatch,\n} from \"react-hook-form\";\nimport Checkbox from \"components/shared/form/fields/Checkbox\";\n\nexport default function TeamsConfigField({\n register,\n control,\n setValue,\n}: {\n register: UseFormRegister<any>;\n control: Control<any>;\n setValue: UseFormSetValue<any>;\n}) {\n const teamsSyncEnabled = useWatch({\n control,\n name: \"teams_configuration.teams_sync_enabled\",\n });\n const onlineMeeting = useWatch({\n control,\n name: \"teams_configuration.online_meeting\",\n });\n\n useEffect(() => {\n if (teamsSyncEnabled) setValue(\"teams_configuration.online_meeting\", true);\n }, [teamsSyncEnabled]);\n\n useEffect(() => {\n if (!teamsSyncEnabled || !onlineMeeting)\n setValue(\"teams_configuration.bypass_lobby\", false);\n }, [teamsSyncEnabled, onlineMeeting]);\n\n return (\n <div className=\"control-group\">\n <Label label={I18n.t(\"js.calendars.appointment.microsoft_teams.label\")} />\n <div className=\"controls border-box flex flex-col p-3 gap-y-\">\n <div className=\"inline-controls\">\n <Checkbox\n name=\"teams_configuration.teams_sync_enabled\"\n register={register}\n label={I18n.t(\"js.calendars.teams_sync_enabled.checkbox.label\")}\n />\n </div>\n {teamsSyncEnabled && (\n <div className=\"inline-controls ml-8\">\n <Checkbox\n name=\"teams_configuration.online_meeting\"\n register={register}\n label={I18n.t(\"js.calendars.online_meeting.checkbox.label\")}\n />\n {onlineMeeting && (\n <>\n <Checkbox\n name=\"teams_configuration.bypass_lobby\"\n register={register}\n label={I18n.t(\"js.calendars.bypass_lobby.checkbox.label\")}\n />\n <div>\n <span className=\"text-muted text-sm\">\n {I18n.t(\"js.calendars.bypass_lobby.checkbox.hint\")}\n </span>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React, { useEffect } from \"react\";\nimport { Control, UseFormSetValue, useWatch } from \"react-hook-form\";\n\nimport Select from \"components/shared/form/fields/Select\";\nimport { useQuery } from \"react-query\";\nimport { find, isString, map } from \"lodash\";\nimport { Categories } from \"../../../@types/appointmentCategories\";\n\nexport default function CategorySelectionField({\n control,\n setValue,\n}: {\n control: Control<any>;\n setValue: UseFormSetValue<any>;\n}) {\n const { data: categories } = useQuery<Categories>(\"/appointments/categories\");\n const selectedCategory = useWatch({ control, name: \"category\" });\n\n useEffect(() => {\n if (categories && isString(selectedCategory)) {\n const preSelectedCategory = find(categories, { label: selectedCategory });\n\n preSelectedCategory &&\n setValue(\"category\", {\n label: preSelectedCategory.label,\n value: preSelectedCategory.id,\n });\n }\n }, [categories]);\n\n return (\n <Select\n name=\"category\"\n label={I18n.t(\"js.calendars.appointment.category.label\")}\n options={map(categories, (cat) => ({\n value: cat.id,\n label: cat.label,\n }))}\n control={control}\n />\n );\n}\n","import React from \"react\";\nimport { Control, Controller } from \"react-hook-form\";\n\nimport Label from \"components/shared/form/Label\";\nimport DirectoryPicker from \"components/shared/DirectoryPicker\";\n\nexport default function ContactsField({ control }: { control: Control<any> }) {\n return (\n <div className=\"control-group remove-input-txt-border\">\n <Label label={I18n.t(\"js.calendars.appointment.contacts.label\")} />\n <div className=\"controls\">\n <Controller\n name=\"contacts\"\n control={control}\n render={({ field }) => (\n <DirectoryPicker {...field} multi endpoint={\"/directory/members\"} />\n )}\n />\n </div>\n </div>\n );\n}\n","import React, { useRef } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faUsers } from \"@fortawesome/pro-regular-svg-icons\";\n\nimport Label from \"components/shared/form/Label\";\nimport { UseFormRegister } from \"react-hook-form\";\nimport Checkbox from \"components/shared/form/fields/Checkbox\";\n\nexport default function AttendeeConfigurationField({\n register,\n}: {\n register: UseFormRegister<any>;\n}) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n return (\n <div className=\"control-group\">\n <Label\n label={I18n.t(\"js.calendars.appointment.attendee_configuration.label\")}\n />\n <div className=\"controls border-box flex flex-col gap-y-3 p-3\">\n <div className=\"control-group items-center\">\n <Label\n label={I18n.t(\"js.calendars.attendee_configuration.total.label\")}\n />\n <div className=\"controls\">\n <div className=\"input-group w-32\">\n <input\n type=\"number\"\n {...register(\"attendee_configuration.total\")}\n ref={(e) => {\n register(\"attendee_configuration.total\").ref(e);\n inputRef.current = e;\n }}\n min=\"0\"\n />\n <button\n className=\"btn btn-light\"\n onClick={(e) => {\n e.preventDefault();\n inputRef?.current?.focus();\n }}\n >\n <FontAwesomeIcon icon={faUsers} />\n </button>\n </div>\n </div>\n </div>\n <div className=\"inline-controls\">\n <Checkbox\n name=\"attendee_configuration.total_attendees_enforced\"\n register={register}\n label={I18n.t(\n \"js.calendars.attendee_configuration.total_attendees_enforced.label\",\n )}\n />\n <Checkbox\n name=\"attendee_configuration.user_can_opt\"\n register={register}\n label={I18n.t(\n \"js.calendars.attendee_configuration.user_can_opt.label\",\n )}\n />\n <Checkbox\n name=\"attendee_configuration.show_participants_to_admins_only\"\n register={register}\n label={I18n.t(\n \"js.calendars.attendee_configuration.show_participants_to_admins_only.label\",\n )}\n />\n </div>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { Control, UseFormRegister, useWatch } from \"react-hook-form\";\n\nimport Label from \"components/shared/form/Label\";\nimport Checkbox from \"components/shared/form/fields/Checkbox\";\nimport DateTimePicker from \"components/shared/form/fields/DateTimePicker\";\n\nexport default function ApplicationConfigurationField({\n register,\n control,\n}: {\n register: UseFormRegister<any>;\n control: Control<any>;\n}) {\n const withCosts = useWatch({\n control,\n name: \"application_configuration.registration_with_costs\",\n });\n const registrationRequired = useWatch({\n control,\n name: \"application_configuration.registration_required\",\n });\n\n return (\n <div className=\"control-group\">\n <Label\n label={I18n.t(\n \"js.calendars.appointment.application_configuration.label\",\n )}\n />\n <div className=\"controls border-box flex flex-col gap-y-3 p-3\">\n <div className=\"inline-controls\">\n <Checkbox\n name=\"application_configuration.registration_with_costs\"\n register={register}\n label={I18n.t(\n \"js.calendars.application_configuration.registration_with_costs.label\",\n )}\n />\n </div>\n {withCosts && (\n <div className=\"control-group items-center\">\n <Label\n label={`${I18n.t(\n \"js.calendars.application_configuration.costs.label\",\n )} / ${I18n.t(\"js.currency_label\")}`}\n />\n\n <div className=\"controls flex gap-2\">\n <div className=\"w-32\">\n <input\n type=\"number\"\n {...register(\"application_configuration.costs\")}\n min=\"0\"\n />\n </div>\n <div className=\"w-14\">\n <input\n type=\"text\"\n {...register(\"application_configuration.currency\")}\n />\n </div>\n </div>\n </div>\n )}\n <div className=\"inline-controls\">\n <Checkbox\n name=\"application_configuration.registration_required\"\n register={register}\n label={I18n.t(\n \"js.calendars.application_configuration.registration_required.label\",\n )}\n />\n </div>\n {registrationRequired && (\n <DateTimePicker\n name=\"application_configuration.registration_deadline\"\n label={I18n.t(\n \"js.calendars.application_configuration.registration_deadline.label\",\n )}\n />\n )}\n <div className=\"control-group items-center\">\n <Label\n label={I18n.t(\n \"js.calendars.application_configuration.ticket_url.label\",\n )}\n />\n <div className=\"controls\">\n <input\n type=\"url\"\n placeholder=\"https://\"\n {...register(\"application_configuration.url\")}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport {\n Control,\n UseFormRegister,\n UseFormSetValue,\n useWatch,\n} from \"react-hook-form\";\n\nimport FileUploadField from \"components/shared/form/fields/FileUploadField\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faChevronUp, faChevronDown } from \"@fortawesome/pro-solid-svg-icons\";\nimport TextInput from \"components/shared/form/fields/TextInput\";\nimport CategorySelectionField from \"components/appointments/form/CategorySelectionField\";\nimport ContactsField from \"components/appointments/form/ContactsField\";\nimport AttendeeConfigurationField from \"components/appointments/form/AttendeeConfigurationField\";\nimport ApplicationConfigurationField from \"components/appointments/form/ApplicationConfigurationField\";\n\nexport default function EventSettings({\n control,\n register,\n setValue,\n}: {\n control: Control<any>;\n register: UseFormRegister<any>;\n setValue: UseFormSetValue<any>;\n}) {\n const isEvent = useWatch({ control, name: \"is_event\" });\n const [showEventSettings, setShowEventSettings] = useState(isEvent);\n\n return (\n <div className=\"flex flex-col\">\n <button\n className={classNames(\n \"flex px-3 pt-1.5 gap-2 items-center mb-4 justify-between hover:bg-neutral/10\",\n {\n \"border-b border-b-neutral\": !showEventSettings,\n },\n )}\n onClick={(e) => {\n e.preventDefault();\n setShowEventSettings(!showEventSettings);\n setValue(\"is_event\", !showEventSettings);\n }}\n >\n <h4>{I18n.t(\"js.calendars.appointment.toggle_event_settings\")} </h4>\n <FontAwesomeIcon\n className=\"mb-2\"\n icon={showEventSettings ? faChevronUp : faChevronDown}\n />\n </button>\n {showEventSettings && (\n <div className=\"form-horizontal\">\n <FileUploadField\n control={control}\n name={\"event_image\"}\n label={I18n.t(\"js.calendars.appointment.logo.label\")}\n options={{ isImage: true, storageDirectory: \"images\" }}\n />\n <CategorySelectionField control={control} setValue={setValue} />\n <TextInput\n name=\"consultants\"\n register={register}\n label={I18n.t(\"js.calendars.appointment.consultants.label\")}\n />\n <AttendeeConfigurationField register={register} />\n <ApplicationConfigurationField\n register={register}\n control={control}\n />\n <ContactsField control={control} />\n <TextInput\n name=\"organizer\"\n register={register}\n placeholder={I18n.t(\n \"js.calendars.appointment.organizer.placeholder\",\n )}\n label={I18n.t(\"js.calendars.appointment.organizer.label\")}\n multiline\n />\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faArrowsRepeat } from \"@fortawesome/pro-regular-svg-icons\";\nimport { split } from \"lodash\";\n\nexport default function ModifiedRecurringAppointmentHint({\n appointmentId,\n}: {\n appointmentId: string;\n}) {\n const recurringAppointmentId = split(appointmentId, \"-\")[1];\n return (\n <div className=\"alert alert-info grid grid-rows-[1fr_auto] grid-cols-1 sm:grid-rows-1 sm:grid-cols-[1fr_auto] gap-2 items-start\">\n <div\n className=\"max-w-prose text-sm prose\"\n dangerouslySetInnerHTML={{\n __html: I18n.t(\"js.calendars.appointment.recurrence-pattern.hint\"),\n }}\n />\n <a\n href={`/appointments/${recurringAppointmentId}/edit`}\n className=\"btn btn-primary flex gap-2 justify-center items-center\"\n >\n <FontAwesomeIcon icon={faArrowsRepeat} />\n {I18n.t(\"js.calendars.appointment.recurrence-pattern.edit_series\")}\n </a>\n </div>\n );\n}\n","import React from \"react\";\nimport moment from \"moment/moment\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport { faXmark } from \"@fortawesome/pro-regular-svg-icons\";\nimport Label from \"components/shared/form/Label\";\nimport { compact, isEmpty, map } from \"lodash\";\nimport DateTimePicker from \"components/shared/form/fields/DateTimePicker\";\nimport classNames from \"classnames\";\nimport PartialToggle from \"components/appointments/form/PartialToggle\";\nimport Select from \"components/shared/form/fields/Select\";\nimport Checkbox from \"components/shared/form/fields/Checkbox\";\n\ntype DateSelectArgs = {\n name: string;\n label?: string;\n required?: boolean;\n};\nexport default function DateRangeSelectField({\n label,\n required = false,\n}: DateSelectArgs) {\n return (\n <div className=\"control-group\">\n {label && <Label label={label} required={required} />}\n <div className=\"controls border-box\">\n <DateRangeSelect />\n </div>\n </div>\n );\n}\n\nfunction DateRangeSelect() {\n const { setValue } = useFormContext();\n const { all_day, start, time_zone, end } = useWatch({\n control: undefined,\n name: \"date\",\n });\n\n const selectOptions = compact(\n map(moment.tz.names(), (zone) => {\n const invalid = zone.startsWith(\"Etc/\") || /^[A-Z0-9+-]+$/.test(zone);\n\n if (!invalid) {\n return {\n value: zone,\n label: `${zone.replace(/\\//g, \", \").replace(/_/g, \" \")} (${moment.tz\n .zone(zone)\n ?.abbr(moment.tz(start, time_zone.value).valueOf())})`,\n };\n } else {\n return null;\n }\n }),\n );\n\n return (\n <div className=\"flex flex-col p-3 gap-y-3\">\n <DateTimePicker\n name=\"date.start\"\n label={I18n.t(\"js.calendars.date_range.start_date.label\")}\n showTimePicker={!all_day}\n showTimezone\n timeZone={time_zone.value}\n />\n <Checkbox\n name=\"date.all_day\"\n label={I18n.t(\"js.calendars.date_range.all_day\")}\n />\n <PartialToggle\n onToggle={(showPartial) => {\n setValue(\n \"date.end\",\n showPartial ? null : end || moment(start).add(1, \"hour\").format(),\n );\n }}\n label={(showPartial) =>\n showPartial\n ? I18n.t(\"js.calendars.date_range.remove_end\")\n : I18n.t(\"js.calendars.date_range.set_end.link\")\n }\n hideIcon={faXmark}\n iconClassName={(showPartial) =>\n classNames({ \"text-danger\": showPartial })\n }\n shouldShowPartial={!isEmpty(end)}\n >\n <DateTimePicker\n name=\"date.end\"\n label={I18n.t(\"js.calendars.date_range.end\")}\n showTimePicker={!all_day}\n />\n </PartialToggle>\n\n {!all_day && (\n <>\n <PartialToggle\n label={I18n.t(\"js.calendars.date_range.timezone.select_label\")}\n >\n <Select\n label={I18n.t(\"js.calendars.date_range.timezone.label\")}\n name=\"date.time_zone\"\n options={selectOptions}\n />\n </PartialToggle>\n </>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport Select from \"react-select\";\nimport { map, isEmpty, includes, get } from \"lodash\";\nimport { useQuery } from \"react-query\";\nimport { stringify } from \"query-string\";\nimport { Control, Controller, ControllerRenderProps } from \"react-hook-form\";\nimport Label from \"components/shared/form/Label\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinner } from \"@fortawesome/pro-regular-svg-icons\";\n\ntype MeetingRoom = {\n name: string;\n occupied: boolean;\n};\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<MeetingRoom[]>(url, { enabled: loadData });\n};\n\ntype MeetingRoomSelectArgs = {\n dateRange: {\n start: string;\n end?: string;\n };\n control: Control<any>;\n};\n\nexport default function MeetingRoomSelectField({\n dateRange,\n control,\n}: MeetingRoomSelectArgs) {\n return (\n <div className=\"control-group remove-input-txt-border\">\n <Label\n label={I18n.t(\"js.calendars.appointment.meeting.meeting_rooms.label\")}\n />\n <div className=\"controls\">\n <Controller\n name=\"meeting\"\n control={control}\n render={({ field }) =>\n MeetingRoomSelect({\n field,\n dateRange,\n disabled: !dateRange.end,\n })\n }\n />\n </div>\n </div>\n );\n}\n\nfunction MeetingRoomSelect({\n field,\n dateRange,\n disabled,\n}: {\n field: ControllerRenderProps<any, \"meeting\">;\n dateRange: MeetingRoomSelectArgs[\"dateRange\"];\n disabled: boolean;\n}) {\n const preSelectedRoomId = get(field.value, \"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 function handleChange(value: { [key: string]: string } | undefined) {\n field.onChange(value ? { room_id: value.id, room_name: value.name } : null);\n }\n\n const selectOptions = map(meetingRooms, (room) => ({\n value: room,\n label:\n room.name +\n (room.occupied\n ? \" \" + I18n.t(\"js.calendars.appointment.meeting.occupied\")\n : \"\"),\n isDisabled: room.occupied,\n }));\n\n return loading ? (\n <div className=\"text-danger border-box py-1.5 px-3\">\n <FontAwesomeIcon icon={faSpinner} spin />{\" \"}\n {I18n.t(\"js.calendars.appointment.meeting.meeting_rooms.loading\")}\n </div>\n ) : error ? (\n <div className=\"text-danger border-box py-1.5 px-3\">\n {I18n.t(\"js.generic_error\")}\n </div>\n ) : isEmpty(meetingRooms) && !disabled ? (\n <div className=\"text-danger border-box py-1.5 px-3\">\n {I18n.t(\"js.calendars.appointment.meeting.meeting_rooms.nothing_free\")}\n </div>\n ) : (\n <>\n <Select\n value={\n includes(map(meetingRooms, \"id\"), get(field.value, \"room_id\"))\n ? { value: field.value.room_id, label: field.value.room_name }\n : null\n }\n options={selectOptions}\n onChange={(selectedOption) => handleChange(selectedOption?.value)}\n placeholder={I18n.t(\n \"js.calendars.appointment.meeting.meeting_rooms.select\",\n )}\n classNamePrefix=\"form-select\"\n isDisabled={disabled}\n isClearable\n unstyled\n />\n <span className=\"text-muted text-sm\">\n {disabled\n ? I18n.t(\"js.calendars.appointment.meeting.meeting_rooms.select_hint\")\n : I18n.t(\"js.calendars.appointment.meeting.buffer_time\")}\n </span>\n </>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { FormProvider, useForm, useWatch } from \"react-hook-form\";\nimport {\n ApplicationConfiguration,\n Appointment,\n AttendeeConfiguration,\n TeamsConfig,\n} from \"../../../@types/appointments\";\nimport TextInput from \"components/shared/form/fields/TextInput\";\nimport TextEditor from \"components/shared/form/fields/TextEditor\";\nimport Select from \"components/shared/form/fields/Select\";\nimport {\n compact,\n concat,\n filter,\n find,\n forEach,\n isEmpty,\n keys,\n map,\n omit,\n orderBy,\n pull,\n some,\n startsWith,\n toLower,\n} from \"lodash\";\nimport {\n useCalendars,\n useCreateAppointment,\n useUpdateAppointment,\n} from \"components/appointments/api\";\nimport moment from \"moment\";\nimport RecurringSelectField from \"components/appointments/form/RecurringSelectField\";\nimport LocationField from \"components/appointments/form/LocationField\";\nimport ParticipantsField from \"components/appointments/form/ParticipantsField\";\nimport TeamsConfigField from \"components/appointments/form/TeamsConfigField\";\nimport FileUploadField from \"components/shared/form/fields/FileUploadField\";\nimport EventSettings from \"components/appointments/form/EventSettings\";\nimport { Category } from \"../../../@types/appointmentCategories\";\nimport Checkbox from \"components/shared/form/fields/Checkbox\";\nimport ModifiedRecurringAppointmentHint from \"components/appointments/form/ModifiedRecurringAppointmentHint\";\nimport Label from \"components/shared/form/Label\";\nimport usePublishAllVolatile from \"helpers/files/usePublishAllVolatile\";\nimport FormActions from \"components/shared/form/fields/FormActions\";\nimport { ValueType } from \"components/shared/DirectoryPicker/types\";\nimport DateRangeSelectField from \"components/appointments/form/DateRangeSelectField\";\nimport MeetingRoomSelectField from \"components/shared/MeetinRoomSelectField\";\n\nexport type AppointmentFormData = {\n name: string;\n description: string;\n calendars: { value: string; label: string }[];\n date: {\n all_day: boolean;\n start: string;\n end?: string;\n same_day: boolean;\n time_zone: { label: string; value: string };\n };\n recurrence_pattern: {\n recurrence_frequency: \"never\" | \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\n recurrence_end_time: string | null;\n };\n meeting?: {\n room_id: string;\n reservation_id: string;\n room_name: string;\n } | null;\n location: {\n address1: string | null;\n address2: string | null;\n city: string | null;\n country: string | null;\n link: string | null;\n maps_url: string | null;\n meeting_link_type: string | null;\n name: string | null;\n zip: string | null;\n };\n participants: ValueType[];\n teams_configuration: TeamsConfig;\n event_files: File[];\n event_image: File | File[];\n category: (Category & { value?: string }) | null;\n consultants: string;\n organizer: string;\n contacts: ValueType[];\n attendee_configuration: AttendeeConfiguration;\n application_configuration: ApplicationConfiguration;\n invite_consumers: boolean;\n post_to_stream: boolean;\n is_event: boolean;\n};\n\ntype AppointmentFormArgs = {\n appointment?: Appointment;\n date?: { start: string; all_day: boolean } | null;\n calendarId?: string | null;\n};\n\nexport default function AppointmentForm({\n appointment,\n date,\n calendarId,\n}: AppointmentFormArgs) {\n const isRecurring = appointment?.type === \"recurring_appointment\" || false;\n const isNormal = appointment?.type === \"appointment\" || false;\n const isModifiedRecurring =\n (appointment?.type === \"virtual_appointment\" &&\n startsWith(appointment?.id, \"r-\")) ||\n false;\n\n const isExisting = !!appointment?.id;\n\n const { data: calendars } = useCalendars();\n\n const publishAllVolatile = usePublishAllVolatile();\n\n const { mutate: createAppointment, isLoading: isCreating } =\n useCreateAppointment({\n onSuccess,\n onError,\n });\n const { mutate: updateAppointment, isLoading: isUpdating } =\n useUpdateAppointment({\n onSuccess,\n onError,\n });\n\n const [filesLoading, setFilesLoading] = useState(false);\n\n const calendarSelectRef = useRef<HTMLDivElement>(null);\n const dateRangeRef = useRef<HTMLDivElement>(null);\n\n const defaultStartDate = appointment?.date.start\n ? moment(appointment?.date.start)\n : date\n ? moment(date?.start)\n : moment().add(1, \"hour\").startOf(\"hour\");\n\n const defaultEndDate = appointment?.date.end\n ? moment(appointment?.date.end)\n : isExisting\n ? null\n : moment(defaultStartDate).add(1, \"hour\");\n\n const methods = useForm<AppointmentFormData>({\n defaultValues: {\n name: appointment?.name || \"\",\n description: appointment?.description || \"\",\n calendars: appointment\n ? compact(\n map(appointment?.calendar_ids, (calendar_id) => {\n const calendar = find(calendars, { id: calendar_id });\n\n return calendar && { value: calendar_id, label: calendar.name };\n }),\n )\n : [],\n date: {\n start: defaultStartDate.format(),\n end: defaultEndDate?.format(),\n all_day: appointment?.date.all_day || date?.all_day,\n time_zone: {\n label: `${appointment?.date.time_zone || moment.tz.guess()} (${moment\n .tz(\n appointment?.date.start || moment().format(),\n appointment?.date.time_zone || moment.tz.guess(),\n )\n .format(\"z\")})`,\n value: appointment?.date.time_zone || moment.tz.guess(),\n },\n same_day: appointment?.date.same_day || true,\n },\n recurrence_pattern: appointment?.recurrence_pattern || {\n recurrence_frequency: \"never\",\n },\n meeting: appointment?.meeting,\n location: appointment?.location,\n participants: appointment?.participants,\n event_files: appointment?.event_files || [],\n teams_configuration: appointment?.teams_configuration,\n event_image: appointment?.event_image ? [appointment?.event_image] : [],\n category: appointment?.category || {\n value: \"-1\",\n label: I18n.t(\"js.calendars.appointment.category.no_selection\"),\n },\n consultants: appointment?.consultants,\n contacts: appointment?.contacts.map((c) => ({ ...c, type: \"member\" })),\n organizer: appointment?.organizer,\n attendee_configuration: appointment?.attendee_configuration || {\n user_can_opt: false,\n },\n application_configuration: appointment?.application_configuration || {\n currency: \"€\",\n },\n invite_consumers: false,\n is_event: appointment?.is_event || false,\n },\n });\n\n const { handleSubmit, control, register, setValue } = methods;\n\n const selectedDate = useWatch({ control, name: \"date\" });\n const selectedEventFiles = useWatch({ control, name: \"event_files\" });\n const selectedEventImage = useWatch({ control, name: \"event_image\" });\n\n function onSuccess(newAppointment: Appointment) {\n location.replace(`/appointments/${newAppointment.id}`);\n }\n\n function onError() {\n toastr.error(I18n.t(\"generic_error\"));\n }\n\n function onValidationError(errors) {\n forEach(document.getElementsByClassName(\"field-error\"), (element) => {\n element?.classList.remove(\"field-error\");\n });\n\n forEach(errors, (error, name) => {\n if (name === \"calendars\") {\n calendarSelectRef?.current?.classList.add(\"field-error\");\n } else {\n error?.ref?.classList.add(\"field-error\");\n }\n toastr.error(error?.message || I18n.t(\"generic_error\"));\n });\n }\n\n useEffect(() => {\n setFilesLoading(\n some(concat(selectedEventFiles, selectedEventImage), {\n state: \"uploading\",\n }),\n );\n }, [selectedEventFiles, selectedEventImage]);\n\n useEffect(() => {\n if (calendars) {\n let defaultCalendars: { value: string; label: string }[] = [];\n\n if (appointment)\n defaultCalendars = compact(\n map(appointment?.calendar_ids, (calendar_id) => {\n const calendar = find(calendars, { id: calendar_id });\n\n return calendar && { value: calendar_id, label: calendar.name };\n }),\n );\n\n if (calendarId) {\n const preSelectedCalendar = find(calendars, { id: calendarId });\n if (preSelectedCalendar)\n defaultCalendars = [\n {\n value: preSelectedCalendar.id,\n label: preSelectedCalendar.name,\n },\n ];\n }\n setValue(\"calendars\", defaultCalendars);\n }\n }, [calendars]);\n\n async function submit(data: AppointmentFormData) {\n forEach(document.getElementsByClassName(\"field-error\"), (element) => {\n element?.classList.remove(\"field-error\");\n });\n\n if (\n data.date.end &&\n moment(data.date.end).isBefore(moment(data.date.start))\n ) {\n toastr.error(I18n.t(\"js.calendars.validation_errors.end_lt_start\"));\n dateRangeRef?.current?.classList.add(\"field-error\");\n dateRangeRef?.current?.scrollIntoView({ behavior: \"smooth\" });\n return;\n }\n\n let newAppointmentData: any = { ...data };\n\n if (data.category?.value === \"-1\") {\n newAppointmentData.category = null;\n } else {\n newAppointmentData.category = data.category?.value;\n }\n\n if (!Preload.current_network.can.create_meetings) {\n newAppointmentData.meeting = null;\n }\n\n newAppointmentData[\"calendar_ids\"] = map(data.calendars, \"value\");\n newAppointmentData[\"membership_ids_to_invite\"] = map(\n filter(data.participants, { type: \"member\" }),\n \"id\",\n );\n newAppointmentData[\"membership_role_ids_to_invite\"] = map(\n filter(data.participants, { type: \"membership_role\" }),\n \"id\",\n );\n newAppointmentData[\"group_ids_to_invite\"] = map(\n filter(data.participants, { type: \"group\" }),\n \"id\",\n );\n newAppointmentData[\"contact_ids\"] = map(data.contacts, \"id\");\n\n if (!isEmpty(selectedEventFiles)) {\n const result = await publishAllVolatile({\n values: {\n event_files: selectedEventFiles,\n },\n storageDirectory: \"files\",\n });\n\n newAppointmentData.event_files = map(result.event_files, (file) =>\n file.state\n ? { ...file, file_object_id: file.id, id: null, type: \"file\" }\n : file,\n );\n } else {\n newAppointmentData.event_files = [];\n }\n\n if (!isEmpty(selectedEventImage)) {\n const result = await publishAllVolatile({\n values: {\n event_image: selectedEventImage,\n },\n storageDirectory: \"images\",\n });\n newAppointmentData.event_image = result.event_image[0]\n ? result.event_image[0].state\n ? omit(\n {\n ...result.event_image[0],\n file_object_id: result.event_image[0].id,\n },\n \"id\",\n )\n : result.event_image[0]\n : {};\n } else {\n newAppointmentData.event_image = null;\n }\n\n newAppointmentData = omit(newAppointmentData, [\n \"calendars\",\n \"participants\",\n \"contacts\",\n ]);\n\n newAppointmentData = {\n ...newAppointmentData,\n date: {\n ...newAppointmentData.date,\n time_zone: newAppointmentData.date.time_zone.value,\n },\n };\n\n appointment\n ? updateAppointment({\n appointmentId: appointment.id,\n ...newAppointmentData,\n })\n : createAppointment(newAppointmentData);\n }\n\n return (\n <FormProvider {...methods}>\n <form\n className=\"form-horizontal mb-6\"\n onSubmit={handleSubmit(submit, onValidationError)}\n >\n {appointment && isModifiedRecurring && (\n <ModifiedRecurringAppointmentHint appointmentId={appointment.id} />\n )}\n <TextInput\n label={I18n.t(\"js.calendars.calendar.name\")}\n name=\"name\"\n register={register}\n placeholder={I18n.t(\"js.calendars.appointment.name.placeholder\")}\n required={I18n.t(\"js.calendars.validation_errors.name_empty\")}\n />\n <TextEditor\n name=\"description\"\n control={control}\n label={I18n.t(\"js.calendars.appointment.description.label\")}\n placeholder={I18n.t(\n \"js.calendars.appointment.description.placeholder\",\n )}\n />\n {!isModifiedRecurring && (\n <div ref={calendarSelectRef}>\n <Select\n name=\"calendars\"\n label={I18n.t(\"js.calendars.appointment.calendars.label\")}\n options={orderBy(\n map(\n filter(calendars, (cal) => cal.can.create_appointments),\n (calendar) => ({\n value: calendar.id,\n label: calendar.name,\n }),\n ),\n (cal) => toLower(cal.label),\n \"asc\",\n )}\n placeholder={I18n.t(\"calendars.calendars_select.placeholder\")}\n control={control}\n multi\n required={I18n.t(\n \"js.calendars.validation_errors.calendars_empty\",\n )}\n />\n </div>\n )}\n <div ref={dateRangeRef}>\n <DateRangeSelectField\n label={I18n.t(\"js.calendars.appointment.date_range.label\")}\n name=\"date\"\n required\n />\n </div>\n {!isModifiedRecurring && !isNormal && (\n <RecurringSelectField\n label={I18n.t(\"js.calendars.appointment.recurrence_pattern.label\")}\n name=\"recurrence_pattern\"\n control={control}\n startDate={selectedDate.start}\n required\n />\n )}\n {Preload.current_network.can.create_meetings &&\n !isRecurring &&\n !isModifiedRecurring && (\n <MeetingRoomSelectField\n dateRange={{\n start: selectedDate.start,\n end: selectedDate.end,\n }}\n control={control}\n />\n )}\n {Preload.current_member?.can?.see_teams_event_options &&\n !isRecurring &&\n !isModifiedRecurring && (\n <TeamsConfigField\n register={register}\n control={control}\n setValue={setValue}\n />\n )}\n {!isModifiedRecurring && (\n <LocationField\n register={register}\n shouldShowLocationDetails={some(\n pull(keys(appointment?.location), \"name\"),\n (key) => !isEmpty(appointment?.location[key]),\n )}\n />\n )}\n {!appointment && (\n <ParticipantsField control={control} register={register} />\n )}\n {!isModifiedRecurring && (\n <FileUploadField\n control={control}\n name={\"event_files\"}\n label={I18n.t(\"js.calendars.appointment.files.label\")}\n options={{\n multiple: true,\n selectExisting: true,\n }}\n hint={I18n.t(\n \"js.calendars.appointment.files.attachment_disclaimer\",\n )}\n />\n )}\n {!isModifiedRecurring && (\n <EventSettings\n control={control}\n register={register}\n setValue={setValue}\n />\n )}\n <div className=\"control-group\">\n <Label label={I18n.t(\"js.calendars.appointment.activity.label\")} />\n <div className=\"controls border-box p-3\">\n <Checkbox\n name=\"post_to_stream\"\n register={register}\n label={I18n.t(\"js.calendars.appointment.post_to_stream\")}\n />\n </div>\n </div>\n <FormActions\n onCancel={(e) => {\n e.preventDefault();\n window.location.pathname = appointment\n ? `/appointments/${appointment.id}`\n : \"/appointments\";\n }}\n saveDisabled={isUpdating || isCreating || filesLoading}\n />\n </form>\n </FormProvider>\n );\n}\n","import React from \"react\";\nimport AppointmentForm from \"components/appointments/form/AppointmentForm\";\nimport { useSearchParams } from \"helpers/tixxt-router\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport moment from \"moment\";\n\nexport default function AppointmentNewPage() {\n const [searchParams] = useSearchParams();\n const date = searchParams.get(\"date\");\n const calendarId = searchParams.get(\"calendar_id\");\n const startDate = moment(date)\n .set({ hour: moment().hour() })\n .add(1, \"hour\")\n .startOf(\"hour\");\n\n return (\n <>\n <PageTitle title={I18n.t(\"js.calendars.new_appointment\")} />\n <AppointmentForm\n date={date ? { start: startDate.format(), all_day: false } : null}\n calendarId={calendarId}\n />\n </>\n );\n}\n","import React from \"react\";\nimport AppointmentForm from \"components/appointments/form/AppointmentForm\";\nimport { useAppointment } from \"components/appointments/api\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport { camelCase, includes, upperFirst } from \"lodash\";\nimport CustomConfigurator from \"components/../CustomConfigurator\";\n\nexport default function AppointmentEditPage() {\n const { id } = useParams();\n const { data: appointment, isLoading } = useAppointment(id);\n\n // appointment types with custom forms: bitkom_campaign\n const FormComponent = includes(\n [\"appointment\", \"recurring_appointment\", \"virtual_appointment\"],\n appointment?.type,\n )\n ? AppointmentForm\n : CustomConfigurator.get(\n `appointments.edit.form.${upperFirst(\n camelCase(appointment?.type),\n )}Form`,\n );\n\n return (\n <>\n <PageTitle title={appointment?.name || \"\"} />\n {isLoading\n ? I18n.t(\"js.loading\")\n : FormComponent && <FormComponent appointment={appointment} />}\n </>\n );\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faArrowLeft as faRegularArrowLeft,\n faArrowsRepeat as faRegularArrowsRepeat,\n faPencil as faRegularPencil,\n faEnvelope as faRegularEnvelope,\n faUsers as faRegularUsers,\n faUnlock as faRegularUnlock,\n faLock as faRegularLock,\n faFileCsv as faRegularFileCsv,\n faFileExcel as faRegularFileExcel,\n faBan as faRegularBan,\n faTrash as faRegularTrash,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCaretLeft as faSolidCaretLeft,\n faCaretRight as faSolidCaretRight,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport DropDown, { DropDownItem } from \"components/shared/DropDown\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport classNames from \"classnames\";\nimport { some } from \"lodash\";\nimport { useNavigate } from \"helpers/tixxt-router\";\n\ntype ToolbarArgs = {\n id: string;\n can: { [key: string]: boolean };\n participationLocked?: boolean;\n participantsEmpty?: boolean;\n isRecurring?: boolean;\n name: string;\n type: string;\n canceled?: boolean;\n refetch: () => void;\n isModifiedRecurring?: boolean;\n previousOccurrenceUrl?: string;\n recurringAppointmentUrl?: string;\n nextOccurrenceUrl?: string;\n cancelProhibitedReason?: string;\n};\n\nexport default function Toolbar({\n id,\n can,\n participationLocked,\n participantsEmpty,\n cancelProhibitedReason,\n isRecurring,\n name,\n isModifiedRecurring,\n previousOccurrenceUrl,\n recurringAppointmentUrl,\n nextOccurrenceUrl,\n refetch,\n type,\n canceled,\n}: ToolbarArgs) {\n const navigate = useNavigate();\n const { mutate: toggleLockParticipation } = useMutation(\n () =>\n fetchApi(`/appointments/${id}`, {\n method: \"PATCH\",\n body: {\n appointment: {\n attendee_configuration: {\n participation_locked: !participationLocked,\n },\n },\n },\n }),\n {\n onSuccess: () => {\n toastr.success(\n I18n.t(\n `js.calendars.appointment.attendee_configuration.request.${\n participationLocked ? \"unlocked\" : \"locked\"\n }.success`,\n ),\n );\n refetch();\n },\n onError: () => {\n toastr.error(\n I18n.t(\n \"js.calendars.appointment.attendee_configuration.request.failure\",\n ),\n );\n },\n },\n );\n\n const { mutate: cancel } = useMutation(() =>\n fetchApi(`/appointments/${id}/cancel`, {\n method: \"POST\",\n }),\n );\n\n const { mutate: destroy } = useMutation(\n () =>\n fetchApi(`/appointments/${id}`, {\n method: \"DELETE\",\n }),\n {\n onSuccess: () => {\n toastr.success(I18n.t(\"js.calendars.appointment.delete_success\"));\n navigate(\"/appointments\");\n },\n },\n );\n\n const showContextMenu = some(\n [\n \"update\",\n \"contact\",\n \"update_participants\",\n \"download_attendees\",\n \"update_participants\",\n \"destroy\",\n ],\n (key) => can[key],\n );\n\n return (\n <div className=\"btn-toolbar mb-10\">\n <button\n className=\"btn btn-light btn-sm\"\n onClick={(e) => {\n e.preventDefault();\n navigate(\"/appointments\");\n }}\n >\n <FontAwesomeIcon className=\"text-primary\" icon={faRegularArrowLeft} />\n </button>\n {isModifiedRecurring && (\n <div>\n {previousOccurrenceUrl && (\n <a\n className=\"btn\"\n href={previousOccurrenceUrl}\n title={I18n.t(\n \"js.calendars.recurring_appointment.previous_occurrence_tooltip\",\n )}\n >\n <FontAwesomeIcon icon={faSolidCaretLeft} />\n </a>\n )}\n {recurringAppointmentUrl && (\n <a className=\"btn btn-primary\" href={recurringAppointmentUrl}>\n <FontAwesomeIcon icon={faRegularArrowsRepeat} className=\"mr-1\" />\n {I18n.t(\n \"js.calendars.recurring_appointment.show_recurring_button\",\n )}\n </a>\n )}\n {nextOccurrenceUrl && (\n <a\n className=\"btn\"\n href={nextOccurrenceUrl}\n title={I18n.t(\n \"js.calendars.recurring_appointment.next_occurrence_tooltip\",\n )}\n >\n <FontAwesomeIcon icon={faSolidCaretRight} />\n </a>\n )}\n </div>\n )}\n <div className={classNames({ \"btn-group\": showContextMenu })}>\n <a\n className=\"btn btn-primary\"\n href={`${id}.ics`}\n title={I18n.t(\"js.calendars.appointment.ical_download\")}\n >\n {I18n.t(\"js.calendars.appointment.ical_download_button\")}\n </a>\n {showContextMenu && <DropDown.Toggle />}\n <DropDown className=\"context-menu dropdown-menu\">\n {can.update && (\n <>\n <DropDownItem\n icon={faRegularPencil}\n iconClassName=\"text-muted\"\n text={I18n.t(\"js.calendars.appointment.edit\")}\n url={`${id}/edit`}\n />\n <li className=\"divider\" />\n </>\n )}\n {can.contact && (\n <>\n <DropDownItem\n url={`${id}/contact`}\n icon={faRegularEnvelope}\n iconClassName=\"text-muted\"\n text={I18n.t(\n \"js.calendars.appointment.attendees.contact.title\",\n )}\n />\n <li className=\"divider\" />\n </>\n )}\n {can.update_participants && (\n <DropDownItem\n url={`${id}/participants`}\n icon={faRegularUsers}\n iconClassName=\"text-muted\"\n text={I18n.t(\"js.calendars.appointment.participations.manage\")}\n />\n )}\n {can.update && type !== \"recurring_appointment\" && (\n <DropDownItem\n onSelect={(e) => {\n e.preventDefault();\n toggleLockParticipation();\n }}\n icon={participationLocked ? faRegularUnlock : faRegularLock}\n iconClassName=\"text-muted\"\n text={\n participationLocked\n ? I18n.t(\n \"js.calendars.appointment.attendee_configuration.participation_unlock\",\n )\n : I18n.t(\n \"js.calendars.appointment.attendee_configuration.participation_lock\",\n )\n }\n />\n )}\n {can.download_attendees && !participantsEmpty && (\n <>\n <DropDownItem\n url={`${id}/attendees.csv`}\n icon={faRegularFileCsv}\n iconClassName=\"text-muted\"\n text={I18n.t(\"js.calendars.appointment.invitees.download_as\", {\n file_ending: \"CSV\",\n })}\n />\n <DropDownItem\n url={`${id}/attendees.xlsx`}\n icon={faRegularFileExcel}\n iconClassName=\"text-muted\"\n text={I18n.t(\"js.calendars.appointment.invitees.download_as\", {\n file_ending: \"XLSX\",\n })}\n />\n </>\n )}\n {can.update_participants && !participantsEmpty && (\n <li className=\"divider\" />\n )}\n {can.destroy && (\n <>\n <DropDownItem\n onSelect={(e) => {\n e.preventDefault();\n !canceled &&\n window.bridge?.confirm(\n I18n.t(\n isRecurring\n ? \"calendars.recurring_appointment.confirm_cancel\"\n : \"calendars.appointment.confirm_cancel\",\n { appointment_name: name },\n ),\n () => cancel(),\n );\n }}\n icon={faRegularBan}\n linkStyle={classNames({\n \"pointer-events-none disabled\": canceled,\n })}\n iconClassName=\"text-muted\"\n text={I18n.t(\"js.calendars.appointment.cancel\")}\n title={cancelProhibitedReason}\n />\n <li className=\"divider\" />\n </>\n )}\n {can.destroy && (\n <DropDownItem\n onSelect={(e) => {\n e.preventDefault();\n window.bridge?.confirm(\n I18n.t(\n isRecurring\n ? \"calendars.recurring_appointment.confirm_destroy\"\n : \"calendars.appointment.confirm_destroy\",\n { appointment_name: name },\n ),\n () => destroy(),\n );\n }}\n icon={faRegularTrash}\n linkStyle=\"!text-danger\"\n iconClassName=\"text-danger\"\n text={I18n.t(\"js.calendars.appointment.delete\")}\n />\n )}\n </DropDown>\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faTrashCan as faRegularTrashCan,\n faLock as faRegularLock,\n faEye as faRegularEye,\n faArrowDownToBracket as faRegularArrowDownToBracket,\n faTimes as faRegularTimes,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport { faFile as faSolidFile } from \"@fortawesome/pro-solid-svg-icons\";\nimport FileIcon from \"components/shared/FileIcon\";\nimport { addDays, isAfter } from \"date-fns\";\nimport { AppointmentFile } from \"../../@types/appointments\";\nimport { includes } from \"lodash\";\nimport classNames from \"classnames\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nexport default function FileRow(file: AppointmentFile) {\n const [showLockAction, setShowLockAction] = useState(false);\n const [isLocked, setIsLocked] = useState(\n file.locked_until\n ? isAfter(new Date(file.locked_until), new Date())\n : false,\n );\n\n const { mutate: lock } = useMutation(\n () =>\n fetchApi(`/api/storage/${file.url}/lock`, {\n method: \"PUT\",\n body: {\n locked_unitl: addDays(\n new Date(),\n Preload.current_network.config.files.default_lock_period_in_days,\n ),\n },\n }),\n {\n onSuccess: () => {\n setShowLockAction(false);\n setIsLocked(true);\n },\n },\n );\n\n const isOpenable =\n includes([\"application/pdf\", \"text/html\"], file.content_type) ||\n file.content_type?.indexOf(\"image/\") === 0 ||\n file.content_type?.indexOf(\"text/\") === 0;\n\n const resourceUrl = `/api/storage/files/${file.id}/get/${encodeURIComponent(\n file.original_filename || file.name,\n )}?_=${\n file.updated_at ? new Date(file.updated_at).valueOf() : Date.now().valueOf()\n }`;\n\n return (\n <>\n <div\n className={classNames(\"file-infos flex pt-2 pb-1 items-center gap-2\", {\n hidden: showLockAction,\n })}\n >\n {!file.name && !file.url ? (\n <>\n <span className=\"fa-layers fa-fw shrink-0\">\n <FontAwesomeIcon icon={faSolidFile} size=\"xl\" />\n <FontAwesomeIcon\n className=\"text-white\"\n icon={faRegularTrashCan}\n size=\"xl\"\n transform=\"shrink-5 down-3\"\n />\n </span>\n <span className=\"text-muted grow\">\n {I18n.t(\"js.files.show.deleted_file_name\")}\n </span>\n </>\n ) : (\n <>\n <FileIcon extension={file.extension} />\n <a\n href={`/files/${file.id}`}\n title={file.name}\n className=\"grow truncate\"\n >\n {isLocked && (\n <FontAwesomeIcon\n className=\"mr-1 text-normal\"\n title={I18n.t(\"js.files.show.simple_lock_hint\")}\n icon={faRegularLock}\n />\n )}\n {file.name}\n </a>\n </>\n )}\n <span className=\"file-actions flex gap-2 shrink-0\">\n {isOpenable && (\n <a\n className=\"muted decoration-0\"\n href={resourceUrl}\n target=\"_blank\"\n title={I18n.t(\"js.files.show.open_file\")}\n rel=\"noreferrer\"\n >\n <FontAwesomeIcon icon={faRegularEye} />\n </a>\n )}\n <a\n className=\"muted decoration-0\"\n href={`${resourceUrl}&download`}\n onClick={() => {\n file.can.lock && !isLocked && setShowLockAction(true);\n }}\n target=\"_blank\"\n title={I18n.t(\"js.files.show.download_file\")}\n aria-label={I18n.t(\"js.files.show.download_file\")}\n rel=\"noreferrer\"\n >\n <FontAwesomeIcon icon={faRegularArrowDownToBracket} />\n </a>\n </span>\n </div>\n <div\n className={classNames(\"file-lock flex pt-2 pb-2\", {\n hidden: !showLockAction,\n })}\n >\n <span className=\"file-lock-text flex flex-1 ml-7\">\n {I18n.t(\"js.files.show.lock_on_download_hint_short\")}\n <a\n className=\"ml-2\"\n data-action=\"lock\"\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n lock();\n }}\n >\n {I18n.t(\"js.files.show.lock_on_download_yes\")}\n </a>\n </span>\n <span className=\"file-actions\">\n <a\n href=\"#\"\n tabIndex={-1}\n aria-label={I18n.t(\"js.no_action\")}\n onClick={(e) => {\n e.preventDefault();\n setShowLockAction(false);\n }}\n >\n <FontAwesomeIcon icon={faRegularTimes} />\n </a>\n </span>\n </div>\n </>\n );\n}\n","import React, { useState } from \"react\";\nimport { Appointment } from \"../../../@types/appointments\";\nimport { map, take } from \"lodash\";\n\nimport FileRow from \"components/shared/FileRow\";\n\ntype AppointmentEventFilesArgs = {\n eventFiles: Appointment[\"event_files\"];\n};\n\nexport default function AppointmentEventFiles({\n eventFiles,\n}: AppointmentEventFilesArgs) {\n const [showMoreFiles, setShowMoreFiles] = useState(false);\n const files = showMoreFiles ? eventFiles : take(eventFiles, 2);\n\n return (\n <div className=\"attachments files files-region detail-wrap\">\n <strong className=\"files-title block font-semibold mb-4\">\n {I18n.t(\"js.activity.attachments.files_label\")}\n </strong>\n <div>\n {map(files, (file, index) => (\n <FileRow key={index} {...file} />\n ))}\n </div>\n {eventFiles.length > 2 && !showMoreFiles && (\n <div className=\"show-more flex flex-1 items-center mt-1\">\n <span className=\"fa-layers fa-fw mr-2\">\n <i className=\"fa-regular fa-paperclip-vertical text-gray-400 fa-lg\"></i>\n </span>\n <a\n className=\"grow\"\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n setShowMoreFiles(true);\n }}\n >\n {eventFiles.length - 2 === 1\n ? I18n.t(\"js.activity.attachments.show_one_more_file\")\n : I18n.t(\"js.activity.attachments.show_more_files\", {\n file_count: eventFiles.length - 2,\n })}\n </a>\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\ntype TranslationArgs = {\n component?: React.ElementType;\n translation: string;\n variables: { [key: string]: string | null };\n};\n\nexport default function Translation({\n component: Component = \"div\",\n translation,\n variables,\n}: TranslationArgs) {\n const isHtml = translation.endsWith(\"_html\");\n const isMarkdown = translation.endsWith(\"_md\");\n\n return isHtml || isMarkdown ? (\n <Component\n dangerouslySetInnerHTML={{\n __html: isMarkdown\n ? Application.markdown(I18n.t(translation, variables))\n : I18n.t(translation, variables),\n }}\n />\n ) : (\n <Component>{I18n.t(translation, variables)}</Component>\n );\n}\n","import React, { ReactElement, ReactNode } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { head, isEmpty, map } from \"lodash\";\nimport {\n faCoffee,\n faUser,\n faBullhorn,\n faMoneyBill,\n faHome,\n faExternalLink,\n faTimer,\n faPhone,\n faPencilSquare,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport { format } from \"date-fns\";\nimport {\n ApplicationConfiguration,\n Appointment,\n AttendeeConfiguration,\n} from \"../../../@types/appointments\";\nimport { Membership } from \"../../../@types\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport Translation from \"components/shared/Translation\";\n\nfunction Detail({\n icon,\n type = \"\",\n children,\n text,\n label,\n translated,\n}: {\n icon: IconProp;\n type?: string;\n children?: ReactNode[] | ReactElement;\n text?: string;\n label?: string;\n translated?: boolean;\n}) {\n return (\n <div className=\"detail-wrap\">\n <strong>\n {I18n.t(label || `js.calendars.appointment.${type}.label`)}\n </strong>\n <div className={`detail-block ${type}`}>\n <FontAwesomeIcon icon={icon} className=\"detail-icon\" />\n {children ? children : text || \"\"}\n {translated && (\n <div style={{ color: \"grey\", fontSize: \"x-small\" }}>(translated)</div>\n )}\n </div>\n </div>\n );\n}\n\ntype AppointmentEventDetailsArgs = {\n category: string | null;\n attendeeConfig: AttendeeConfiguration;\n consultants: string;\n applicationConfig: ApplicationConfiguration;\n organizer: string;\n contacts: Membership[];\n attendingParticipantsCount: number;\n teamsParticipantsCount: number;\n createdAt: string;\n genericAuthor?: Appointment[\"generic_author\"];\n author: Appointment[\"author\"];\n lastAuthor: Appointment[\"last_author\"];\n updatedAt: string;\n translated?: boolean;\n};\n\nexport default function AppointmentEventDetails({\n category,\n attendeeConfig,\n consultants,\n applicationConfig,\n organizer,\n contacts,\n attendingParticipantsCount,\n teamsParticipantsCount,\n createdAt,\n genericAuthor,\n author,\n updatedAt,\n lastAuthor,\n translated,\n}: AppointmentEventDetailsArgs) {\n return (\n <div className=\"event-details\">\n {category && <Detail type=\"category\" icon={faCoffee} text={category} />}\n {attendeeConfig?.total && (\n <Detail type=\"attendee_configuration\" icon={faUser}>\n {attendeeConfig.total_attendees_enforced && (\n <>{attendingParticipantsCount} /</>\n )}\n {attendeeConfig.total}\n {teamsParticipantsCount > 0 && (\n <>\n {I18n.t(\n \"administration.consumer_manager.teams_participants_list_title\",\n {\n count: teamsParticipantsCount,\n },\n )}\n </>\n )}\n </Detail>\n )}\n {consultants && (\n <Detail type=\"consultants\" icon={faBullhorn} text={consultants} />\n )}\n {applicationConfig?.registration_with_costs && (\n <Detail\n icon={faMoneyBill}\n label=\"js.calendars.application_configuration.costs.label\"\n >\n <>\n {!applicationConfig.costs || applicationConfig.costs == 0\n ? I18n.t(\n \"js.calendars.application_configuration.costs.not_set_info\",\n )\n : `${applicationConfig.costs} ${\n applicationConfig.currency || I18n.t(\"js.currency\")\n }`}\n </>\n </Detail>\n )}\n {organizer && (\n <Detail\n type=\"organizer\"\n icon={faHome}\n text={organizer}\n translated={translated}\n />\n )}\n {applicationConfig?.url && (\n <Detail\n icon={faExternalLink}\n label=\"js.calendars.application_configuration.ticket_url.label\"\n >\n {applicationConfig.url.match(/^https?:\\/\\//) ? (\n <a\n href={applicationConfig.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {applicationConfig.url}\n </a>\n ) : (\n <span>{applicationConfig.url}</span>\n )}\n </Detail>\n )}\n {applicationConfig?.registration_required && (\n <Detail\n icon={faTimer}\n label=\"js.calendars.application_configuration.registration_deadline.label\"\n >\n {applicationConfig.registration_deadline ? (\n <time>\n {format(\n new Date(applicationConfig.registration_deadline),\n \"dd.MM.y\",\n )}\n </time>\n ) : (\n <div>\n {I18n.t(\n \"js.calendars.application_configuration.registration_deadline.not_set_info\",\n )}\n </div>\n )}\n </Detail>\n )}\n {!isEmpty(contacts) && (\n <Detail icon={faPhone} type=\"contacts\">\n {contacts.length === 1 ? (\n <a href={head(contacts)?.path}>{head(contacts)?.name}</a>\n ) : (\n <ul>\n {map(contacts, (contact) => (\n <li key={contact.path}>\n <a href={contact.path}>{contact.name}</a>\n </li>\n ))}\n </ul>\n )}\n </Detail>\n )}\n {createdAt && (\n <Detail label=\"js.calendars.appointment.creation\" icon={faPencilSquare}>\n <Translation\n component=\"span\"\n translation={\n genericAuthor?.path || author?.path\n ? \"js.calendars.appointment.created_at_from_html\"\n : \"js.calendars.appointment.created_at_from_without_link\"\n }\n variables={{\n at_time: format(\n new Date(createdAt),\n I18n.t(\"js.time.formats.date_fns.compact_datetime\"),\n ),\n actor_url:\n genericAuthor?.path || author?.path\n ? genericAuthor?.path || author?.path || \"\"\n : null,\n actor_name:\n genericAuthor?.name ||\n `${author?.name}${\n author?.detection_profile_field\n ? ` (${author?.detection_profile_field})`\n : \"\"\n }`,\n }}\n />\n <br />\n <strong>{I18n.t(\"js.calendars.appointment.last_edit\")}</strong>\n <br />\n {format(\n new Date(updatedAt),\n I18n.t(\"js.time.formats.date_fns.compact_datetime\") + \" \",\n )}\n {lastAuthor && (\n <Translation\n component=\"span\"\n translation={\n lastAuthor.path\n ? \"js.calendars.appointment.updated_from_html\"\n : \"js.calendars.appointment.updated_from_without_link\"\n }\n variables={\n lastAuthor.path\n ? {\n url: lastAuthor.path,\n name: `${lastAuthor.name}${\n lastAuthor.detection_profile_field\n ? ` (${lastAuthor.detection_profile_field})`\n : \"\"\n }`,\n }\n : {\n name: `${lastAuthor.name}${\n lastAuthor.detection_profile_field\n ? ` (${lastAuthor.detection_profile_field})`\n : \"\"\n }`,\n }\n }\n />\n )}\n </Detail>\n )}\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport {\n get,\n reduce,\n isEmpty,\n values,\n countBy,\n sortedIndexBy,\n lowerCase,\n map,\n concat,\n sortBy,\n} from \"lodash\";\nimport { NameWithProfileField } from \"components/memberships/MemberNameWithAdditions\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faCircle as faSolidCircle,\n faAdjust as faSolidAdjust,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport {\n faCircle as faRegularCircle,\n faChevronRight as faRegularChevronRight,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport classNames from \"classnames\";\nimport { Participant } from \"../../@types/appointments\";\n\nconst SMALL_BREAKPOINT = 640;\n\nfunction StatusIcon({\n status,\n className,\n}: {\n status: string;\n className: string;\n}) {\n switch (status) {\n case \"open\":\n case \"invited\":\n return (\n <span className={`fa-layers ${className}`}>\n <FontAwesomeIcon className={\"text-white w-3\"} icon={faSolidCircle} />\n <FontAwesomeIcon className={\"text-muted w-3\"} icon={faSolidAdjust} />\n </span>\n );\n case \"accepted\":\n return (\n <FontAwesomeIcon\n className={`accept-invite-text w-3 ${className}`}\n icon={faSolidCircle}\n />\n );\n default:\n return (\n <span className={`fa-layers ${className}`}>\n <FontAwesomeIcon className={\"text-white w-3\"} icon={faSolidCircle} />\n <FontAwesomeIcon\n className={\"text-danger w-3\"}\n icon={faRegularCircle}\n />\n </span>\n );\n }\n}\n\ntype RoleArgs = {\n id: string;\n name: string;\n plural_name: string;\n participants: Participant[];\n display_type: string;\n};\n\nfunction Role({ name, plural_name, participants, display_type }: RoleArgs) {\n const [collapsed, setCollapsed] = useState(\n display_type === \"grouped\" || window.innerWidth < SMALL_BREAKPOINT,\n );\n\n return (\n <div className={classNames({ hidden: isEmpty(participants) })}>\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={faRegularChevronRight}\n />\n </h3>\n <ul\n className={classNames(\"membership-list participant-list\", {\n hidden: collapsed,\n })}\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[], participant: 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\ntype ParticipantsListArgs = {\n participants: Participant[];\n showParticipants: boolean;\n consumersCount: number;\n teamsOnlyParticipantsCount: number;\n};\n\nexport default function ParticipantsList({\n participants,\n showParticipants,\n consumersCount,\n teamsOnlyParticipantsCount,\n}: ParticipantsListArgs) {\n let roles: RoleArgs[] = [];\n if (showParticipants) {\n const defaultRole = {\n id: \"default\",\n name: \"\",\n display_type: \"\",\n plural_name: I18n.t(\"js.calendars.appointment.rsvp.guests\"),\n participants: [],\n };\n const participantsByRole = reduce<Participant, { [key: string]: RoleArgs }>(\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 = concat(\n [defaultRole],\n sortBy(values(participantsByRole), (role) => role.plural_name),\n );\n }\n\n return (\n <div className={\"space-y-6\"}>\n {map(roles, (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 ParticipantsList from \"components/appointments/ParticipantsList\";\nimport React, { useState } from \"react\";\nimport {\n Appointment,\n AppointmentInvite,\n Participant,\n} from \"../../../@types/appointments\";\nimport { escape, includes, map } from \"lodash\";\nimport classNames from \"classnames\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinner } from \"@fortawesome/pro-regular-svg-icons\";\nimport RecurringAppointmentDecisionModal from \"components/shared/RecurringAppointmentDecisionModal\";\nimport Translation from \"components/shared/Translation\";\n\ntype AppointmentParticipationsArgs = {\n participants: Participant[];\n canShowAttendees: boolean;\n invitedConsumers: Appointment[\"invited_consumers\"];\n teamsOnlyParticipantsCount: number;\n canOpt: boolean;\n myInvite?: AppointmentInvite;\n myParticipation?: Participant;\n participationLocked: boolean;\n totalAttendeesExceeded: boolean;\n showRecurringDecisionModal: boolean;\n appointmentId: string;\n refetch: () => void;\n};\n\nexport default function AppointmentParticipations({\n appointmentId,\n participants,\n canShowAttendees,\n invitedConsumers,\n teamsOnlyParticipantsCount,\n canOpt,\n myInvite,\n myParticipation,\n participationLocked,\n totalAttendeesExceeded,\n showRecurringDecisionModal,\n refetch,\n}: AppointmentParticipationsArgs) {\n const [showDecisionModal, setShowDecisionModal] = useState(false);\n const [updatingStatus, setUpdatingStatus] = useState<\n \"open\" | \"accepted\" | \"declined\" | \"\"\n >(\"\");\n const { mutate: updateStatus, isLoading } = useMutation<\n unknown,\n Error,\n { status: \"open\" | \"accepted\" | \"declined\" | \"\"; apply_to?: string }\n >(\n ({ status, apply_to }) =>\n fetchApi(\n `/appointments/${appointmentId}/participants/${\n myParticipation?.id ? `${myParticipation.id}` : \"me\"\n }`,\n {\n method: \"PUT\",\n body: { status, apply_to },\n },\n ),\n { onSuccess: () => refetch() },\n );\n\n function onUpdateStatus(\n e: React.MouseEvent<HTMLButtonElement>,\n status: \"open\" | \"accepted\" | \"declined\",\n ) {\n e.preventDefault();\n setUpdatingStatus(status);\n\n if (showRecurringDecisionModal) {\n setShowDecisionModal(true);\n } else {\n updateStatus({ status });\n }\n }\n\n const localeKey = {\n accepted: \"accept\",\n declined: \"decline\",\n open: \"no_answer\",\n };\n\n return (\n <>\n <RecurringAppointmentDecisionModal\n showModal={showDecisionModal}\n onClose={() => {\n setShowDecisionModal(false);\n }}\n handleDecision={(apply_to: string) => {\n updateStatus({ status: updatingStatus, apply_to });\n setShowDecisionModal(false);\n }}\n />\n {myInvite && (\n <div className=\"widget\">\n <Translation\n translation=\"js.calendars.appointment.rsvp.invited_by_html\"\n variables={{\n inviter: `<a href=\"${escape(myInvite.author?.path)}\">${escape(\n myInvite.author?.name,\n )}</a>`,\n }}\n />\n </div>\n )}\n\n {canOpt && (\n <div className=\"widget\">\n <div\n className=\"participation-actions btn-group-vertical w-full\"\n data-toggle=\"buttons-radio\"\n >\n {map(\n [\"accepted\", \"declined\", \"open\"],\n (statusKey: \"open\" | \"accepted\" | \"declined\") => (\n <button\n key={statusKey}\n className={classNames(\"btn text-left btn-light\", {\n active: myParticipation?.status === statusKey,\n \"btn-alert-success\":\n myParticipation?.status === statusKey &&\n statusKey === \"accepted\",\n \"btn-danger\":\n myParticipation?.status === statusKey &&\n statusKey === \"declined\",\n \"btn-gray\":\n myParticipation?.status === statusKey &&\n includes([\"open\", \"invited\"], statusKey),\n })}\n onClick={(e) => onUpdateStatus(e, statusKey)}\n disabled={\n participationLocked ||\n (statusKey === \"accepted\" && totalAttendeesExceeded)\n }\n >\n {isLoading && updatingStatus === statusKey && (\n <>\n <FontAwesomeIcon icon={faSpinner} spin />{\" \"}\n </>\n )}\n {I18n.t(\n `js.calendars.appointment.rsvp.${localeKey[statusKey]}`,\n )}\n </button>\n ),\n )}\n </div>\n </div>\n )}\n <ParticipantsList\n participants={participants}\n showParticipants={canShowAttendees}\n consumersCount={invitedConsumers}\n teamsOnlyParticipantsCount={teamsOnlyParticipantsCount}\n />\n </>\n );\n}\n","import React from \"react\";\nimport { Appointment } from \"../../../@types/appointments\";\nimport { isBefore } from \"date-fns\";\nimport { filter, find, includes, isEmpty, map } from \"lodash\";\nimport { TZDate } from \"@date-fns/tz\";\nimport { useCalendars } from \"components/appointments/api\";\nimport AppointmentLocation from \"components/appointments/details/AppointmentLocation\";\nimport AppointmentDate from \"components/appointments/details/AppointmentDate\";\nimport AppointmentMeeting from \"components/appointments/details/AppointmentMeeting\";\nimport AppointmentEventFiles from \"components/appointments/details/AppointmentEventFiles\";\nimport AppointmentEventDetails from \"components/appointments/details/AppointmentEventDetails\";\nimport AppointmentParticipations from \"components/appointments/details/AppointmentParticipations\";\nimport formatDate from \"helpers/formatDate\";\nimport AppointmentDescription from \"components/appointments/details/AppointmentDescription\";\n\nexport default function AppointmentDetails({\n isRecurring,\n refetch,\n translated,\n ...appointment\n}: Appointment & {\n isRecurring: boolean;\n refetch: () => void;\n translated?: boolean;\n}) {\n const { data: calendars } = useCalendars();\n const appointmentStart = new Date(appointment.date.start);\n const today = new Date();\n const appointmentEnd = appointment.date.end\n ? new Date(appointment.date.end)\n : null;\n\n const isPast =\n isBefore(appointmentStart, today) &&\n (isEmpty(appointmentEnd) ||\n (appointmentEnd && isBefore(appointmentEnd, today))) &&\n (!isRecurring ||\n (appointment.recurrence_pattern &&\n appointment.recurrence_pattern.recurrence_end_time &&\n isBefore(\n new TZDate(\n appointment.recurrence_pattern.recurrence_end_time,\n appointment.date.time_zone,\n ),\n new TZDate(appointment.date.time_zone),\n )));\n\n const isDifferentTimeZone =\n !appointment.date.all_day &&\n Intl.DateTimeFormat().resolvedOptions().timeZone !==\n appointment.date.time_zone;\n\n const appointmentCalendars = filter(calendars, (cal) =>\n includes(appointment.calendar_ids, cal.id),\n ).concat(appointment.unknown_calendars || []);\n\n const myParticipation = find(appointment.participants, { id: \"me\" });\n\n return (\n <div className=\"sm:grid sm:grid-cols-3 gap-6 pb-4\">\n <div className=\"sm:col-span-2 order-1\">\n {appointment.canceled && (\n <div className=\"alert alert-error\">\n {I18n.t(\"js.calendars.appointment.canceled\")}\n </div>\n )}\n {isPast && (\n <div className=\"alert alert-info\">\n {Preload.current_network.config.appointments.opt_retroactively\n ? I18n.t(\"js.calendars.appointment_in_past_with_opt\")\n : I18n.t(\"js.calendars.appointment_in_past_without_opt\")}\n </div>\n )}\n {isDifferentTimeZone && (\n <div className=\"alert alert-info\">\n {I18n.t(\"js.calendars.appointment.original_timezone\", {\n timezone: `${appointment.date.time_zone\n .replace(/\\//g, \", \")\n .replace(/_/g, \" \")} (UTC${formatDate(\n TZDate.tz(appointment.date.time_zone),\n \"xxx\",\n )})`,\n })}\n </div>\n )}\n <div className=\"border-box bg-primary/10 border-primary/25 px-2 py-4 text-sm space-y-4 break-words\">\n <div className=\"detail-calendars\">\n <ol className=\"calendar-list flex flex-wrap gap-2 mb-8\">\n {map(appointmentCalendars, (cal) => (\n <li className=\"flex gap-1 items-center\" key={cal.id}>\n <i\n className=\"w-4 h-4 block rounded-full\"\n style={{ backgroundColor: `#${cal.color}` }}\n />\n {cal.name}\n </li>\n ))}\n </ol>\n </div>\n <AppointmentDate\n date={appointment.date}\n isRecurring={isRecurring}\n recurrence_pattern={appointment.recurrence_pattern}\n next_occurrence_date={appointment.next_occurrence_date}\n next_occurrence_url={appointment.next_occurrence_url}\n />\n <AppointmentLocation {...appointment.location} />\n {appointment.meeting && appointment.meeting.join_url && (\n <AppointmentMeeting\n date={appointment.date}\n meeting={appointment.meeting}\n appointmentName={appointment.name}\n canStartMeeting={appointment.can.start_meeting}\n appointmentId={appointment.id}\n />\n )}\n {appointment.teams_configuration?.join_url &&\n myParticipation?.membership.upn && (\n <div className=\"text-center\">\n <a\n href={appointment.teams_configuration.join_url}\n className=\"btn btn-light\"\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n >\n <img\n src={Assets[\"teams_16x2.png\"]}\n className=\"w-4 inline mr-1\"\n />\n <span>\n {I18n.t(\"js.calendars.appointment.teams.join_link\")}\n </span>\n </a>\n </div>\n )}\n {appointment.teams_configuration?.teams_event &&\n myParticipation?.membership.show_add_upn_link && (\n <div className=\"text-center\">\n <a\n href=\"/users/edit\"\n className=\"btn btn-warning\"\n target=\"_blank\"\n rel=\"nofollow noopener\"\n >\n <img\n src={Assets[\"teams_16x2.png\"]}\n className=\"w-4 inline mr-1\"\n />\n <span>\n {I18n.t(\"js.calendars.appointment.teams.oauth_link\")}\n </span>\n </a>\n </div>\n )}\n <AppointmentDescription\n description={\n appointment.description_rendered || appointment.description\n }\n isRendered={!isEmpty(appointment.description_rendered)}\n translated={translated}\n />\n </div>\n {!isEmpty(appointment.event_files) && (\n <AppointmentEventFiles eventFiles={appointment.event_files} />\n )}\n <AppointmentEventDetails\n category={appointment.category?.toString() || null}\n contacts={appointment.contacts}\n attendeeConfig={appointment.attendee_configuration}\n applicationConfig={appointment.application_configuration}\n attendingParticipantsCount={appointment.attending_participants_count}\n teamsParticipantsCount={\n appointment.teams_configuration?.teams_only_participants_count\n }\n organizer={appointment.organizer}\n consultants={appointment.consultants}\n createdAt={appointment.created_at}\n updatedAt={appointment.updated_at}\n genericAuthor={appointment.generic_author}\n author={appointment.author}\n lastAuthor={appointment.last_author}\n translated={translated}\n />\n </div>\n <div className=\"flex flex-col gap-6 sm:block sm:col-span-1 -order-1 sm:order-2 sm:space-y-6\">\n {appointment.event_image && (\n <img\n className=\"flex-1 rounded\"\n src={appointment.event_image.large_thumb}\n alt={I18n.t(\"js.calendars.appointment.event_image.alt\")}\n />\n )}\n <AppointmentParticipations\n appointmentId={appointment.id}\n canShowAttendees={appointment.can.show_attendees}\n participants={appointment.participants}\n invitedConsumers={appointment.invited_consumers}\n teamsOnlyParticipantsCount={\n appointment.teams_configuration?.teams_only_participants_count\n }\n canOpt={appointment.can.opt}\n myInvite={appointment.my_invite}\n myParticipation={myParticipation}\n participationLocked={\n appointment.attendee_configuration?.participation_locked\n }\n totalAttendeesExceeded={\n appointment.total_attendees_enforced_and_exceeded\n }\n showRecurringDecisionModal={\n appointment.type === \"virtual_appointment\"\n }\n refetch={refetch}\n />\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { useAppointment } from \"components/appointments/api\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport PageTitle, { Subtitle } from \"components/layout/PageTitle\";\nimport { camelCase, includes, isEmpty, startsWith, upperFirst } from \"lodash\";\nimport Toolbar from \"components/appointments/details/Toolbar\";\nimport AppointmentDetails from \"components/appointments/details/AppointmentDetails\";\nimport TranslationDropDown, {\n ORIGINAL_LANGUAGE_SIGNIFIER,\n} from \"components/shared/TranslationDropDown\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faArrowsRepeat } from \"@fortawesome/pro-regular-svg-icons\";\nimport PageLoading from \"components/shared/PageLoading\";\nimport CustomConfigurator from \"components/../CustomConfigurator\";\n\nexport default function AppointmentPage() {\n const { id } = useParams();\n const { data: appointment, isLoading } = useAppointment(id);\n\n // appointment types with custom forms: bitkom_campaign\n const AppointmentPageComponent = includes(\n [\"appointment\", \"recurring_appointment\", \"virtual_appointment\"],\n appointment?.type,\n )\n ? DefaultAppointmentPage\n : CustomConfigurator.get(\n `appointments.show.${upperFirst(camelCase(appointment?.type))}`,\n );\n\n if (isLoading) {\n return <PageLoading />;\n }\n\n return <>{AppointmentPageComponent && <AppointmentPageComponent />}</>;\n}\n\nexport function DefaultAppointmentPage() {\n const { id } = useParams();\n const [appointmentLang, setAppointmentLang] = useState<string | undefined>();\n const {\n data: appointment,\n isLoading,\n refetch,\n } = useAppointment(id, appointmentLang);\n\n const isRecurring =\n appointment?.type === \"recurring_appointment\" &&\n !startsWith(appointment?.id, \"r-\");\n\n const isModifiedRecurring =\n appointment?.type === \"virtual_appointment\" &&\n startsWith(appointment?.id, \"r-\");\n\n const handleLanguageSelect = (\n event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n language: string,\n ) => {\n if (language === ORIGINAL_LANGUAGE_SIGNIFIER) {\n setAppointmentLang(undefined);\n } else {\n setAppointmentLang(language);\n }\n };\n\n return isLoading ? (\n <PageLoading />\n ) : (\n appointment && (\n <>\n <PageTitle title={appointment?.name}>\n {(isRecurring || isModifiedRecurring) && (\n <FontAwesomeIcon\n icon={faArrowsRepeat}\n title={I18n.t(\"js.recurring_appointment.icon.title\")}\n />\n )}\n <TranslationDropDown\n handleLanguageSelect={handleLanguageSelect}\n object_language={Preload.current_network.language}\n />\n {appointmentLang && (\n <span\n style={{\n color: \"grey\",\n fontSize: \"x-small\",\n }}\n >\n (translated)\n </span>\n )}\n </PageTitle>\n <Subtitle className=\"mb-3\">\n {isRecurring\n ? I18n.t(\"js.calendars.recurring_appointment.subtitle\")\n : I18n.t(\"js.calendars.appointment.subtitle\")}\n </Subtitle>\n <Toolbar\n id={appointment.id}\n type={appointment.type}\n can={appointment.can}\n participationLocked={\n appointment.attendee_configuration.participation_locked\n }\n participantsEmpty={isEmpty(appointment.participants)}\n isRecurring={isRecurring}\n name={appointment.name}\n isModifiedRecurring={isModifiedRecurring}\n previousOccurrenceUrl={appointment.previous_occurrence_url}\n recurringAppointmentUrl={appointment.recurring_appointment_url}\n nextOccurrenceUrl={appointment.next_occurrence_url}\n refetch={refetch}\n canceled={appointment.canceled}\n cancelProhibitedReason={appointment.cancel_prohibited_reason}\n />\n <AppointmentDetails\n {...appointment}\n isRecurring={isRecurring}\n refetch={refetch}\n translated={!!appointmentLang}\n />\n </>\n )\n );\n}\n","import React, { useRef } from \"react\";\nimport { reduce, map, forEach, defer, keys } from \"lodash\";\n\nimport { useCreateAppointmentContact } from \"./api\";\nimport { Appointment } from \"../../@types/appointments\";\nimport { useNavigate } from \"helpers/tixxt-router\";\nimport { useForm } from \"react-hook-form\";\nimport TextInput from \"components/shared/form/fields/TextInput\";\nimport Hint from \"components/shared/form/fields/Hint\";\nimport TextEditor from \"components/shared/form/fields/TextEditor\";\nimport Select from \"components/shared/form/fields/Select\";\nimport Checkbox from \"components/shared/form/fields/Checkbox\";\nimport Label from \"components/shared/form/Label\";\nimport FormActions from \"components/shared/form/fields/FormActions\";\n\ntype ContactArgs = {\n appointment: Appointment;\n};\n\ntype FormData = {\n audience: {\n label: string;\n value: \"all\" | \"accepted\" | \"declined\" | \"no_reaction\";\n };\n subject: string;\n text: string;\n include_attachments: boolean;\n};\n\nexport default function Contact({ appointment }: ContactArgs) {\n const navigate = useNavigate();\n const { handleSubmit, register, control } = useForm<FormData>({\n defaultValues: {\n audience: {\n label: I18n.t(\n \"js.calendars.appointment.attendees.contact.audience.all\",\n ),\n value: \"all\",\n },\n },\n });\n\n const textEditorRef = useRef<HTMLDivElement | null>(null);\n\n const attachmentSize = reduce(\n map(appointment.event_files, (file) => file.size),\n (sum: any, size: any) => sum + size,\n 0,\n );\n const hasAttachments = attachmentSize > 0;\n const areAttachmentsInLimit =\n attachmentSize <=\n Preload.current_network.config.email_recommendations.attachment_size_limit;\n\n const { mutate: createAppointmentContact, isLoading } =\n useCreateAppointmentContact({\n onSuccess: () => {\n toastr.success(I18n.t(\"js.saving_successful\"));\n navigate(`/appointments/${appointment.id}`);\n },\n onError: () => {\n toastr.error(I18n.t(\"js.generic_error\"));\n },\n });\n\n const submit = (values: FormData) => {\n return createAppointmentContact({\n appointmentId: appointment.id,\n contact: { ...values, audience: values.audience.value },\n });\n };\n\n const audienceOptions = map(\n [\"all\", \"accepted\", \"declined\", \"no_reaction\"],\n (opt) => ({\n value: opt,\n label: I18n.t(\n `js.calendars.appointment.attendees.contact.audience.${opt}`,\n ),\n }),\n );\n\n function onValidationError(errors) {\n forEach(document.getElementsByClassName(\"field-error\"), (element) => {\n element?.classList.remove(\"field-error\");\n });\n\n forEach(errors, (error, name) => {\n if (name === \"text\") {\n defer(() => {\n textEditorRef?.current?.classList.add(\"field-error\");\n if (keys(errors)[0] === \"text\")\n textEditorRef?.current\n ?.querySelector<HTMLDivElement>(\"[contenteditable]\")\n ?.focus();\n });\n } else {\n error?.ref?.classList.add(\"field-error\");\n }\n toastr.error(I18n.t(\"generic_error\"));\n });\n }\n\n return (\n <form\n className=\"form-horizontal mb-6\"\n onSubmit={handleSubmit(submit, onValidationError)}\n >\n <Hint\n text={I18n.t(\"js.calendars.appointment.attendees.contact.general_help\")}\n usabilityHint\n />\n <Select\n name=\"audience\"\n label={I18n.t(\n \"js.calendars.appointment.attendees.contact.audience.label\",\n )}\n options={audienceOptions}\n control={control}\n />\n <TextInput\n label={I18n.t(\"js.calendars.appointment.attendees.contact.subject\")}\n name=\"subject\"\n register={register}\n placeholder={I18n.t(\"js.calendars.appointment.name.placeholder\")}\n required\n />\n <TextEditor\n name=\"text\"\n control={control}\n label={I18n.t(\"js.calendars.appointment.attendees.contact.text\")}\n textEditorRef={textEditorRef}\n required\n />\n {hasAttachments && (\n <div className=\"control-group\">\n <Label\n label={I18n.t(\n \"js.calendars.appointment.attendees.contact.attachments\",\n )}\n />\n <div className=\"controls border-box p-3\">\n <Checkbox\n name=\"include_attachments\"\n register={register}\n label={I18n.t(\n \"js.calendars.appointment.attendees.contact.include_attachments\",\n )}\n disabled={!areAttachmentsInLimit}\n />\n {!areAttachmentsInLimit && (\n <Hint\n text={I18n.t(\n \"js.activitystreams.email_recommendations.attachments_too_large\",\n {\n limit: `${\n Preload.current_network.config.email_recommendations\n .attachment_size_limit /\n 1024 /\n 1024\n }MB`,\n },\n )}\n />\n )}\n </div>\n </div>\n )}\n <FormActions\n onCancel={(e) => {\n e.preventDefault();\n navigate(`/appointments/${appointment.id}`);\n }}\n saveDisabled={isLoading}\n />\n </form>\n );\n}\n","import React from \"react\";\nimport Contact from \"components/appointments/Contact\";\nimport { useNavigate, useParams } from \"helpers/tixxt-router\";\nimport { useAppointment } from \"components/appointments/api\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faArrowLeft, faSpinner } from \"@fortawesome/pro-regular-svg-icons\";\nimport PageTitle from \"components/layout/PageTitle\";\n\nexport default function AppointmentContactPage() {\n const { id } = useParams();\n const { data: appointment, isLoading } = useAppointment(id);\n const navigate = useNavigate();\n\n return (\n <div>\n <PageTitle\n title={I18n.t(\"js.calendars.appointment.attendees.contact.title\")}\n />\n <div className=\"btn-toolbar mb-10\">\n <button\n className=\"btn btn-light btn-sm\"\n onClick={(e) => {\n e.preventDefault();\n navigate(`/appointments/${id}`);\n }}\n >\n <FontAwesomeIcon className=\"text-primary\" icon={faArrowLeft} />\n </button>\n </div>\n {isLoading ? (\n <p>\n <FontAwesomeIcon className=\"mr-2\" icon={faSpinner} spin />\n {I18n.t(\"js.calendars.appointment.loading\")}\n </p>\n ) : (\n appointment && <Contact appointment={appointment} />\n )}\n </div>\n );\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 { isEmpty } from \"lodash\";\nimport AppointmentInvite, { AppointmentInviteDate } from \"./AppointmentInvite\";\n\ntype AppointmentParticipationArgs = {\n appointment: {\n id: string;\n name: string;\n status: string;\n date: {\n start: string;\n all_day: boolean;\n same_day: boolean;\n end: string;\n };\n participation_locked: boolean;\n };\n invited_by: {\n id: string;\n name: string;\n };\n status: string;\n inviteStatus: string;\n invitable_type: string;\n id: string;\n reloadInvites: () => void;\n};\n\nfunction AppointmentParticipation({\n appointment,\n invited_by,\n status,\n inviteStatus,\n reloadInvites,\n ...invite\n}: AppointmentParticipationArgs) {\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 participation_locked: appointment.participation_locked,\n }}\n renderDate={(props) => <AppointmentInviteDate {...props} />}\n renderMeta={() => null}\n reloadInvites={reloadInvites}\n {...invite}\n />\n ) : null;\n}\n\nexport default AppointmentParticipation;\n","import React from \"react\";\nimport { map, isEmpty } from \"lodash\";\nimport AppointmentInvite, {\n AppointmentInviteDate,\n AppointmentInviteMeta,\n} from \"components/appointments/AppointmentInvite\";\nimport RecurringAppointmentInvite from \"components/appointments/RecurringAppointmentInvite\";\nimport AppointmentParticipation from \"components/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\ntype InvitesListArgs = {\n inviteType: string;\n invites: {\n type: string;\n data: { invitable_type: string; _type: string; id: string }[];\n };\n inviteStatus: string;\n loadMore: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n canLoadMore: boolean;\n isLoading: boolean;\n reloadInvites: () => void;\n};\nexport default function InvitesList({\n invites,\n inviteType,\n inviteStatus,\n isLoading,\n loadMore,\n canLoadMore,\n reloadInvites,\n}: InvitesListArgs) {\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 reloadInvites={reloadInvites}\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 {canLoadMore && !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","import React, { useEffect, useState } from \"react\";\nimport { flatten, includes, map } from \"lodash\";\nimport preventDefault from \"../../helpers/components/preventDefault\";\nimport UnreadBadge from \"components/shared/UnreadBadge\";\nimport InvitesList from \"components/invites/InvitesList\";\nimport { useFeaturesUnreads } from \"../../api/unreads\";\nimport { useInvites } from \"components/invites/api\";\nimport { useInfiniteQuery } from \"react-query\";\nimport fetchPaginatedData from \"helpers/api/fetchPaginatedData\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport classNames from \"classnames\";\n\nfunction useParticipations({ status, enabled }) {\n return useInfiniteQuery(\n [\"participations\", status],\n ({ pageParam = `/api/v1/participations?status=${status}&limit=20` }) =>\n fetchPaginatedData({ pageParam }),\n {\n getNextPageParam: (lastPage) => lastPage.nextPage,\n enabled,\n },\n );\n}\n\nexport default function InvitesPage() {\n const { data: unreads, refetch: reloadUnreads } = useFeaturesUnreads();\n const [activeTab, setActiveTab] = useState(\"open\");\n const isInvitesTab = includes([\"open\", \"expired\", \"obsolete\"], activeTab);\n\n const {\n data: invitesData,\n isLoading: isLoadingInvites,\n refetch: reloadInvites,\n fetchNextPage: loadMoreInvites,\n hasNextPage: canLoadMoreInvites,\n } = useInvites({\n filter: \"appointments\",\n status: activeTab,\n enabled: isInvitesTab,\n });\n\n const {\n data: participationsData,\n isLoading: isLoadingParticipations,\n refetch: reloadParticipations,\n fetchNextPage: loadMoreParticipations,\n hasNextPage: canLoadMoreParticipations,\n } = useParticipations({\n status: activeTab,\n enabled: !isInvitesTab,\n });\n\n const [items, setItems] = useState(\n isInvitesTab\n ? {\n type: \"invites\",\n data: flatten(map(invitesData?.pages, (page) => page.data)),\n }\n : {\n type: \"participations\",\n data: flatten(map(participationsData?.pages, (page) => page.data)),\n },\n );\n\n function load() {\n isInvitesTab ? reloadInvites() : reloadParticipations();\n\n reloadUnreads();\n }\n\n useEffect(() => {\n const updateItems = () => {\n if (isInvitesTab) {\n setItems({\n type: \"invites\",\n data: flatten(map(invitesData?.pages, (page) => page.data)),\n });\n } else {\n setItems({\n type: \"participations\",\n data: flatten(map(participationsData?.pages, (page) => page.data)),\n });\n }\n };\n updateItems();\n }, [activeTab, invitesData, participationsData]);\n\n function loadMore(e: React.MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n\n if (isInvitesTab) {\n loadMoreInvites();\n } else {\n loadMoreParticipations();\n }\n }\n\n const tabs = [\n \"open\",\n \"upcoming\",\n \"accepted\",\n \"declined\",\n \"expired\",\n \"obsolete\",\n ];\n\n return (\n <>\n <PageTitle title={I18n.t(\"calendars.invites.title\")} />\n <div className=\"tixxt-tabs-layout\">\n <div className=\"tabs-region\">\n <ul className=\"nav nav-tabs\">\n {map(tabs, (tab) => (\n <li className={classNames({ active: activeTab === tab })}>\n <a onClick={preventDefault(() => setActiveTab(tab))} href=\"#\">\n <div className=\"flex gap-1 items-center\">\n {I18n.t(`js.calendars.appointments.invites.tabs.${tab}`)}\n {tab === \"open\" && (\n <UnreadBadge count={unreads?.Calendars} />\n )}\n </div>\n </a>\n </li>\n ))}\n </ul>\n </div>\n <div className=\"tab-content-region\">\n <InvitesList\n isLoading={isLoadingInvites || isLoadingParticipations}\n inviteType=\"appointments\"\n inviteStatus={activeTab}\n invites={items}\n loadMore={loadMore}\n canLoadMore={\n canLoadMoreInvites || canLoadMoreParticipations || false\n }\n reloadInvites={load}\n />\n </div>\n </div>\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/AppointmentsPage\";\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\";\nimport AppointmentNewPage from \"components/appointments/AppointmentNewPage\";\nimport AppointmentEditPage from \"components/appointments/AppointmentEditPage\";\nimport AppointmentPage from \"components/appointments/AppointmentPage\";\nimport AppointmentContactPage from \"components/appointments/AppointmentContactPage\";\nimport Invites from \"components/appointments/InvitesPage\";\n\nconst backboneRoutes: RouteObject[] = convertRoutes({\n feature: \"Calendars\",\n featureRoutes: {\n \"calendars/my\": \"showMyCalendars\",\n \"calendars/shared\": \"showSharedCalendars\",\n },\n});\n\nconst reactRoutes: RouteObject[] = [\n { path: \"/groups/:groupSlug/calendars\", element: <AppointmentsPage /> },\n { path: \"/appointments\", element: <AppointmentsPage /> },\n { path: \"/appointments/new\", element: <AppointmentNewPage /> },\n { path: \"/appointments/:id/edit\", element: <AppointmentEditPage /> },\n {\n path: \"/appointments/participating\",\n element: <AppointmentsPage participating />,\n },\n {\n path: \"/appointments/invites\",\n element: <Invites />,\n },\n {\n path: \"/appointments/:id\",\n element: <AppointmentPage />,\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 path: \"/appointments/:id/contact\",\n element: <AppointmentContactPage />,\n },\n];\n\nexport default backboneRoutes.concat(reactRoutes);\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 { faReply } from \"@fortawesome/pro-solid-svg-icons\";\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={faReply}\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 { UseQueryResult, useMutation, useQuery, useQueries } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { SimpleMembership } from \"../../@types\";\nimport { Message } from \"components/messages/@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\ntype CustomUseQueryResult<TData, TError> = UseQueryResult<TData, TError> & {\n isTranslating?: boolean;\n};\n\nexport function useFetchMessage(\n messageId: string,\n messageLang: string | undefined,\n options = {},\n): CustomUseQueryResult<Message, unknown> {\n const result = useQuery<Message>(\n [\"message\", messageId],\n () => fetchApi(`/api/v1/messages/${messageId}`),\n options,\n );\n\n const foreignMessageIds = getForeignMessageIds(result.data);\n const { data: translatedMessages, isLoading: isTranslating } =\n useTranslateMessages(foreignMessageIds, messageLang);\n\n if (result.data && translatedMessages) {\n const translatedMessage =\n translatedMessages.find((message) => message.id === result.data.id) || {};\n\n const translatedResult = {\n ...result,\n isTranslating: isTranslating,\n data: {\n ...result.data,\n ...translatedMessage,\n translated: translatedMessage.html_content,\n conversation: addTranslationsToConversation(\n result.data.conversation,\n translatedMessages,\n ),\n },\n };\n\n return translatedResult;\n }\n\n return { ...result, isTranslating };\n}\n\nfunction getForeignMessageIds(data?: Message) {\n let foreignMessageIds: string[] = [];\n\n if (data && Preload.current_member) {\n if (data.conversation) {\n const translatableMessages = data.conversation.filter(\n (item) => item.author.id != Preload.current_member?.id,\n );\n\n foreignMessageIds = translatableMessages.map((item) => {\n return item.id;\n });\n }\n\n if (data.author.id != Preload.current_member?.id) {\n foreignMessageIds.push(data.id);\n }\n }\n\n return foreignMessageIds;\n}\n\ntype MessagesTranslationResult = {\n id: string;\n subject: string;\n content_rendered: string;\n}[];\n\nfunction addTranslationsToConversation(\n oldConversation: Message[\"conversation\"],\n newConversation: MessagesTranslationResult,\n) {\n if (!oldConversation) return [];\n\n return oldConversation.map((oldItem: Message) => {\n const newItem = newConversation.find(\n (newItem) => newItem.id === oldItem.id,\n );\n if (newItem) {\n return {\n ...oldItem,\n ...newItem,\n translated: true,\n };\n }\n\n return oldItem;\n });\n}\n\nexport function useTranslateMessages(\n messageIds: string[],\n language: string | undefined,\n) {\n const translationQueries = useQueries(\n messageIds.map((messageId) => ({\n queryKey: [\"translated-message\", messageId, language],\n queryFn: () => fetchApi(`/translations/${language}/message/${messageId}`),\n enabled: !!language,\n refetchOnWindowFocus: false,\n })),\n );\n\n const isTranslating = translationQueries.some(\n (query) => query.isLoading || query.isFetching,\n );\n\n const translatedMessages = translationQueries\n .map((query) => query.data)\n .filter(Boolean);\n\n return {\n data: translatedMessages,\n isLoading: isTranslating,\n };\n}\n\nexport function useDeleteMessage(filter, messageId, options = {}) {\n return useMutation(() => {\n return fetchApi(\n `/api/v1/messages${filter === \"sent\" ? \"/sent\" : \"\"}/${messageId}`,\n { method: \"DELETE\" },\n );\n }, options);\n}\n\nexport function useDeleteMessages(filter, options = {}) {\n return useMutation((messageIds: string[]) => {\n return fetchApi(\n `/api/v1/messages${filter === \"sent\" ? \"/sent\" : \"\"}/delete`,\n {\n method: \"DELETE\",\n body: { message_ids: messageIds },\n },\n );\n }, options);\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 { faPenLine } from \"@fortawesome/pro-regular-svg-icons\";\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={faPenLine} 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 const [val, setVal] = useState(value);\n\n if (!setValue) {\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, useCallback } from \"react\";\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 FieldError from \"components/appCreator/items/form/FieldError\";\nimport { useMutation } from \"react-query\";\nimport { stringify } from \"query-string\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\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 { mutate: loadOptions } = useMutation(\n ({\n q,\n }: {\n q: string;\n callback: (\n options: {\n label: string;\n options: { value: string; label: string; type: string }[];\n }[],\n ) => void;\n }) => fetchApi(`/directory?${stringify({ q, ...extraQueryParams })}`),\n {\n onSuccess: (\n data: { entries: { id: string; name: string }[] },\n variables,\n ) => {\n variables.callback(formatResponse(data?.entries));\n },\n },\n );\n\n const debouncedLoadOptions = useCallback(\n debounce((value, callback) => loadOptions({ q: value, callback }), 375),\n [loadOptions],\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: debouncedLoadOptions,\n isMulti: multiple,\n styles: { menu: (base) => ({ ...base, zIndex: 999 }) },\n };\n\n return (\n <Fragment>\n <div className=\"remove-input-txt-border\">\n <AsyncSelect\n {...props}\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n unstyled\n />\n </div>\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 { useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\n// For messages module\nexport function useFetchBaseMembershipData(membershipId, options = {}) {\n return useQuery(\n [\"memberships\", membershipId],\n () => (membershipId ? fetchApi(`/members/${membershipId}`) : null),\n options,\n );\n}\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 { 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 { faPaperclip, faEye } from \"@fortawesome/pro-regular-svg-icons\";\nimport FileIcon from \"components/shared/FileIcon\";\n\ntype MessageContainerArgs = {\n currentMemberId: string;\n attachments?: {\n id: string;\n original_filename: string;\n extension: string;\n }[];\n isConversation?: boolean;\n translated?: boolean;\n} & Message;\n\nfunction MessageContainer({\n author,\n created_at,\n currentMemberId,\n html_content,\n to,\n subject,\n translated,\n attachments,\n id,\n isConversation,\n}: MessageContainerArgs): JSX.Element {\n const authorUrl = author?.html_url;\n const authorImageUrl = find(author.images, { width: 80, height: 80 })?.url;\n const authorName = 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 <FontAwesomeIcon icon={faPaperclip} className={\"text-muted\"} />\n )}\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 prose\"\n dangerouslySetInnerHTML={{\n __html: html_content,\n }}\n />\n\n {translated && (\n <span\n style={{\n color: \"grey\",\n fontSize: \"x-small\",\n }}\n >\n (translated)\n </span>\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={a.extension} />\n </div>\n <a href={`/messages/${id}/files/${a?.id}`}>\n {a?.original_filename}\n </a>\n </div>\n );\n })}\n </div>\n )}\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={faEye} 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, MessageDetailsProps } from \"../@types\";\nimport PageLoading from \"components/shared/PageLoading\";\n\nfunction MessageDetails({\n messageLang,\n setIsTranslatingIndicator,\n}: MessageDetailsProps): 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\n const currentMemberId = useSelector(currentMemberSelector)?.id;\n const filter = location.state?.pathname?.includes(\"sent\") ? \"sent\" : \"\";\n\n const {\n isLoading,\n isSuccess,\n data: message,\n isTranslating,\n } = useFetchMessage(messageId, messageLang, {\n refetchOnWindowFocus: false,\n });\n\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\n const conversation = message?.conversation;\n\n useEffect(() => {\n if (isSuccess && message?.i.read === false) {\n markAsRead(messageId);\n }\n }, [message]);\n\n useEffect(() => {\n setIsTranslatingIndicator(isTranslating);\n }, [isTranslating]);\n\n if (isLoading || !currentMemberId || !message) return <PageLoading />;\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 <NewMessage\n initialValues={messageInitialValues(\n messageAction,\n message,\n currentMemberId,\n )}\n />\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 TranslationDropDown, {\n ORIGINAL_LANGUAGE_SIGNIFIER,\n} from \"components/shared/TranslationDropDown\";\n\nimport { useState } from \"react\";\n\nimport MessageDetails from \"components/messages/message\";\nimport Loading from \"components/shared/Loading\";\n\nexport default function ShowMessagePage() {\n const [messageLang, setMessageLang] = useState<string | undefined>();\n const [isTranslatingIndicator, setIsTranslatingIndicator] = useState(false);\n\n const handleLanguageSelect = (\n event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n language: string,\n ) => {\n if (language === ORIGINAL_LANGUAGE_SIGNIFIER) {\n setMessageLang(undefined);\n } else {\n setMessageLang(language);\n }\n };\n\n return (\n <>\n <PageTitle title={I18n.t(\"js.messages.message.title\")}>\n <>\n <TranslationDropDown\n handleLanguageSelect={handleLanguageSelect}\n object_language={Preload.current_network.language}\n />\n {messageLang && !isTranslatingIndicator && (\n <span\n style={{\n color: \"grey\",\n fontSize: \"x-small\",\n }}\n >\n (translated)\n </span>\n )}\n {isTranslatingIndicator && <Loading />}\n </>\n </PageTitle>\n\n <Subtitle className={\"mb-3 mt-8\"}>\n {I18n.t(\"js.messages.message.history\")}\n </Subtitle>\n <MessageDetails\n messageLang={messageLang}\n setIsTranslatingIndicator={setIsTranslatingIndicator}\n />\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, useCallback } from \"react\";\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 { useMutation } from \"react-query\";\nimport { stringify } from \"query-string\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\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 { mutate: loadOptions } = useMutation(\n ({\n q,\n }: {\n q: string;\n callback: (options: { value: string; label: string }[]) => void;\n }) => fetchApi(`/directory?${stringify({ q, groups_only: true })}`),\n {\n onSuccess: (\n data: { entries: { id: string; name: string }[] },\n variables,\n ) => {\n variables.callback(formatValue(data?.entries));\n },\n },\n );\n\n const debouncedLoadOptions = useCallback(\n debounce((value, callback) => loadOptions({ q: value, callback }), 375),\n [loadOptions],\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: debouncedLoadOptions,\n isMulti: multiple,\n styles: { menu: (base) => ({ ...base, zIndex: 999 }) },\n };\n\n return (\n <Fragment>\n <div className=\"remove-input-txt-border\">\n <AsyncSelect\n {...props}\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n unstyled\n />\n </div>\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 { faCircleInfo } from \"@fortawesome/pro-regular-svg-icons\";\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={faCircleInfo}\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 {\n link: \"/directory/channels\",\n label: I18n.t(\n \"js.administration.navigation_items.standard.channels.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 React, { useLayoutEffect, useState, Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { isEmpty, pick, get } from \"lodash\";\n\nimport Fields from \"./Fields\";\nimport Hint from \"../../../shared/fields/Hint\";\nimport { useLoadApp, useLoadItem } from \"../../api\";\n\n// Switches between NewItemForm and EditItemForm depending\n// if any item identifier was given\nfunction BasicItemForm(props) {\n const appIds = pick(props, [\"appId\", \"externalAppId\"]);\n\n const { isLoading: appLoading, data: app } = useLoadApp(appIds);\n\n if (!app) return <Loading />;\n\n const noItem = isEmpty(props.itemId) && isEmpty(props.externalItemId);\n const FormComponent = noItem ? NewItemForm : EditItemForm;\n\n return (\n <Fragment>\n {!isEmpty(get(app, \"hint\")) ? (\n <Hint hint={`**${I18n.t(\"js.apps.item.hint\")}**\\n\\n${app.hint}`} />\n ) : null}\n <FormComponent appLoading={appLoading} app={app} {...props} />\n </Fragment>\n );\n}\n\nBasicItemForm.propTypes = {\n appId: PropTypes.string,\n externalAppId: PropTypes.string,\n itemId: PropTypes.string,\n externalItemId: PropTypes.string,\n // Callback to initialize the form with the items values\n // Make sure this only sets section values if embedding this component\n initialize: PropTypes.func,\n filterProperties: PropTypes.func,\n mapProperties: PropTypes.func,\n transformItem: PropTypes.func,\n};\n\nfunction Loading() {\n return (\n <Fragment>\n <i className=\"fa fa-spinner fa-spin\" /> {I18n.t(\"js.groups.loading\")}\n </Fragment>\n );\n}\n\nexport function NewItemForm({\n app,\n appLoading,\n filterProperties,\n mapProperties,\n}) {\n if (appLoading || isEmpty(app)) return <Loading />;\n\n let properties = app.properties;\n if (filterProperties) properties = properties.filter(filterProperties);\n if (mapProperties) properties = properties.map(mapProperties);\n\n return <Fields properties={properties} appId={app.id} filterProperties />;\n}\n\nNewItemForm.propTypes = {\n app: PropTypes.shape({ properties: PropTypes.array }),\n appLoading: PropTypes.bool,\n};\n\nfunction useInitialize({ initialize, appLoading, itemLoading, item }) {\n // workaround for tixxt composer firing changes on mount which override initial values\n const [initialized, setInitialized] = useState(false);\n\n useLayoutEffect(() => {\n if (!appLoading && !itemLoading) {\n if (!isEmpty(item))\n initialize(item.values, { updateUnregisteredFields: true });\n\n // workaround\n setInitialized(true);\n }\n }, [appLoading, itemLoading]);\n\n return initialized;\n}\n\nexport function EditItemForm({\n app,\n appLoading,\n itemId,\n externalItemId,\n appId,\n externalAppId,\n initialize,\n filterProperties,\n mapProperties,\n transformItem,\n}) {\n let { isLoading: itemLoading, data: item } = useLoadItem({\n appId,\n externalAppId,\n itemId,\n externalItemId,\n });\n\n const initialized = useInitialize({\n initialize,\n appLoading,\n itemLoading,\n item,\n });\n\n if (appLoading || itemLoading || !initialized) return <Loading />;\n\n let properties = app.properties;\n if (filterProperties) properties = properties.filter(filterProperties);\n if (mapProperties) properties = properties.map(mapProperties);\n if (transformItem) item = transformItem(item);\n\n return <Fields properties={properties} appId={app.id} item={item} />;\n}\n\nEditItemForm.propTypes = {\n ...BasicItemForm.propTypes,\n ...NewItemForm.propTypes,\n};\n\nexport default BasicItemForm;\n","import React, { Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { noop } from \"lodash\";\n\nimport BasicItemForm from \"components/appCreator/items/form/BasicItemForm\";\nimport ReduxForm from \"components/shared/reduxForm\";\nimport PageTitle from \"components/layout/PageTitle\";\n\nfunction MembershipForm({\n externalAppId,\n externalItemId,\n onSubmit,\n title,\n renderExtraFields = noop,\n initialValues,\n allowSaveWithoutChange,\n filterProperties,\n mapProperties,\n transformItem,\n}) {\n return (\n <Fragment>\n <PageTitle title={title} />\n <ReduxForm\n form=\"editMembership\"\n className={\"form-horizontal\"}\n initialValues={initialValues}\n renderChildren={({ initialize, initialValues }) => (\n <Fragment>\n {renderExtraFields()}\n <BasicItemForm\n externalAppId={externalAppId}\n externalItemId={externalItemId}\n initialize={(itemValues, options) =>\n initialize({ ...initialValues, ...itemValues }, options)\n }\n filterProperties={filterProperties}\n mapProperties={mapProperties}\n transformItem={transformItem}\n />\n </Fragment>\n )}\n onSubmit={onSubmit}\n onCancel={window.isApp ? () => window.bridge?.goBack() : null}\n allowSaveWithoutChange={allowSaveWithoutChange}\n />\n </Fragment>\n );\n}\n\nMembershipForm.propTypes = {\n externalAppId: PropTypes.string,\n externalItemId: PropTypes.string,\n onSubmit: PropTypes.func,\n onSubmitSuccess: PropTypes.func,\n title: PropTypes.string,\n renderExtraFields: PropTypes.func,\n initialValues: PropTypes.object,\n allowSaveWithoutChange: PropTypes.bool,\n filterProperties: PropTypes.func,\n mapProperties: PropTypes.func,\n transformItem: PropTypes.func,\n};\n\nexport default MembershipForm;\n","import {\n isEmpty,\n map,\n filter,\n pick,\n mapValues,\n compact,\n castArray,\n get,\n} from \"lodash\";\n\nimport { updateItem, createItem } from \"actions/appCreator\";\nimport publishAllVolatile from \"helpers/files/publishAllVolatile\";\nimport handleItemApiError from \"./handleItemApiError\";\n\nconst pickFileValues = (values, fields) =>\n mapValues(pick(values, fields), (files) => compact(castArray(files)));\n\nconst persistItem = async (\n app,\n dispatch,\n { appId, externalAppId, itemId, externalItemId, values },\n) => {\n if (\n app.id !== appId &&\n (isEmpty(externalAppId) || app.external_id !== externalAppId)\n )\n throw \"Can't persist item for app which is not currently in state\";\n\n const fileFields = map(filter(app.properties, { type: \"file\" }), \"name\");\n const imageFields = map(filter(app.properties, { type: \"image\" }), \"name\");\n\n const publishedFiles = await publishAllVolatile({\n dispatch,\n values: pickFileValues(values, fileFields),\n storageDirectory: \"files\",\n });\n\n const publishedImages = await publishAllVolatile({\n dispatch,\n values: pickFileValues(values, imageFields),\n storageDirectory: \"images\",\n });\n\n const shouldCreateItem = isEmpty(externalItemId) && isEmpty(itemId);\n\n const createOrUpdate = shouldCreateItem ? createItem : updateItem;\n\n const itemResult = await dispatch(\n createOrUpdate({\n appId,\n externalAppId,\n itemId,\n externalItemId,\n body: { values: { ...values, ...publishedFiles, ...publishedImages } },\n }),\n );\n\n if (itemResult.error) {\n handleItemApiError(get(itemResult, [\"payload\", \"response\", \"errors\"]));\n }\n return itemResult.payload;\n};\n\nexport default persistItem;\n","import React from \"react\";\nimport { useStore, useSelector } from \"react-redux\";\nimport { get } from \"lodash\";\nimport MembershipForm from \"components/memberships/MembershipForm\";\nimport persistItem from \"helpers/items/persistItem\";\nimport { selectNetworkId } from \"selectors/environment\";\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\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\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 { mutate: updateMembership } = useMutation(\n ({ membershipId }: { membershipId?: string }) =>\n fetchApi(`/administration/members/${membershipId}`, {\n method: \"PUT\",\n }),\n {\n onSuccess: () => {\n location.replace(`/administration/members`);\n toastr.success(I18n.t(\"js.saving_successful\"));\n },\n onError: () => {\n toastr.error(I18n.t(\"js.saving_failure\"));\n },\n },\n );\n\n const onSubmit = async (values) => {\n await persistItem(app, store.dispatch, {\n externalAppId,\n externalItemId,\n values,\n });\n\n updateMembership({ membershipId });\n };\n\n return (\n <MembershipForm\n key={membershipId}\n externalAppId={externalAppId}\n externalItemId={externalItemId}\n onSubmit={onSubmit}\n renderExtraFields={() => <MemberEditFields membershipId={membershipId} />}\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, formValues } from \"redux-form\";\nimport { selectNetworkId } from \"selectors/environment\";\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\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\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 const { mutate: createMembership } = useMutation(\n ({\n body,\n }: {\n body: {\n user: {\n email: string;\n password: string;\n send_welcome_mail: boolean;\n profile_id: string;\n };\n };\n }) =>\n fetchApi(\"/administration/members\", {\n method: \"POST\",\n body,\n }),\n {\n onSuccess: () => {\n location.replace(`/administration/members`);\n toastr.success(I18n.t(\"js.saving_successful\"));\n },\n onError: () => {\n toastr.error(I18n.t(\"js.saving_failure\"));\n },\n },\n );\n\n const onSubmit = async (values) => {\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 return createMembership({\n body: {\n user: {\n email,\n password,\n send_welcome_mail,\n profile_id: itemId,\n },\n },\n });\n };\n\n return (\n <MembershipForm\n externalAppId={externalAppId}\n onSubmit={onSubmit}\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 channels: 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 category_name: string;\n slug: string;\n name: string;\n group_slug?: string;\n externally_visible?: boolean;\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\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinner } from \"@fortawesome/pro-regular-svg-icons\";\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 <FontAwesomeIcon className=\"mr-2\" icon={faSpinner} spin />\n {I18n.t(\"js.administration.app_navigation_items.loading\")}\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 forceTurbo: true, // for user tracking #3324\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 { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faCirclePlus,\n faList,\n faLocationDot,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport React from \"react\";\nimport DirectoryToolbar from \"components/directory/DirectoryToolbar\";\nimport { Filter } from \"components/directory/types\";\n\ntype ToolBarArgs = {\n isLoading: boolean;\n filter: Filter;\n};\n\nexport default function ToolBar({ isLoading, filter }: ToolBarArgs) {\n return (\n <DirectoryToolbar\n isLoading={isLoading}\n filter={filter}\n searchField={I18n.t(\"js.directory.member_tab\")}\n showFilterInitially\n actions={\n <div className=\"flex gap-2\">\n {Preload.current_member?.can.invite_internal ||\n (Preload.current_member?.can.invite_external && (\n <a\n className=\"btn btn-primary sm:ml-2 flex gap-1 items-center\"\n href=\"/administration/invites/new\"\n title={I18n.t(\"js.directory.headline_tools.create_channel\")}\n >\n <FontAwesomeIcon icon={faCirclePlus} />\n {I18n.t(\"js.directory.headline_tools.invite_members\")}\n </a>\n ))}\n {Preload.current_network.config.maps.enabled && (\n <div className=\"btn-group map-btn-group z-0\">\n <a\n className=\"btn btn-light\"\n href=\"\"\n title={I18n.t(\"js.maps.list\")}\n >\n <FontAwesomeIcon icon={faList} />\n </a>\n <a\n className=\"btn btn-light\"\n href=\"/map\"\n title={I18n.t(\"js.maps.map\")}\n >\n <FontAwesomeIcon icon={faLocationDot} />\n </a>\n </div>\n )}\n </div>\n }\n />\n );\n}\n","import React from \"react\";\nimport DirectoryRow from \"components/directory/DirectoryRow\";\nimport { faUser, faUserCircle } from \"@fortawesome/pro-regular-svg-icons\";\nimport { map } from \"lodash\";\nimport { DirectoryMembership } from \"components/directory/types\";\nimport DirectoryRowBadge from \"components/directory/DirectoryRowBadge\";\n\nexport default function MemberRow({\n id,\n displayName,\n images,\n profile,\n is_external,\n is_network_admin,\n roles,\n}: DirectoryMembership) {\n return (\n <DirectoryRow\n title={displayName}\n url={`/members/${id}`}\n imageUrl={images.large}\n fallbackIcon={faUser}\n badges={\n <>\n {is_network_admin && (\n <DirectoryRowBadge\n tooltipTitle={I18n.t(\"js.directory.member_row.administrator\")}\n title={I18n.t(\"js.directory.member_row.administrator_short\")}\n icon={faUserCircle}\n className=\"bg-primary/50\"\n />\n )}\n {is_external && (\n <DirectoryRowBadge\n tooltipTitle={I18n.t(\"js.directory.member_row.external\")}\n title={I18n.t(\"js.external_member.badge\")}\n className=\"text-muted bg-gray-100\"\n />\n )}\n {map(roles, (role) => (\n <DirectoryRowBadge\n key={role.name}\n tooltipTitle={role.name}\n title={role.name}\n style={{\n backgroundColor: role.color || \"var(--gray-500)\",\n color: role.text_color || \"white\",\n }}\n />\n ))}\n </>\n }\n >\n {map(\n profile,\n (value, field) =>\n value && (\n <p key={field} className=\"text-sm\">\n {value}\n </p>\n ),\n )}\n </DirectoryRow>\n );\n}\n","import React from \"react\";\nimport ToolBar from \"components/directory/members/ToolBar\";\nimport { useQuery } from \"react-query\";\nimport { stringify } from \"query-string\";\nimport { isEmpty, map, toNumber } from \"lodash\";\nimport DirectoryPagination from \"components/directory/DirectoryPagination\";\nimport MemberRow from \"components/directory/members/MemberRow\";\nimport { DirectoryMembership, Pagination } from \"components/directory/types\";\nimport useDirectoryFilter from \"../hooks/useDirectoryFilter\";\n\ntype MemberData = {\n consumer_count: number;\n entries: DirectoryMembership[];\n pagination: Pagination;\n};\n\nexport default function MemberListView() {\n const { filter, currentPage } = useDirectoryFilter();\n\n const { data, isLoading } = useQuery<MemberData, Error>(\n `/directory/members.json?${stringify(filter)}`,\n );\n\n return (\n <div className=\"flex flex-col gap-y-4\">\n <ToolBar isLoading={isLoading} filter={filter} />\n <DirectoryPagination\n currentPage={toNumber(currentPage)}\n pagination={data && data.pagination}\n isLoading={isLoading}\n >\n {data && !isEmpty(data?.entries)\n ? map(data.entries, (member) => (\n <MemberRow key={member.id} {...member} />\n ))\n : I18n.t(\"js.directory.empty_collection\")}\n </DirectoryPagination>\n </div>\n );\n}\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCirclePlus } from \"@fortawesome/pro-regular-svg-icons\";\nimport React from \"react\";\nimport DirectoryToolbar from \"components/directory/DirectoryToolbar\";\nimport { Filter } from \"components/directory/types\";\nimport ReactSelect from \"react-select\";\nimport Label from \"components/shared/form/Label\";\nimport { setSearchParam } from \"helpers/tixxt-router\";\nimport { find, toString } from \"lodash\";\n\ntype SelectOption = {\n label: string;\n value: string;\n};\n\ntype ToolBarArgs = {\n isLoading: boolean;\n filter: Filter;\n categoryName: string;\n categorySlug: string;\n categoryPluralName: string;\n};\n\nexport default function ToolBar({\n isLoading,\n filter,\n categoryName,\n categorySlug,\n categoryPluralName,\n}: ToolBarArgs) {\n const selectOptions: SelectOption[] = [\n {\n label: I18n.t(\"js.directory.search.group.fields.name\"),\n value: \"name\",\n },\n {\n label: I18n.t(\"js.directory.search.group.fields.name_and_profile\"),\n value: \"name_and_profile\",\n },\n ];\n\n const defaultValue: SelectOption = filter.search_in\n ? find(selectOptions, { value: toString(filter.search_in) }) ||\n selectOptions[0]\n : selectOptions[0];\n\n return (\n <DirectoryToolbar\n isLoading={isLoading}\n filter={filter}\n searchField={categoryPluralName}\n actions={\n <div className=\"flex gap-2\">\n <a\n className=\"btn btn-primary sm:ml-2 flex gap-1 items-center\"\n href={`/groups/new/${categorySlug}`}\n title={I18n.t(\"js.directory.headline_tools.create_channel\")}\n >\n <FontAwesomeIcon icon={faCirclePlus} />\n {I18n.t(\"js.directory.headline_tools.create_group\", {\n category_group_name: categoryName,\n })}\n </a>\n </div>\n }\n >\n <div className=\"form-horizontal my-6\">\n <div className=\"controls\">\n <label className=\"checkbox\">\n <input\n type=\"checkbox\"\n checked={filter.archived === \"true\"}\n onChange={(e) => {\n e.preventDefault();\n setSearchParam(\n \"archived\",\n filter.archived === \"true\" ? \"\" : \"true\",\n );\n setSearchParam(\"page\", \"\");\n }}\n />\n {I18n.t(\"js.directory.search.archive\")}\n </label>\n </div>\n <div className=\"control-group\">\n <Label label={I18n.t(\"js.directory.search.in_fields\")} />\n <div className=\"controls remove-input-txt-border\">\n <ReactSelect\n closeMenuOnSelect\n options={selectOptions}\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n defaultValue={defaultValue}\n isDisabled={isLoading}\n onChange={(option) => {\n option &&\n setSearchParam(\n \"search_in\",\n option.value === \"name\" ? \"\" : option.value,\n );\n setSearchParam(\"page\", \"\");\n }}\n unstyled\n />\n </div>\n </div>\n </div>\n </DirectoryToolbar>\n );\n}\n","import { fetchApi } from \"helpers/reactQueryApi\";\nimport { useMutation, UseMutationOptions } from \"react-query\";\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\nexport const createGroup = async ({ body }) => {\n const response = await fetchApi(\"/groups\", {\n method: \"POST\",\n body,\n });\n\n return response;\n};\n\nexport const updateGroup = async ({ groupSlug, body }) => {\n const response = await fetchApi(`/groups/${groupSlug}`, {\n method: \"PUT\",\n body,\n });\n\n return response;\n};\n\nexport function useChangeGroupSubscription(\n options?: Omit<\n UseMutationOptions<\n any,\n unknown,\n { id: string; action: \"subscribe\" | \"unsubscribe\" },\n unknown\n >,\n \"mutationFn\"\n >,\n) {\n return useMutation(\n ({ id, action }: { id: string; action: \"subscribe\" | \"unsubscribe\" }) =>\n fetchApi(`/api/v1/groups/${id}/subscribe`, {\n method: action === \"subscribe\" ? \"POST\" : \"DELETE\",\n }),\n options,\n );\n}\n\nexport function useChangeMembershipGroupStatus(\n options?: Omit<\n UseMutationOptions<\n any,\n unknown,\n { id: string; action: \"join\" | \"leave\" },\n unknown\n >,\n \"mutationFn\"\n >,\n) {\n return useMutation(\n ({ id, action }: { id: string; action: \"join\" | \"leave\" }) =>\n fetchApi(`/api/v1/groups/${id}/join`, {\n method: action === \"join\" ? \"POST\" : \"DELETE\",\n }),\n options,\n );\n}\n","import React, { useState } from \"react\";\nimport DirectoryRow from \"components/directory/DirectoryRow\";\nimport {\n faArchive,\n faLock,\n faEyeSlash,\n faEye,\n faAdjust,\n faTimes,\n faRightFromBracket,\n faBellSlash,\n faBell,\n faCheck,\n faPlus,\n faUsers,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { DirectoryGroup } from \"components/directory/types\";\nimport { useAcceptInvite } from \"components/invites/api\";\nimport { useNavigate } from \"helpers/tixxt-router\";\nimport { formatDateFromNow } from \"helpers/formatDate\";\nimport {\n useChangeGroupSubscription,\n useChangeMembershipGroupStatus,\n} from \"components/groups/api\";\nimport DirectoryActionButton from \"components/directory/DirectoryActionButton\";\n\nexport default function GroupRow({\n id,\n slug,\n name,\n profile_image,\n archived,\n access,\n externally_visible,\n member_count,\n activity_count,\n teaser,\n membership_status_of_current_member,\n can,\n i_haz_subscription,\n invite,\n}: DirectoryGroup) {\n const navigate = useNavigate();\n const [hasSubscribed, setHasSubscribed] = useState(i_haz_subscription);\n const [memberStatus, setMemberStatus] = useState(\n membership_status_of_current_member,\n );\n const titleIcons: { icon: IconProp; title: string }[] = [];\n\n if (archived)\n titleIcons.push({\n icon: faArchive,\n title: I18n.t(\"js.directory.group_row.archived\"),\n });\n if (access === \"closed\")\n titleIcons.push({\n icon: faLock,\n title: I18n.t(\"js.directory.group_row.closed\"),\n });\n if (access === \"hidden\")\n titleIcons.push({\n icon: faEyeSlash,\n title: I18n.t(\"js.directory.group_row.hidden\"),\n });\n if (externally_visible)\n titleIcons.push({\n icon: faEye,\n title: I18n.t(\"js.directory.group_row.externally_visible\"),\n });\n\n const { mutate: acceptInvite } = useAcceptInvite({\n onSuccess: () => {\n navigate(`/groups/${slug}`);\n },\n });\n\n const { mutate: changeGroupSubscription } = useChangeGroupSubscription({\n onSuccess: (_, variables) => {\n setHasSubscribed(variables.action === \"subscribe\");\n },\n });\n\n const { mutate: changeGroupMembership } = useChangeMembershipGroupStatus({\n onSuccess: (_, variables) => {\n if (variables.action === \"join\") {\n can.join && navigate(`/groups/${slug}/activitystreams/${slug}`);\n can.join_moderated && setMemberStatus(\"in_moderation\");\n } else {\n setMemberStatus(\"no_member\");\n toastr.success(\n I18n.t(\"js.directory.group_row.leave.successful\", {\n group_name: name,\n }),\n );\n }\n },\n });\n\n function getActions() {\n switch (memberStatus) {\n case \"in_moderation\":\n return (\n <DirectoryActionButton\n icon={{ icon: faAdjust }}\n text={I18n.t(\"js.directory.group_row.waiting_for_approval\")}\n disabled\n />\n );\n case \"rejected\":\n return (\n <DirectoryActionButton\n icon={{ icon: faTimes }}\n text={I18n.t(\"js.directory.group_row.join_rejected\")}\n disabled\n />\n );\n case \"member\":\n return (\n <>\n {can.leave && (\n <DirectoryActionButton\n icon={{ icon: faRightFromBracket }}\n text={I18n.t(\"js.directory.group_row.leave_group\")}\n onClick={() => {\n window.bridge?.confirm(\n I18n.t(\"js.directory.group_row.leave.confirmation\", {\n group_name: name,\n }),\n () => changeGroupMembership({ id, action: \"leave\" }),\n );\n }}\n />\n )}\n <DirectoryActionButton\n icon={{\n icon: hasSubscribed ? faBellSlash : faBell,\n }}\n text={\n hasSubscribed\n ? I18n.t(\"js.directory.group_row.unsubscribe\")\n : I18n.t(\"js.directory.group_row.subscribe\")\n }\n onClick={() =>\n changeGroupSubscription({\n id,\n action: hasSubscribed ? \"unsubscribe\" : \"subscribe\",\n })\n }\n />\n </>\n );\n case \"invited\":\n return (\n <DirectoryActionButton\n type=\"primary\"\n icon={{ icon: faCheck }}\n text={I18n.t(\"js.directory.group_row.accept_invitation\")}\n onClick={() => acceptInvite({ inviteId: invite.id })}\n />\n );\n case \"no_member\":\n return (\n (can.join || can.join_moderated) && (\n <DirectoryActionButton\n type=\"primary\"\n icon={{ icon: faPlus }}\n text={\n can.join\n ? I18n.t(\"js.directory.group_row.join\")\n : can.join_moderated\n ? I18n.t(\"js.directory.group_row.join_moderated\")\n : \"\"\n }\n onClick={() => changeGroupMembership({ id, action: \"join\" })}\n />\n )\n );\n default:\n return null;\n }\n }\n\n return (\n <DirectoryRow\n title={name}\n url={`/groups/${slug}`}\n imageUrl={profile_image}\n fallbackIcon={faUsers}\n titleIcons={titleIcons}\n actions={getActions()}\n >\n <p className=\"text-muted text-sm\">\n {I18n.t(\"js.directory.group_row.member_count\", { count: member_count })}\n {\", \"}\n {I18n.t(\"js.directory.group_row.activity\", { count: activity_count })}\n </p>\n {membership_status_of_current_member === \"invited\" && (\n <p>\n {I18n.t(\"js.directory.group_row.invited_by\", {\n invitor: invite.author.name,\n time_ago: formatDateFromNow(new Date(invite.created_at)),\n })}\n </p>\n )}\n {teaser && (\n <p className=\"text-sm whitespace-pre-line max-w-4xl\">{teaser}</p>\n )}\n </DirectoryRow>\n );\n}\n","import React from \"react\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport ToolBar from \"components/directory/groups/ToolBar\";\nimport { useQuery } from \"react-query\";\nimport { stringify } from \"query-string\";\nimport { find, isEmpty, map, toNumber } from \"lodash\";\nimport DirectoryPagination from \"components/directory/DirectoryPagination\";\nimport { DirectoryGroup, Pagination } from \"components/directory/types\";\nimport GroupRow from \"components/directory/groups/GroupRow\";\nimport useDirectoryFilter from \"../hooks/useDirectoryFilter\";\n\ntype GroupData = {\n entries: DirectoryGroup[];\n pagination: Pagination;\n};\n\nexport default function GroupListView() {\n const { category_id } = useParams();\n const category = find(Preload.current_network.group_categories, {\n slug: category_id,\n });\n\n const { filter, currentPage } = useDirectoryFilter();\n\n const { data, isLoading } = useQuery<GroupData, Error>(\n `/directory/${category_id}.json?${stringify(filter)}`,\n { enabled: !!category_id },\n );\n\n return category ? (\n <div className=\"flex flex-col gap-y-4\">\n <ToolBar\n isLoading={isLoading}\n filter={filter}\n categoryName={category.name}\n categorySlug={category_id || \"\"}\n categoryPluralName={category.plural_name}\n />\n <DirectoryPagination\n currentPage={toNumber(currentPage)}\n pagination={data && data.pagination}\n isLoading={isLoading}\n >\n {data && !isEmpty(data?.entries)\n ? map(data.entries, (group) => <GroupRow key={group.id} {...group} />)\n : I18n.t(\"js.directory.empty_collection\")}\n </DirectoryPagination>\n </div>\n ) : (\n <div>Category not found</div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport TabBar from \"components/shared/TabBar\";\nimport { findIndex, forEach, includes } from \"lodash\";\nimport MembersListView from \"components/directory/members/MemberListView\";\nimport ChannelListView from \"components/directory/channels/ChannelListView\";\nimport GroupListView from \"components/directory/groups/GroupListView\";\nimport { useParams } from \"helpers/tixxt-router\";\n\ntype DirectoryPageArgs = {\n preselectedTab: \"channels\" | \"members\" | \"groups\";\n};\n\nexport default function DirectoryPage({ preselectedTab }: DirectoryPageArgs) {\n const { category_id } = useParams();\n const availableModules =\n (Tixxt.currentNetwork?.get(\"availableModules\") as string[]) || [];\n\n const tabs = [\n {\n id: \"members\",\n type: \"members\",\n label: I18n.t(\"js.directory.member_tab\"),\n url: \"/members\",\n component: MembersListView,\n },\n ];\n\n if (includes(availableModules, \"Channels\")) {\n tabs.push({\n id: \"channels\",\n type: \"channels\",\n label: I18n.t(\"js.directory.channel_tab\"),\n url: \"/channels\",\n component: ChannelListView,\n });\n }\n\n forEach(Preload.current_network.group_categories, (category) =>\n tabs.push({\n id: category.slug,\n type: \"groups\",\n label: category.plural_name,\n url: `/directory/${category.slug}`,\n component: GroupListView,\n }),\n );\n\n const tabIndex = findIndex(tabs, { id: category_id || preselectedTab });\n const [selectedTabIndex, selectTabIndex] = useState(tabIndex);\n\n useEffect(() => {\n selectTabIndex(tabIndex);\n }, [tabIndex]);\n\n const { component: TabComponent, type: selectedTabType } =\n tabs[selectedTabIndex];\n\n return (\n <>\n <PageTitle title={I18n.t(`js.directory.title.${selectedTabType}`)} />\n <TabBar\n tabs={tabs}\n selectTabIndex={selectTabIndex}\n selectedTabIndex={selectedTabIndex}\n className={\"mb-2\"}\n />\n {TabComponent && <TabComponent />}\n </>\n );\n}\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport BackboneFeature from \"components/tixxt/BackboneFeature\";\nimport DirectoryPage from \"components/directory/DirectoryPage\";\n\nconst backboneRoutes: 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: \"/directory/channels\",\n // element: (\n // <BackboneFeature feature=\"Directory\" action=\"showList\" paramKeys={[]} />\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\nconst reactRoutes: RouteObject[] = [\n { path: \"/directory\", element: <DirectoryPage preselectedTab=\"members\" /> },\n { path: \"/members\", element: <DirectoryPage preselectedTab=\"members\" /> },\n { path: \"/channels\", element: <DirectoryPage preselectedTab=\"channels\" /> },\n {\n path: \"/directory/channels\",\n element: <DirectoryPage preselectedTab=\"channels\" />,\n },\n {\n path: \"/directory/:category_id\",\n element: <DirectoryPage preselectedTab=\"groups\" />,\n },\n];\n\nexport default reactRoutes.concat(backboneRoutes);\n","import React from \"react\";\nimport { useStore, useSelector } from \"react-redux\";\nimport { useMutation } from \"react-query\";\nimport { useParams } from \"helpers/tixxt-router\";\n\nimport { selectNetworkId } from \"selectors/environment\";\nimport persistItem from \"helpers/items/persistItem\";\n\nimport MembershipForm from \"./MembershipForm\";\nimport { useLoadApp } from \"../appCreator/api\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\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 { mutate: updateMembership } = useMutation(\n () =>\n fetchApi(`/members/${membershipId}`, {\n method: \"PUT\",\n }),\n {\n onSuccess: () => {\n location.replace(`/members/${membershipId}`);\n toastr.success(I18n.t(\"js.saving_successful\"));\n },\n onError: () => {\n toastr.error(I18n.t(\"js.saving_failure\"));\n },\n },\n );\n\n const onSubmit = async (values) => {\n await persistItem(app, store.dispatch, {\n externalAppId,\n externalItemId,\n values,\n });\n\n updateMembership({ membershipId });\n };\n\n return (\n <MembershipForm\n externalAppId={externalAppId}\n externalItemId={externalItemId}\n onSubmit={onSubmit}\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 { useParams } from \"helpers/tixxt-router\";\nimport { useMutation, useQuery } from \"react-query\";\nimport Loading from \"components/shared/Loading\";\nimport classNames from \"classnames\";\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\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\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\nexport default function EditMembershipSettings() {\n const { membershipId } = useParams();\n\n const { isLoading: loading, data } = useQuery(\n `/members/${membershipId}/settings`,\n );\n\n const { mutate: updateMembershipSettings } = useMutation(\n ({ body }: { [key: string]: boolean }) =>\n fetchApi(`/members/${membershipId}/settings`, {\n method: \"PUT\",\n body,\n }),\n {\n onSuccess: () => toastr.success(I18n.t(\"js.saving_successful\")),\n onError: () => {\n toastr.error(I18n.t(\"js.saving_failure\"));\n },\n },\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 onSubmit = async (values) => {\n updateMembershipSettings({\n body: transform2BackendState(values),\n });\n\n if (notificationsDeactivated) location.reload();\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={onSubmit}\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 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}) {\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 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 React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useMutation } from \"react-query\";\nimport { archiveGroup, deleteGroup } from \"./api\";\nimport DangerZone from \"../shared/form/DangerZone\";\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 <DangerZone\n title={I18n.t(\n archived ? \"js.groups.edit.is_archived\" : \"js.groups.edit.do_archive\",\n )}\n body={I18n.t(\n archived\n ? \"js.groups.edit.help_do_unarchive\"\n : \"js.groups.edit.help_do_archive\",\n )}\n actions={\n <>\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 </>\n }\n />\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 { useSelector, useStore } from \"react-redux\";\nimport { get, isEmpty } from \"lodash\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport GroupForm from \"./form\";\nimport EditGroupActions from \"./EditGroupActions\";\nimport persistItem from \"helpers/items/persistItem\";\nimport TixxtPageTitle from \"../layout/TixxtPageTitle\";\nimport { updateGroup, fetchGroup } from \"./api\";\nimport { useMutation, 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 { mutate: onUpdateGroup } = useMutation(updateGroup, {\n onSuccess: (data, variables) => {\n toastr.success(\n I18n.t(\"js.groups.update.success\", {\n group: get(variables, [\"body\", \"group\", \"name\"]),\n }),\n );\n location.replace(\n `/groups/${data.groupSlug}/activitystreams/${data.groupSlug}`,\n );\n },\n onError: () => {\n toastr.error(\n I18n.t(\"js.groups.update.failure\", {\n group: group.name,\n }),\n );\n },\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 onUpdateGroup({ groupSlug, body: { group } });\n };\n\n return (\n <>\n <TixxtPageTitle />\n {!isEmpty(group) && (\n <>\n {!group.archived && (\n <GroupForm\n {...group}\n onSubmit={onSubmit}\n formName={`group-${group.id}`}\n />\n )}\n {group.can.archive && <EditGroupActions {...group} />}\n </>\n )}\n </>\n );\n}\n","import React, { Fragment } from \"react\";\nimport { useSelector, useStore } from \"react-redux\";\nimport { get, isEmpty } from \"lodash\";\nimport { useParams } from \"helpers/tixxt-router\";\n\nimport PageTitle from \"components/layout/PageTitle\";\nimport GroupForm from \"./form\";\nimport { groupCategorySelector, selectNetworkId } from \"selectors/environment\";\n\nimport persistItem from \"helpers/items/persistItem\";\nimport { fetchGroupDefaults, createGroup } from \"./api\";\nimport { useQuery, useMutation } 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 { mutate: onCreateGroup } = useMutation(createGroup, {\n onSuccess: (data, variables) => {\n toastr.success(\n I18n.t(\"js.groups.create.success\", {\n group: get(variables, [\"body\", \"group\", \"name\"]),\n }),\n );\n location.replace(\n `/groups/${data.groupSlug}/activitystreams/${data.groupSlug}`,\n );\n },\n onError: () => {\n toastr.error(\n I18n.t(\"js.groups.create.failure\", {\n group: category.name,\n }),\n );\n },\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 onCreateGroup({\n body: { group: { ...group, profile_id: itemId } },\n });\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 { faUsers, faLock } from \"@fortawesome/pro-solid-svg-icons\";\nimport { useAcceptInvite, useDeclineInvite } from \"components/invites/api\";\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({\n groupInviteId,\n reloadGroupInvites,\n}: {\n groupInviteId: string;\n reloadGroupInvites: () => void;\n}) {\n const [inviteStatus, setInviteStatus] = useState(\"open\");\n const { mutate: declineInvite } = useDeclineInvite({\n onSuccess: () => {\n reloadGroupInvites();\n },\n });\n const { mutate: acceptInvite } = useAcceptInvite({\n onSuccess: () => {\n reloadGroupInvites();\n },\n });\n\n const buttons = (\n <div className=\"btn-group\">\n <button\n onClick={() => {\n 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 declineInvite({ inviteId: groupInviteId });\n setInviteStatus(\"declined\");\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 reloadGroupInvites,\n}: GroupInvite & { reloadGroupInvites: () => void }) {\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={faUsers}\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={faLock} />\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\n groupInviteId={id}\n reloadGroupInvites={reloadGroupInvites}\n />\n </div>\n </li>\n );\n}\n\nexport default function GroupInvites() {\n const {\n isLoading,\n data: groupInvites,\n refetch: reloadGroupInvites,\n } = 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\n {...groupInvite}\n reloadGroupInvites={reloadGroupInvites}\n />\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 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\nexport default function 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 { 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\n window.location.href = onboardingResult.redirect_to || \"/\";\n toastr.success(I18n.t(\"js.saving_successful\"));\n };\n\n return (\n <MembershipForm\n externalAppId={externalAppId}\n externalItemId={externalItemId}\n onSubmit={onSubmit}\n title={I18n.t(\"js.apps.profile.edit.title\")}\n allowSaveWithoutChange\n />\n );\n}\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 groupContext />\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 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 React from \"react\";\nimport PermissionPicker from \"components/shared/PermissionPicker\";\n\nexport default function ChannelsPage() {\n return (\n <div>\n Channels ✨\n <div className={\"mt-4\"}>\n <h5>PermissionPicker Test, einfach ignorieren</h5>\n <PermissionPicker />\n </div>\n </div>\n );\n}\n","import ToggleFavoriteButton from \"components/shared/favoriteButtons/ToggleFavoriteButton\";\nimport React from \"react\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { updateChannelFavorited } from \"../../channels/api\";\n\nexport default function ToggleChannelFavoriteButton({\n channelSlug,\n favorited,\n}: {\n channelSlug: string;\n favorited: boolean;\n}) {\n const { mutate, isLoading } = useMutation(\n ({ favorite }: { favorite: boolean }) => {\n return fetchApi(`/channels/${channelSlug}/favorite`, {\n method: favorite ? \"POST\" : \"DELETE\",\n });\n },\n {\n onSuccess: (data) => updateChannelFavorited(channelSlug, data.favorited),\n },\n );\n\n return (\n <ToggleFavoriteButton\n title={\n favorited\n ? I18n.t(\"js.page_title.remove_group_from_favorites\")\n : I18n.t(\"js.page_title.add_group_to_favorites\")\n }\n toggleFavorited={() => mutate({ favorite: !favorited })}\n isLoading={isLoading}\n favorited={favorited}\n />\n );\n}\n","import React from \"react\";\nimport { includes, map } from \"lodash\";\nimport Loading from \"components/shared/Loading\";\nimport classNames from \"classnames\";\nimport { LayoutRow, LayoutWidget } from \"components/channels/types\";\nimport WidgetContainer from \"components/channels/widgets/WidgetContainer\";\nimport { useWidget } from \"components/channels/api\";\nimport WidgetByType from \"components/channels/widgets/WidgetByType\";\nimport PageLoading from \"components/shared/PageLoading\";\nimport {\n getWidgetColspan,\n getWidgetContainerResponsiveHeight,\n getWidgetContentColumns,\n} from \"components/channels/helpers\";\n\ntype LayoutData = {\n rows: LayoutRow[];\n};\n\ntype ChannelLayoutArgs = {\n channelSlug?: string;\n layoutData: LayoutData | undefined;\n isLoading: boolean;\n};\n\nconst W_LOOKUP = {\n full: [3],\n \"half-1-2\": [1, 2],\n \"half-2-1\": [2, 1],\n third: [1, 1, 1],\n};\n\nexport function ChannelLayout({\n layoutData,\n isLoading,\n channelSlug,\n}: ChannelLayoutArgs) {\n if (isLoading || !layoutData) return <PageLoading />;\n\n return (\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n {map(layoutData.rows, (item) =>\n map(\n item.widgets as LayoutRow<typeof item.type>[\"widgets\"],\n (widget: LayoutWidget | null, index) => (\n <Widget\n key={index}\n w={W_LOOKUP[item.type][index]}\n channelSlug={channelSlug}\n widgetId={widget?.id}\n />\n ),\n ),\n )}\n </div>\n );\n}\n\nfunction Widget({\n widgetId,\n w,\n channelSlug,\n}: {\n channelSlug?: string;\n widgetId?: string;\n w: number;\n}) {\n const { data: widget, isLoading } = useWidget({ channelSlug, widgetId });\n\n if (isLoading) {\n return (\n <div className={`animate-pulse ${getWidgetColspan(w)}`}>\n <div\n className={classNames(\n `\n bg-gray-300 rounded\n flex justify-center items-center\n col-span-1\n `,\n getWidgetContainerResponsiveHeight(w),\n )}\n >\n <Loading />\n </div>\n </div>\n );\n }\n\n return widget ? (\n <WidgetContainer\n w={w}\n title={widget.title}\n titleBackgroundOverride={widget.title_background_override}\n collapseToSingleColumn={includes(\n [\"blog\", \"spotlight\", \"banner\", \"link\"],\n widget.type,\n )}\n singleRowOnly={includes([\"appointments\"], widget.type)}\n label={widget.label}\n hideTitle={widget.hide_title || widget.type === \"banner\"}\n >\n <WidgetByType {...widget} />\n </WidgetContainer>\n ) : (\n <div\n className={classNames(\n \"flex\",\n getWidgetContainerResponsiveHeight(w),\n getWidgetContentColumns(w),\n )}\n />\n );\n}\n","import React, { useEffect } from \"react\";\nimport PageTitle from \"components/layout/PageTitle\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport ToggleChannelFavoriteButton from \"components/shared/favoriteButtons/ToggleChannelFavoriteButton\";\nimport { updateChannelSubscription, useChannel } from \"components/channels/api\";\nimport { useChannelLayout } from \"components/channels/layout/api\";\nimport DropDown, { DropDownItem } from \"components/shared/DropDown\";\nimport { ChannelLayout } from \"./ChannelLayout\";\nimport { isString } from \"lodash\";\nimport Hint from \"components/shared/fields/Hint\";\nimport { faEllipsis } from \"@fortawesome/pro-regular-svg-icons\";\nimport useChannelSubscriptionToggle from \"components/shared/hooks/useChannelSubscriptionToggle\";\n\nexport default function ChannelPage({\n isAdministration = false,\n}: {\n isAdministration?: boolean;\n}) {\n const { channelSlug } = useParams();\n const { data: channel } = useChannel(channelSlug);\n const { data: layoutData, isLoading: layoutLoading } =\n useChannelLayout(channelSlug);\n const hasChangesString = sessionStorage.getItem(`${channelSlug}:hasChanges`);\n\n const hasChanges = isString(hasChangesString) && JSON.parse(hasChangesString);\n\n const dropdownItems: React.JSX.Element[] = [];\n\n const { subscribeChannel, unsubscribeChannel } = useChannelSubscriptionToggle(\n {\n channelSlug: channelSlug || \"\",\n onSuccessFunction: (subscribed) => {\n channelSlug && updateChannelSubscription(channelSlug, subscribed);\n },\n },\n );\n\n useEffect(() => {\n document.body.style.backgroundColor =\n \"var(--channel-background, var(--white))\";\n\n return () => {\n document.body.style.backgroundColor = \"\";\n };\n }, []);\n\n dropdownItems.push(\n <DropDownItem\n key=\"show_blog\"\n text={I18n.t(\"js.channels.title.dropdown.show_blog\")}\n url={`/blogs/${channel?.blog_id}`}\n />,\n <DropDownItem\n key=\"subscription\"\n text={\n channel?.i.subscribed\n ? I18n.t(\"js.directory.channel_row.unsubscribe.label\")\n : I18n.t(\"js.directory.channel_row.subscribe.label\")\n }\n title={\n channel?.i.subscribed\n ? \"\"\n : I18n.t(\"js.directory.channel_row.subscribe.title\")\n }\n onSelect={() => {\n channel?.i.subscribed ? unsubscribeChannel() : subscribeChannel();\n }}\n />,\n );\n\n if (channel?.i.can.update && !isAdministration)\n dropdownItems.push(\n <DropDownItem\n key=\"update\"\n text={I18n.t(\"js.channels.title.dropdown.edit_channel\")}\n url={`/channels/${channel.slug}/edit`}\n dividerTop\n />,\n <DropDownItem\n key=\"edit_layout\"\n text={I18n.t(\"js.channels.title.dropdown.edit_channel_layout\")}\n url={`/channels/${channel.slug}/layout/edit`}\n />,\n <DropDownItem\n key=\"add_article\"\n text={I18n.t(\"js.channels.title.dropdown.add_article\")}\n url={`/blogs/${channel.blog_id}/articles/new`}\n />,\n );\n\n return (\n <>\n {(channel?.status === \"draft\" || channel?.status === \"archived\") &&\n !channel?.i.can.update ? (\n <p>{I18n.t(`js.channels.${channel.status}.body`)}</p>\n ) : (\n <>\n {hasChanges && (\n <div className=\"alert alert-info\">\n <Hint\n hint={I18n.t(\"js.channels.layout.not_saved_hint\")}\n className=\"!mb-0\"\n />\n </div>\n )}\n <PageTitle title={channel?.title || \"\"}>\n {channel && !isAdministration && (\n <div className={\"flex place-items-center\"}>\n {dropdownItems.length > 0 && (\n <>\n <DropDown.Toggle\n icon={faEllipsis}\n buttonType=\"normal\"\n small\n />\n <DropDown alignment=\"start\">{dropdownItems}</DropDown>\n </>\n )}\n {channel && channel.i.subscribed && (\n <ToggleChannelFavoriteButton\n channelSlug={channel.slug}\n favorited={channel.i.favorited}\n />\n )}\n </div>\n )}\n </PageTitle>\n <ChannelLayout\n layoutData={layoutData}\n channelSlug={channel?.id}\n isLoading={layoutLoading}\n />\n </>\n )}\n </>\n );\n}\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { navigate, Redirect, useParams } from \"helpers/tixxt-router\";\nimport ChannelPage from \"components/channels/ChannelPage\";\nimport { useWidget } from \"components/channels/api\";\nimport \"./widgets.css\";\nimport PageLoading from \"components/shared/PageLoading\";\nimport { createPortal } from \"react-dom\";\nimport classNames from \"classnames\";\nimport { findIndex, includes } from \"lodash\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faChevronCircleLeft,\n faChevronCircleRight,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { faSpinner } from \"@fortawesome/pro-regular-svg-icons\";\n\nexport default function ShowWidgetPage() {\n const { channelSlug, widgetId } = useParams();\n const { data, isLoading } = useWidget({ channelSlug, widgetId });\n\n if (isLoading) {\n return <PageLoading />;\n }\n\n switch (data?.type) {\n case \"images\": {\n const images = data.images;\n return (\n <>\n <ChannelPage />\n {images && <ImagesGalleryPage {...data} images={images} />}\n </>\n );\n }\n default:\n // redirect to channel page for all widgets other than images, which should show gallery in overlay\n return window.Settings?.development ? (\n <div className={\"alert alert-info prose\"}>\n TODO Implement case for <code>{data?.type}</code> in ShowWidgetPage /\n WidgetPageByType\n </div>\n ) : (\n <Redirect to={`/channels/${channelSlug}`} />\n );\n }\n}\n\ntype ImagesGalleryPageProps = {\n images: { id: string }[];\n title?: string;\n description?: string;\n};\n\nfunction ImagesGalleryPage({\n title,\n description,\n images,\n}: ImagesGalleryPageProps) {\n const { channelSlug } = useParams();\n const [lightbox, setLightbox] = useState<{\n id: string | null;\n open: boolean;\n loading: boolean;\n }>({ id: null, open: false, loading: false });\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n dialogRef.current?.showModal();\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = \"\";\n };\n }, []);\n\n const showNextImage = useCallback(\n (e: React.MouseEvent | KeyboardEvent) => {\n e.preventDefault();\n const currentIndex = findIndex(images, { id: lightbox.id || \"\" });\n\n if (currentIndex !== -1 && currentIndex + 1 < images.length) {\n const nextImage = images[currentIndex + 1];\n if (nextImage) {\n setLightbox({\n id: nextImage.id,\n open: true,\n loading: lightbox.id != nextImage.id,\n });\n }\n }\n },\n [images, lightbox.id],\n );\n\n const showPrevImage = useCallback(\n (e: React.MouseEvent | KeyboardEvent) => {\n e.preventDefault();\n const currentIndex = findIndex(images, { id: lightbox.id || \"\" });\n\n if (currentIndex > 0) {\n const prevImage = images[currentIndex - 1];\n if (prevImage) {\n setLightbox({\n id: prevImage.id,\n open: true,\n loading: lightbox.id != prevImage.id,\n });\n }\n }\n },\n [images, lightbox.id],\n );\n\n function handleKeyDown(event: KeyboardEvent) {\n const nextKeys = [\"ArrowRight\", \"ArrowUp\"];\n\n if (\n includes([...nextKeys, \"ArrowLeft\", \"ArrowDown\", \"Escape\"], event.key)\n ) {\n event.preventDefault();\n\n if (event.key === \"Escape\" && lightbox.open) {\n setLightbox((prevLightbox) => ({\n ...prevLightbox,\n open: false,\n }));\n } else {\n includes(nextKeys, event.key)\n ? showNextImage(event)\n : showPrevImage(event);\n }\n }\n }\n\n useEffect(() => {\n if (lightbox.open) {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }\n }, [lightbox.open, showNextImage, showPrevImage]);\n\n return createPortal(\n <dialog\n ref={dialogRef}\n className={\n \"tixxt__dialog rounded w-full overflow-y-scroll bg-transparent\"\n }\n onClick={(e) => {\n if (e.target == e.currentTarget)\n navigate(`/channels/${channelSlug}`, { replace: true });\n }}\n onClose={(e) => {\n if (e.target == e.currentTarget)\n navigate(`/channels/${channelSlug}`, { replace: true });\n }}\n >\n <div className=\"my-4 flex flex-col gap-4\">\n <h1 className=\"text-2xl font-semibold text-center\">{title}</h1>\n <div className=\"px-20 text-center prose\">{description}</div>\n </div>\n <div\n className={\n \"grid gap-1 grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6\"\n }\n >\n {images.map(({ id }) => (\n <div key={id} className={\"aspect-square overflow-hidden\"}>\n <a\n href={`#img-${id}`}\n onClick={(e) => {\n e.preventDefault();\n setLightbox({ id, open: true, loading: lightbox.id != id });\n }}\n >\n <img\n alt=\"\"\n aria-hidden\n src={`/api/storage/images/${id}/get/435x435`}\n className={\n \"w-full h-full object-cover object-center transition hover:scale-110\"\n }\n />\n </a>\n </div>\n ))}\n {lightbox && (\n <div\n className={classNames(\"images-gallery__lightbox\", {\n \"opacity-0 pointer-events-none\": !lightbox.open,\n })}\n onClick={(e) => {\n if (e.target == e.currentTarget)\n setLightbox({ ...lightbox, open: false });\n }}\n >\n {lightbox.id && (\n <div className=\"flex gap-4\">\n {findIndex(images, { id: lightbox.id }) > 0 && (\n <button onClick={showPrevImage}>\n <FontAwesomeIcon\n className=\"text-primary opacity-75 h-16 w-16\"\n icon={faChevronCircleLeft}\n />\n </button>\n )}\n <img\n key={lightbox.id}\n alt=\"\"\n aria-hidden\n src={`/api/storage/images/${lightbox.id}/get/1920x1200`}\n className={classNames(\n \"w-full h-full object-contain transition-opacity duration-700\",\n { \"opacity-0\": lightbox.loading },\n )}\n onLoad={() => setLightbox({ ...lightbox, loading: false })}\n />\n {findIndex(images, { id: lightbox.id }) < images.length - 1 && (\n <button onClick={showNextImage}>\n <FontAwesomeIcon\n className=\"text-primary opacity-75 h-16 w-16\"\n icon={faChevronCircleRight}\n />\n </button>\n )}\n </div>\n )}\n <div className={classNames({ hidden: !lightbox.loading })}>\n <FontAwesomeIcon icon={faSpinner} size=\"2xl\" spin />\n </div>\n </div>\n )}\n </div>\n </dialog>,\n document.body,\n );\n}\n","import React, { lazy, Suspense } from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport ChannelsPage from \"./ChannelsPage\";\nimport ChannelPage from \"components/channels/ChannelPage\";\nimport ShowWidgetPage from \"components/channels/widgets/ShowWidgetPage\";\n\nconst ChannelNewPage = lazy(() => import(\"components/channels/ChannelNewPage\"));\nconst ChannelEditPage = lazy(\n () => import(\"components/channels/ChannelEditPage\"),\n);\nconst EditLayoutPage = lazy(\n () => import(\"components/channels/layout/EditLayoutPage\"),\n);\nconst EditDesignPage = lazy(\n () => import(\"components/channels/design/EditDesignPage\"),\n);\nconst WidgetsPage = lazy(\n () => import(\"components/channels/widgets/WidgetsPage\"),\n);\nconst NewWidgetPage = lazy(\n () => import(\"components/channels/widgets/NewWidgetPage\"),\n);\nconst EditWidgetPage = lazy(\n () => import(\"components/channels/widgets/EditWidgetPage\"),\n);\n\nconst channelRoutes: RouteObject[] = [\n { path: \"/channels\", element: <ChannelsPage /> },\n {\n path: \"/channels/new\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <ChannelNewPage />\n </Suspense>\n ),\n },\n {\n path: \"/channels/:channelSlug/edit\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <ChannelEditPage />\n </Suspense>\n ),\n },\n {\n path: \"/channels/:channelSlug\",\n element: <ChannelPage />,\n },\n {\n path: \"/channels/:channelSlug/administration\",\n element: <ChannelPage isAdministration />,\n },\n {\n path: \"/channels/:channelSlug/layout/edit\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <EditLayoutPage />\n </Suspense>\n ),\n },\n {\n path: \"/channels/:channelSlug/design/edit\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <EditDesignPage />\n </Suspense>\n ),\n },\n {\n path: \"/channels/:channelSlug/widgets\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <WidgetsPage />\n </Suspense>\n ),\n },\n {\n path: \"/channels/:channelSlug/widgets/new\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <NewWidgetPage />\n </Suspense>\n ),\n },\n {\n path: \"/channels/:channelSlug/widgets/:widgetId/edit\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <EditWidgetPage />\n </Suspense>\n ),\n },\n {\n path: \"/channels/:channelSlug/widgets/:widgetId\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <ShowWidgetPage />\n </Suspense>\n ),\n },\n];\n\nexport default channelRoutes;\n","import React from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport TextInput from \"components/shared/form/fields/TextInput\";\nimport FormActions from \"components/shared/form/fields/FormActions\";\nimport {\n onValidationError,\n resetValidationErrors,\n} from \"helpers/formValidations\";\nimport { useSaveBlog } from \"../api\";\nimport { Blog } from \"components/blogs/types\";\nimport RadioButton from \"components/shared/form/fields/RadioButton\";\nimport { useNavigate } from \"helpers/tixxt-router\";\n\ntype BlogFormData = {\n title: string;\n description: string;\n publish_as: string;\n};\n\nexport default function BlogForm({ blog }: { blog: Blog }) {\n const navigate = useNavigate();\n const { register, handleSubmit } = useForm<BlogFormData>({\n defaultValues: {\n title: blog.title || \"\",\n description: blog.description || \"\",\n publish_as: blog.publish_as || \"\",\n },\n });\n\n const { mutate: saveBlog } = useSaveBlog(blog, {\n onSuccess: () => {\n navigate(`/blogs/${blog.id}`);\n toastr.success(I18n.t(\"js.saving_successful\"));\n },\n onError: (error: { message: string }) => {\n toastr.error(error.message || I18n.t(\"js.saving_failure\"));\n },\n });\n\n function submit(data: BlogFormData) {\n resetValidationErrors();\n saveBlog({ blog: { id: blog.id, parent_id: blog.parent_id, ...data } });\n }\n\n return (\n <form\n className=\"form-horizontal mb-6\"\n onSubmit={handleSubmit(submit, onValidationError)}\n >\n <TextInput\n name=\"title\"\n label={I18n.t(\"js.blog.form.title\")}\n register={register}\n required={I18n.t(\"js.blog.form.title_required\")}\n />\n <TextInput\n name=\"description\"\n label={I18n.t(\"js.blog.form.description\")}\n register={register}\n multiline\n />\n <RadioButton\n name=\"publish_as\"\n label={I18n.t(\"js.blog.form.publish_as.label\")}\n register={register}\n defaultValue={blog.publish_as || \"blog_title\"}\n options={[\n {\n label: I18n.t(\"js.blog.form.publish_as.blog_title\"),\n value: \"blog_title\",\n },\n { label: I18n.t(\"js.blog.form.publish_as.author\"), value: \"author\" },\n ]}\n hint={I18n.t(\"js.blog.form.publish_as.hint\")}\n />\n <FormActions\n onCancel={(e) => {\n e.preventDefault();\n navigate(`/blogs/${blog.id}`);\n }}\n />\n </form>\n );\n}\n","import React from \"react\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { useBlog } from \"components/blogs/api\";\nimport BlogForm from \"components/blogs/form/BlogForm\";\nimport PageTitle from \"components/layout/PageTitle\";\n\nexport default function BlogEditPage() {\n const { id } = useParams();\n const { data: blog, isLoading } = useBlog(id);\n\n if (isLoading) {\n return <div>{I18n.t(\"js.loading\")}</div>;\n }\n\n return (\n <div>\n <PageTitle title={I18n.t(\"js.blog.edit.title\")} />\n {blog && <BlogForm blog={blog} />}\n </div>\n );\n}\n","import React from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\nimport BlogEditPage from \"components/blogs/BlogEditPage\";\n\nconst blogRoutes: RouteObject[] = [\n {\n path: \"/blogs/:id/edit\",\n element: <BlogEditPage />,\n },\n];\n\nexport default blogRoutes;\n","import React, { lazy, Suspense } from \"react\";\nimport { RouteObject } from \"helpers/tixxt-router\";\n\nconst ArticleEditPage = lazy(() => import(\"./ArticleEditPage\"));\nconst ArticleNewPage = lazy(() => import(\"./ArticleNewPage\"));\n\nconst articleRoutes: RouteObject[] = [\n {\n path: \"/blogs/:blog_id/articles/new\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <ArticleNewPage />\n </Suspense>\n ),\n },\n {\n path: \"/blogs/:blog_id/articles/:id/edit\",\n element: (\n <Suspense fallback={\"Loading...\"}>\n <ArticleEditPage />\n </Suspense>\n ),\n },\n];\n\nexport default articleRoutes;\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 channelRoutes from \"components/channels/routes\";\nimport blogRoutes from \"components/blogs/routes\";\nimport articleRoutes from \"components/articles/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 ...channelRoutes,\n ...blogRoutes,\n ...articleRoutes,\n { path: \"/\", element: <RedirectToStartpage /> },\n];\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\nexport const 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 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","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 PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { isEmpty } from \"lodash\";\n\nexport const profileFieldAvailable = ({ detectionProfileField }) =>\n !isEmpty(Tixxt.currentNetwork?.get(\"detection_profile_field\")) &&\n !isEmpty(detectionProfileField);\n\nexport const showNameWithProfileField = ({\n name,\n detectionProfileField,\n isExternal,\n}) => {\n let result = name;\n\n if (profileFieldAvailable({ detectionProfileField })) {\n result += ` (${detectionProfileField})`;\n }\n\n if (isExternal) {\n result += ` (${I18n.t(\"js.external_member.badge\")})`;\n }\n\n return result;\n};\n\nexport function ExternalMemberBadge() {\n return (\n <>\n <span\n className=\"badge bg-gray-100 ml-2 text-muted\"\n data-bs-toggle={\"tooltip\"}\n title={I18n.t(\"js.directory.member_row.external\")}\n >\n {I18n.t(\"js.external_member.badge\")}\n </span>\n </>\n );\n}\n\nexport function NameWithProfileField({\n name,\n detectionProfileField,\n isExternal,\n}) {\n return (\n <>\n {name}\n {profileFieldAvailable({ detectionProfileField }) ? (\n <>\n {\" \"}\n <span className=\"detection-profile-field\">\n ({detectionProfileField})\n </span>\n </>\n ) : null}\n {isExternal ? <ExternalMemberBadge /> : null}\n </>\n );\n}\n\nNameWithProfileField.propTypes = {\n name: PropTypes.string,\n detectionProfileField: PropTypes.string,\n isExternal: PropTypes.bool,\n};\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faUser,\n faUsers,\n faCircleUser,\n faComputerClassic,\n faTag,\n faBullhorn,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport React from \"react\";\nimport {\n ChannelEntry,\n GroupAdminEntry,\n GroupEntry,\n MemberEntry,\n} from \"components/directory/api\";\nimport { isEmpty } from \"lodash\";\nimport {\n DisabledOption,\n MembershipRole,\n PermissionPickable,\n PermissionPickableWithDisabled,\n SystemRole,\n ValueType,\n} from \"components/shared/DirectoryPicker/types\";\nimport { useQuery } from \"react-query\";\nimport classnames from \"classnames\";\nimport \"./optionRendering.css\";\n\n// Externally-visible signature, for compile time check that switch uses all types\nexport function throwBadType(entry: never): never;\n// Implementation signature, called if invalid type is provided during runtime\nexport function throwBadType(entry: PermissionPickableWithDisabled) {\n throw new Error(\n \"Unhandled option type: \" + entry.type + \" in \" + JSON.stringify(entry),\n );\n}\n\n/**\n * Turns a given option value into a react element\n * If display attributes (like name) are missing, they are fetched by the react components\n *\n * @param entry\n */\nexport function formatOptionLabel(\n entry: ValueType | PermissionPickableWithDisabled,\n) {\n if (!isOptionEnabled(entry)) return noOptionsMessage({ inputValue: \"\" });\n\n switch (entry.type) {\n case \"member\":\n return <MemberOptionLabel {...entry} />;\n\n case \"group\":\n return <GroupOptionLabel {...entry} />;\n\n case \"group_admin\":\n return <GroupAdminOptionLabel {...entry} />;\n\n case \"system_role\":\n return <SystemRoleOptionLabel {...entry} />;\n\n case \"membership_role\":\n return <MembershipRoleOptionLabel {...entry} />;\n\n case \"channel\":\n return <ChannelOptionLabel {...entry} />;\n\n default:\n throwBadType(entry);\n }\n}\n\nfunction MemberOptionLabel({ id, name, images }: MemberEntry) {\n const { data, isLoading } = useQuery<MemberEntry>(`/members/${id}`, {\n enabled: !name,\n });\n\n return (\n <div className=\"flex gap-2\">\n {images ? (\n <img className=\"member-image h-6 w-6\" src={images.small} />\n ) : (\n <FontAwesomeIcon key=\"icon\" icon={faUser} className=\"fa-fw\" />\n )}\n {isLoading\n ? I18n.t(\"js.loading\")\n : name || data?.name || I18n.t(\"js.memberships.deleted_name\")}\n </div>\n );\n}\n\nfunction ChannelOptionLabel({ slug, title, image }: ChannelEntry) {\n const { data, isLoading } = useQuery<ChannelEntry>(`/channels/${slug}`, {\n enabled: !slug,\n });\n\n return (\n <div className=\"flex gap-2\">\n {image._id ? (\n <img\n className=\"member-image h-6 w-6\"\n src={`/api/storage/images/${image._id}/get`}\n />\n ) : (\n <FontAwesomeIcon key=\"icon\" icon={faBullhorn} className=\"fa-fw\" />\n )}\n {isLoading ? I18n.t(\"js.loading\") : title || data?.title}\n </div>\n );\n}\n\nfunction GroupOptionLabel({ id, name }: GroupEntry) {\n const { data, isLoading } = useQuery<GroupEntry>(`/groups/${id}`, {\n enabled: !name,\n });\n\n return (\n <>\n <FontAwesomeIcon key=\"icon\" icon={faUsers} className=\"fa-fw mr-2\" />\n {isLoading\n ? I18n.t(\"js.loading\")\n : `${name || data?.name || I18n.t(\"js.groups.unknown_group\")} (${I18n.t(\n \"js.member_select.all_group_members\",\n )})`}\n </>\n );\n}\n\nfunction GroupAdminOptionLabel({ id, name }: GroupAdminEntry) {\n const { data, isLoading } = useQuery<GroupAdminEntry>(`/groups/${id}`, {\n enabled: !name,\n });\n\n return (\n <>\n <FontAwesomeIcon\n key=\"icon\"\n icon={faCircleUser}\n className=\"fa-fw mr-2 group_indentation\"\n />\n {isLoading\n ? I18n.t(\"js.loading\")\n : `${name || data?.name || I18n.t(\"js.groups.unknown_group\")} (${I18n.t(\n \"js.member_select.only_admins\",\n )})`}\n </>\n );\n}\n\nfunction SystemRoleOptionLabel({ id, name }: SystemRole) {\n return (\n <>\n <FontAwesomeIcon\n key=\"icon\"\n icon={faComputerClassic}\n className=\"fa-fw mr-2\"\n />\n {name || I18n.t(`js.permission_picker.system_roles.${id}`)}\n </>\n );\n}\n\nfunction MembershipRoleOptionLabel({\n id,\n name,\n parent_type,\n parent_id,\n}: MembershipRole) {\n const { data: groupData, isLoading } = useQuery<GroupEntry>(\n `/groups/${parent_id}`,\n {\n enabled: parent_type == \"group\" && !name,\n },\n );\n let data: Pick<MembershipRole, \"name\"> | undefined;\n if (parent_type == \"group\")\n data = groupData?.membership_roles.find((r) => r.id == id);\n else data = Preload.current_network.membership_roles.find((r) => r.id == id);\n\n return (\n <>\n <FontAwesomeIcon\n key=\"icon\"\n icon={faTag}\n className={classnames(\"fa-fw mr-2\", {\n group_indentation: parent_type == \"group\",\n })}\n />\n {isLoading\n ? I18n.t(\"js.loading\")\n : name || data?.name || I18n.t(\"js.permission_picker.unknown_role\")}\n </>\n );\n}\n\nfunction isOptionEnabled(entry: ValueType): entry is PermissionPickable {\n return !(\"disabled\" in entry);\n}\n\nexport function isOptionDisabled(entry: ValueType): entry is DisabledOption {\n return !isOptionEnabled(entry);\n}\n\nexport const noOptionsMessage = ({ inputValue }) =>\n isEmpty(inputValue)\n ? I18n.t(\"js.plugins.select2.enter_more_characters.one\")\n : I18n.t(\"js.plugins.select2.no_match\");\n","import {\n GroupSearchDisabled,\n MemberSearchDisabled,\n MembershipRole,\n OptionGroup,\n PermissionPickableWithDisabled,\n} from \"components/shared/DirectoryPicker/types\";\nimport { throwBadType } from \"components/shared/DirectoryPicker/optionRendering\";\nimport { flatMap, map } from \"lodash\";\nimport { GroupAdminEntry } from \"components/directory/api\";\n\nexport function groupOptions(\n options: PermissionPickableWithDisabled[],\n): OptionGroup[] {\n const membersLabel = I18n.t(\"js.permission_picker.members.group_label\");\n const systemLabel = I18n.t(\"js.permission_picker.system_roles.group_label\");\n const networkMembershipRolesLabel = I18n.t(\n \"js.permission_picker.network_membership_roles.group_label\",\n );\n const channelLabel = I18n.t(\"js.directory_picker.channels.group_label\");\n\n const result: { [label: string]: PermissionPickableWithDisabled[] } = {};\n\n options.forEach((entry) => {\n switch (entry.type) {\n case \"member\": {\n if (!result[membersLabel]) result[membersLabel] = [];\n result[membersLabel].push(entry);\n break;\n }\n case \"group\": {\n const pluralName = entry.category.plural_name;\n if (!result[pluralName]) result[pluralName] = [];\n result[pluralName].push(entry);\n break;\n }\n case \"group_admin\": {\n const pluralName = entry.category.plural_name;\n if (!result[pluralName]) result[pluralName] = [];\n result[pluralName].push(entry);\n break;\n }\n case \"system_role\": {\n if (!result[systemLabel]) result[systemLabel] = [];\n result[systemLabel].push(entry);\n break;\n }\n case \"membership_role\": {\n if (!result[networkMembershipRolesLabel])\n result[networkMembershipRolesLabel] = [];\n result[networkMembershipRolesLabel].push(entry);\n break;\n }\n case \"channel\": {\n if (!result[channelLabel]) result[channelLabel] = [];\n result[channelLabel].push(entry);\n break;\n }\n default:\n throwBadType(entry);\n }\n });\n\n return map(result, (options, label) => ({ label, options }));\n}\n\nexport function expandMembershipRoles(\n groupedEntries: OptionGroup[],\n): OptionGroup[] {\n return map(groupedEntries, (group: OptionGroup) => {\n const options = flatMap(\n group.options,\n (option): PermissionPickableWithDisabled[] => {\n return option.type == \"group\"\n ? [\n option,\n {\n ...option,\n type: \"group_admin\",\n } as GroupAdminEntry,\n ...map(\n option.membership_roles,\n (role): MembershipRole => ({\n id: role.id,\n type: \"membership_role\",\n name: role.name,\n parent_id: role.id,\n parent_type: \"group\",\n }),\n ),\n ]\n : [option];\n },\n );\n return { ...group, options };\n });\n}\n\nexport function disabledOptions(\n inputValue: string,\n endpoint: string,\n): PermissionPickableWithDisabled[] {\n if (inputValue.length > 0) return [];\n\n const disabledOptions: PermissionPickableWithDisabled[] = [];\n const memberSearchDisabled: MemberSearchDisabled = {\n id: \"member_disabled\",\n type: \"member\",\n disabled: true,\n };\n disabledOptions.push(memberSearchDisabled);\n\n if (endpoint != \"/directory/members\") {\n const groupSearchDisabled: GroupSearchDisabled = {\n id: \"group_disabled\",\n type: \"group\",\n disabled: true,\n category: {\n plural_name: \"Gruppen\",\n },\n membership_roles: [],\n };\n disabledOptions.push(groupSearchDisabled);\n }\n\n return disabledOptions;\n}\n","import React, { useCallback } from \"react\";\nimport Async from \"react-select/async\";\nimport { ActionMeta, MultiValue, SingleValue } from \"react-select\";\nimport {\n formatOptionLabel,\n isOptionDisabled,\n noOptionsMessage,\n} from \"components/shared/DirectoryPicker/optionRendering\";\nimport {\n OptionGroup,\n PermissionPickableWithDisabled,\n ValueType,\n} from \"components/shared/DirectoryPicker/types\";\nimport { isEmpty } from \"lodash\";\nimport { DirectoryEntry, fetchDirectory } from \"components/directory/api\";\nimport {\n disabledOptions,\n expandMembershipRoles,\n groupOptions,\n} from \"components/shared/DirectoryPicker/optionLoading\";\n\nfunction useDirectoryFetcher(\n endpoint = \"/directory\",\n query = {},\n extraOptions?: (\n inputValue: string,\n ) =>\n | Promise<PermissionPickableWithDisabled[]>\n | PermissionPickableWithDisabled[],\n) {\n return useCallback(\n async function directoryFetcher(\n inputValue: string,\n ): Promise<OptionGroup[]> {\n try {\n let entries: DirectoryEntry[];\n if (isEmpty(inputValue)) entries = [];\n else\n entries = (\n await fetchDirectory(\n {\n ...query,\n q: inputValue,\n },\n endpoint,\n )\n ).entries;\n\n const extraOptionValues = extraOptions\n ? await extraOptions(inputValue)\n : [];\n\n return expandMembershipRoles(\n groupOptions([\n ...extraOptionValues,\n ...disabledOptions(inputValue, endpoint),\n ...entries,\n ]),\n );\n } catch (e) {\n console.error(e);\n throw e;\n }\n },\n [endpoint, query],\n );\n}\n\nexport type DirectoryPickerProps = {\n value?: ValueType[];\n onChange?: (\n newValue: MultiValue<ValueType> | SingleValue<ValueType>,\n actionMeta: ActionMeta<ValueType>,\n ) => void;\n multi?: boolean;\n placeholder?: string;\n endpoint?: string;\n query?: { [param: string]: string | boolean };\n showDefaultOptions?: boolean;\n disabled?: boolean;\n extraOptions?: (\n inputValue: string,\n ) =>\n | Promise<PermissionPickableWithDisabled[]>\n | PermissionPickableWithDisabled[];\n};\n\n/**\n * A UI element that enables the selection of users or users+groups, optionally with membership roles, on the network or group level.\n *\n * @param {Object} props\n * @param {string} props.endpoint Defaults to /directory, could also be /directory/members or /directory/:group_category_slug or /directory/channels\n * @param {string} props.query Extra query for the request to endpoint, make sure that this is memoized\n */\nexport default React.forwardRef(function DirectoryPicker(\n {\n value,\n onChange,\n multi,\n placeholder,\n endpoint,\n query,\n extraOptions,\n showDefaultOptions = true,\n disabled,\n }: DirectoryPickerProps,\n // react-hook-form adds ref prop which we dont need but leads to warning unless we accept it with React.forwardRef\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ref,\n) {\n const loadDirectoryOptions = useDirectoryFetcher(\n endpoint,\n query,\n extraOptions,\n );\n\n return (\n <Async<ValueType, boolean, OptionGroup>\n cacheOptions\n loadOptions={loadDirectoryOptions}\n formatOptionLabel={formatOptionLabel}\n isMulti={multi}\n placeholder={placeholder || placeholderForEndpoint(endpoint)}\n isOptionDisabled={isOptionDisabled}\n defaultOptions={showDefaultOptions}\n noOptionsMessage={noOptionsMessage}\n getOptionValue={getOptionValue}\n value={value}\n onChange={onChange}\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n isDisabled={disabled}\n unstyled\n />\n );\n});\n\n// This representation is only used internally in react-select\nfunction getOptionValue(entry: ValueType) {\n return `${entry.type}/${entry.id}`;\n}\n\nfunction placeholderForEndpoint(endpoint: undefined | string): string {\n switch (endpoint) {\n case \"/directory/members\":\n return I18n.t(\"js.member_select.placeholder\");\n case \"/directory/channels\":\n return I18n.t(\"js.channel_select.placeholder\");\n default:\n return I18n.t(\"js.audience_select.placeholder\");\n }\n}\n","import { fetchApi } from \"helpers/reactQueryApi\";\nimport { stringify } from \"query-string\";\n\nexport type MemberEntry = {\n id: string;\n type: \"member\";\n name: string;\n path?: string;\n images?: {\n small: string;\n medium: string;\n large: string;\n \"40x40@2\": string;\n \"64x64@2\": string;\n };\n profile?: { [key: string]: any };\n detection_profile_field?: null | string;\n};\n\nexport type ChannelEntry = {\n id: string;\n slug: string;\n type: \"channel\";\n title: string;\n status: string;\n path?: string;\n image: {\n _id: string;\n };\n};\n\nexport type GroupEntry = {\n id: string;\n type: \"group\";\n name: string;\n url?: string;\n profile_image?: string | null;\n category: {\n id: string;\n name: string;\n plural_name: string;\n };\n membership_roles: {\n id: string;\n slug?: string;\n name: string;\n plural_name: string;\n color?: string;\n type?: \"membershipRole\";\n }[];\n};\n\nexport type GroupAdminEntry = {\n id: string;\n type: \"group_admin\";\n name: string;\n url?: string;\n profile_image?: string | null;\n category: {\n id: string;\n name: string;\n plural_name: string;\n };\n membership_roles: {\n id: string;\n slug?: string;\n name: string;\n plural_name: string;\n color?: string;\n type?: \"membershipRole\";\n }[];\n};\n\nexport type DirectoryEntry = MemberEntry | GroupEntry | GroupAdminEntry;\n\nexport async function fetchDirectory(\n query: {\n q?: string;\n include_membership_roles?: boolean;\n },\n endpoint?: string,\n): Promise<{ entries: DirectoryEntry[] }> {\n return await fetchApi(`${endpoint || \"/directory\"}?${stringify(query)}`);\n}\n","import { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport classNames from \"classnames\";\nimport React, { MouseEventHandler, useEffect } from \"react\";\nimport classnames from \"classnames\";\nimport { faChevronRight, faEllipsis } from \"@fortawesome/pro-regular-svg-icons\";\nimport useTooltip from \"../../hooks/useTooltip\";\n\ntype DropDownArgs = {\n children: React.ReactNode;\n alignment?: \"start\" | \"end\";\n className?: string;\n};\n\nfunction DropDown({ children, className, alignment = \"end\" }: DropDownArgs) {\n // make sure to close dropdowns on body click\n useEffect(() => {\n const handleBodyClick = () => {\n const elements = document.querySelectorAll(\n \".tixxt__dropdown.dropdown-menu\",\n );\n elements.forEach((element) => {\n element.classList.remove(\"show\");\n });\n };\n\n document.body.addEventListener(\"click\", handleBodyClick);\n\n return () => {\n document.body.removeEventListener(\"click\", handleBodyClick);\n };\n }, []);\n\n return (\n <ul\n className={classnames(\n `tixxt__dropdown dropdown-menu dropdown-menu-${alignment} empty:hidden`,\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 confirm?: string;\n className?: string;\n iconClassName?: string;\n onSelect?: MouseEventHandler<HTMLAnchorElement>;\n title?: string;\n dividerTop?: boolean;\n dividerBottom?: boolean;\n};\n\nexport function DropDownItem({\n children,\n url,\n icon,\n text,\n additional,\n linkStyle,\n iconStyle,\n method,\n confirm,\n className,\n iconClassName,\n onSelect,\n title,\n dividerTop,\n dividerBottom,\n}: DropDownItemArgs) {\n const ItemWrapperComponent = title ? ItemWrapperWithTooltip : ItemWrapper;\n\n return (\n <>\n {dividerTop && <li className=\"divider\" />}\n <ItemWrapperComponent className={className} title={title}>\n {children ? (\n children\n ) : (\n <a\n href={url || \"#\"}\n className={classNames(\"dropdown-item\", linkStyle)}\n data-method={method}\n data-confirm={confirm}\n onClick={(e) => {\n if (onSelect) {\n e.stopPropagation();\n onSelect(e);\n }\n }}\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 </ItemWrapperComponent>\n {dividerBottom && <li className=\"divider\" />}\n </>\n );\n}\n\ntype ItemWrapperProps = {\n className?: string;\n title?: string;\n children: React.ReactNode;\n};\n\nfunction ItemWrapperWithTooltip({\n className,\n title,\n children,\n}: ItemWrapperProps) {\n const tooltipRef = useTooltip<HTMLLIElement>();\n\n return (\n <li ref={tooltipRef} className={className} title={title}>\n {children}\n </li>\n );\n}\n\nfunction ItemWrapper({ className, title, children }: ItemWrapperProps) {\n return (\n <li className={className} title={title}>\n {children}\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 dividerTop?: boolean;\n dividerBottom?: boolean;\n};\n\nexport function DropDownSubMenu({\n text,\n children,\n className,\n icon,\n side = \"right\",\n dividerTop,\n dividerBottom,\n}: DropDownSubMenuArgs) {\n return (\n <>\n {dividerTop && <li className=\"divider\" />}\n <li className={classnames(\"relative group\", className)}>\n <div className=\"dropdown-item flex gap-2 items-center w-full text-left cursor-pointer\">\n <span className=\"flex items-center space-x-1\">\n {icon && <FontAwesomeIcon icon={icon} className=\"fa-fw\" />}\n <span className=\"flex-1\">{text}</span>\n </span>\n <FontAwesomeIcon icon={faChevronRight} 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 {dividerBottom && <li className=\"divider\" />}\n </>\n );\n}\n\ntype DropdownToggleArgs = {\n title?: string;\n active?: boolean;\n disabled?: boolean;\n small?: boolean;\n icon?: IconProp;\n className?: string;\n iconClassName?: string;\n buttonType?: \"light\" | \"primary\" | \"danger\" | \"normal\";\n children?: React.ReactNode;\n};\n\nexport function DropDownToggle({\n active = false,\n disabled = false,\n small = false,\n title,\n icon,\n className,\n buttonType = \"light\",\n iconClassName,\n children,\n}: DropdownToggleArgs) {\n return (\n <button\n className={classNames(\"btn dropdown-toggle\", className, {\n active,\n \"btn-light\": buttonType === \"light\",\n \"btn-primary\": buttonType === \"primary\",\n \"btn-danger\": buttonType === \"danger\",\n \"btn-sm\": small,\n })}\n data-bs-toggle=\"dropdown\"\n title={title}\n disabled={disabled}\n onClick={(e) => e.stopPropagation()}\n >\n <FontAwesomeIcon className={iconClassName} icon={icon || faEllipsis} />\n {children}\n </button>\n );\n}\n\nDropDown.Item = DropDownItem;\nDropDown.SubMenu = DropDownSubMenu;\nDropDown.Toggle = DropDownToggle;\nexport default DropDown;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faFile,\n faFileImage,\n faFileAudio,\n faFileVideo,\n faFileLines,\n faFileCode,\n faFileCsv,\n faFilePdf,\n faFileZipper,\n faFileWord,\n faFilePowerpoint,\n faFileExcel,\n} from \"@fortawesome/pro-light-svg-icons\";\n\nfunction chooseFileIcon(extension: string) {\n const audioExtensions = [\n \"mp3\",\n \"aac\",\n \"flac\",\n \"ogg\",\n \"alac\",\n \"wav\",\n \"aiff\",\n \"dsd\",\n \"pcm\",\n \"aif\",\n \"mid\",\n \"midi\",\n \"map3\",\n \"wma\",\n ];\n const videoExtensions = [\n \"webm\",\n \"mkv\",\n \"flv\",\n \"vob\",\n \"ogv\",\n \"drc\",\n \"gifv\",\n \"avi\",\n \"mov\",\n \"mts\",\n \"wmv\",\n \"yuv\",\n \"amv\",\n \"mp4\",\n \"m4p\",\n \"m4v\",\n \"mpg\",\n \"mpeg\",\n \"m2v\",\n \"svi\",\n \"3gp\",\n \"flv\",\n \"f4v\",\n \"f4p\",\n \"f4a\",\n \"f4b\",\n \"3g2\",\n \"mk4v\",\n ];\n const pictureExtensions = [\n \"gif\",\n \"jpeg\",\n \"jpg\",\n \"png\",\n \"tiff\",\n \"tif\",\n \"psd\",\n \"ai\",\n \"indd\",\n \"raw\",\n \"eps\",\n \"cr2\",\n \"crw\",\n \"nef\",\n \"pef\",\n \"cdr\",\n \"xcf\",\n \"bmp\",\n ];\n const textExtensions = [\"odt\", \"rtf\", \"tex\", \"txt\", \"pages\"];\n const codeExtensions = [\n \"c\",\n \"cgi\",\n \"pl\",\n \"class\",\n \"cpp\",\n \"cs\",\n \"h\",\n \"java\",\n \"php\",\n \"py\",\n \"sh\",\n \"swift\",\n \"vb\",\n \"rb\",\n \"js\",\n \"haml\",\n \"hamlc\",\n \"coffee\",\n \"rs\",\n \"jsx\",\n \"tsx\",\n \"json\",\n \"yml\",\n \"html\",\n \"css\",\n \"scss\",\n ];\n const wordExtensions = [\"wpd\", \"doc\", \"docx\", \"docm\", \"dotx\"];\n const powerpointExtensions = [\n \"pps\",\n \"ppt\",\n \"pptx\",\n \"potm\",\n \"potx\",\n \"ppam\",\n \"ppsm\",\n \"ppsx\",\n \"pptm\",\n ];\n const excelExtensions = [\n \"xls\",\n \"xlsm\",\n \"xlsx\",\n \"xlam\",\n \"xlsb\",\n \"xltm\",\n \"xltx\",\n ];\n const zipExtensions = [\n \"7z\",\n \"arj\",\n \"deb\",\n \"pkg\",\n \"rar\",\n \"rpm\",\n \"tag.gz\",\n \"z\",\n \"zip\",\n ];\n\n if (audioExtensions.includes(extension)) {\n return faFileAudio; // audio\n } else if (videoExtensions.includes(extension)) {\n return faFileVideo; //video\n } else if (pictureExtensions.includes(extension)) {\n return faFileImage; // images\n } else if (textExtensions.includes(extension)) {\n return faFileLines; // text\n } else if (codeExtensions.includes(extension)) {\n return faFileCode; // code\n } else if (extension === \"csv\") {\n return faFileCsv; // csv\n } else if (extension === \"pdf\") {\n return faFilePdf; //pdf\n } else if (wordExtensions.includes(extension)) {\n return faFileWord; //word\n } else if (powerpointExtensions.includes(extension)) {\n return faFilePowerpoint; // powerpoint\n } else if (excelExtensions.includes(extension)) {\n return faFileExcel; // excel\n } else if (zipExtensions.includes(extension)) {\n return faFileZipper; // zip\n } else {\n return faFile; // everything else\n }\n}\n\nfunction FileIcon({\n extension,\n muted = false,\n className,\n}: {\n extension: string;\n muted?: boolean;\n className?: string;\n}) {\n const icon = chooseFileIcon(extension);\n\n return (\n <FontAwesomeIcon\n icon={icon}\n className={classNames(\n `file-type file-type-${extension}`,\n className || \"text-2xl\",\n { muted: muted },\n )}\n />\n );\n}\n\nexport default FileIcon;\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 from \"react\";\nimport PropTypes from \"prop-types\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faFolder,\n faUsers,\n faEarthEurope,\n} from \"@fortawesome/pro-regular-svg-icons\";\n\nconst FolderIcons = {\n folder: faFolder,\n root_folder: faUsers,\n activitystream_folder: faEarthEurope,\n};\n\ntype FolderIconArgs = {\n type?: string;\n muted?: boolean;\n className?: string;\n};\nfunction FolderIcon({ type, muted, className }: FolderIconArgs) {\n return (\n <FontAwesomeIcon\n icon={FolderIcons[type || \"folder\"]}\n className={classNames(`icons-folder`, className, {\n \"text-muted\": !!muted,\n })}\n />\n );\n}\nFolderIcon.propTypes = { type: PropTypes.string, muted: PropTypes.bool };\n\nexport default FolderIcon;\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 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 React from \"react\";\nimport MarkdownTranslation from \"components/shared/MarkdownTranslation\";\nimport classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCircleInfo } from \"@fortawesome/pro-regular-svg-icons\";\n\nfunction InfoText({\n translation,\n className,\n showIcon = true,\n small = false,\n}: {\n translation: string;\n showIcon?: boolean;\n small?: boolean;\n className?: string;\n}) {\n return (\n <div\n className={classNames(\n \"flex align-baseline\",\n {\n \"gap-2\": small,\n \"mb-4\": small,\n \"gap-4\": !small,\n \"mb-6\": !small,\n },\n className,\n )}\n >\n {showIcon && (\n <FontAwesomeIcon\n icon={faCircleInfo}\n className={classNames(\"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 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 from \"react\";\n\ninterface MarkdownTranslationTypes {\n translation: string;\n styles?: string;\n options?: Record<PropertyKey, unknown>;\n}\n\nfunction MarkdownTranslation({\n translation,\n styles,\n options = {},\n}: MarkdownTranslationTypes) {\n return (\n <div\n className={styles}\n dangerouslySetInnerHTML={{\n __html: Application.markdown(I18n.t(translation, options)),\n }}\n />\n );\n}\n\nexport default MarkdownTranslation;\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 {\n faUser,\n faUsers,\n faChevronRight,\n} from \"@fortawesome/pro-regular-svg-icons\";\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 \"member\":\n return I18n.t(\"js.member_select.options.key.member\");\n case \"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={faUser} />,\n \" \",\n entry.name,\n ],\n type: \"member\",\n },\n ]);\n }\n\n const icon = {\n member: faUser,\n group: faUsers,\n standard: faChevronRight,\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 {\n input,\n multi,\n wrapperStyle,\n id,\n field,\n membersAndGroups,\n ...selectProps\n } = props;\n const asyncPropsOptions = {\n ...selectProps,\n isMulti: multi,\n loadOptions,\n placeholder: membersAndGroups\n ? I18n.t(\"js.audience_select.placeholder\")\n : 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 className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n unstyled\n />\n );\n }\n}\n\nexport default connect(null, { fetchMembers, fetchMembersAndGroups })(\n MemberSelect,\n);\n","import React, { MouseEventHandler } from \"react\";\nimport classnames from \"classnames\";\n\nexport type ModalActionsProps = {\n closeModal?: MouseEventHandler<HTMLAnchorElement>;\n submitText?: string;\n submit?: MouseEventHandler<HTMLAnchorElement>;\n modalSubmitActionClassName?: string;\n};\n\nfunction ModalActions({\n closeModal,\n submitText,\n submit,\n modalSubmitActionClassName,\n}: ModalActionsProps) {\n return (\n <div className=\"form-actions modal-footer\">\n <a\n href=\"#\"\n onClick={closeModal}\n className=\"btn btn-link\"\n data-bs-dismiss=\"modal\"\n >\n {I18n.t(\"js.cancel\")}\n </a>\n <a\n href=\"#\"\n onClick={submit}\n className={classnames(\"btn btn-primary\", modalSubmitActionClassName)}\n >\n {submitText ? I18n.t(submitText) : \"\"}\n </a>\n </div>\n );\n}\n\nexport default ModalActions;\n","import type { ModalActionsProps } from \"./modal/ModalActions\";\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { isEmpty } from \"lodash\";\nimport classnames from \"classnames\";\nimport BootstrapModal from \"bootstrap/js/dist/modal\";\nimport ModalActions from \"./modal/ModalActions\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faXmark } from \"@fortawesome/pro-solid-svg-icons\";\n\nlet id = 0;\n\ntype ModalProps = {\n title?: string;\n static?: boolean;\n fullscreen?: boolean;\n onClose?(...args: unknown[]): unknown;\n resizeCallback?(...args: unknown[]): unknown;\n modalClassName?: string;\n useMinHeightMax?: boolean;\n children?: React.ReactNode;\n modalActionProps?: ModalActionsProps;\n};\n\nclass Modal extends React.Component<ModalProps> {\n el: HTMLDivElement;\n static Spinner: (args: SpinnerProps) => JSX.Element;\n shown: boolean | undefined;\n hiding: boolean | undefined;\n modal: BootstrapModal | undefined;\n private readonly id: string;\n private modalEl: Element | undefined;\n\n constructor(props: ModalProps) {\n super(props);\n this.id = `modal-${id++}`;\n // React renders into this el\n this.el = document.createElement(\"div\");\n this.el.id = this.id + \"-root\";\n }\n\n componentDidMount() {\n const backdropExists =\n document.body.getElementsByClassName(\"modal-backdrop\").length > 0;\n\n this.modalEl = this.el.children[0];\n this.modal = new BootstrapModal(this.modalEl, {\n backdrop: this.props.static ? \"static\" : !backdropExists,\n });\n this.modal.show();\n\n this.modalEl.addEventListener(\"shown.bs.modal\", () => (this.shown = true));\n this.modalEl.addEventListener(\"hide.bs.modal\", () => (this.hiding = true));\n this.modalEl.addEventListener(\"hidden.bs.modal\", (e) => {\n this.hiding = false;\n this.shown = false;\n this.props.onClose?.(e);\n });\n\n if (this.props.fullscreen) {\n window.addEventListener(\"resize\", this.onResize);\n this.onResize();\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", this.onResize);\n // This is critical because bootstrap ignores method calls during transitions\n // https://getbootstrap.com/docs/5.3/components/modal/#methods\n if (this.shown) {\n this.remove();\n } else {\n this.modalEl?.addEventListener(\"shown.bs.modal\", this.remove);\n }\n }\n\n remove = () => {\n if (!this.hiding) {\n this.hiding = true;\n this.modal?.hide();\n this.modalEl?.addEventListener(\"hidden.bs.modal\", () => {\n this.modal?.dispose();\n this.el.remove();\n });\n }\n };\n\n onResize = () => {\n const modalBodyHeight = ($(window).height() as number) - 161; // 60px margin, 71px header, 30px padding\n\n $(this.el)\n .find(\".modal-body\")\n .css({\n height: `${modalBodyHeight}px`,\n maxHeight: `${modalBodyHeight}px`,\n });\n\n if (this.props.resizeCallback) {\n this.props.resizeCallback($(this.el), modalBodyHeight);\n }\n };\n\n render() {\n const header: Array<React.ReactNode> = [];\n if (!isEmpty(this.props.title))\n header.push(\n <h5 id={this.id + \"-label\"} className=\"modal-title\" key=\"title\">\n {this.props.title}\n </h5>,\n );\n\n header.push(\n <button\n type=\"button\"\n className=\"btn mr-1\"\n data-bs-dismiss=\"modal\"\n aria-label=\"Close\"\n key=\"close\"\n >\n <FontAwesomeIcon icon={faXmark} />\n </button>,\n );\n\n const modal = (\n <div\n id={this.id}\n className={classnames(\n \"modal fade singleton-modal\",\n this.props.modalClassName,\n )}\n tabIndex={-1}\n role=\"dialog\"\n aria-labelledby={this.id + \"-label\"}\n aria-hidden=\"true\"\n >\n <div\n className={classnames(\n \"modal-dialog modal-lg modal-dialog-centered tixxt-modal-body p-2 md:p-10\",\n { \"modal-fullscreen\": this.props.fullscreen },\n )}\n >\n <div className=\"modal-content\">\n {!isEmpty(header) ? (\n <div className=\"modal-header\">{header}</div>\n ) : null}\n <div\n className={classnames(\"modal-body\", {\n \"!min-h-max\": this.props.useMinHeightMax,\n })}\n >\n {this.props.children}\n </div>\n {!isEmpty(this.props.modalActionProps) ? (\n <ModalActions {...(this.props.modalActionProps || {})} />\n ) : null}\n </div>\n </div>\n </div>\n );\n\n document.body.appendChild(this.el);\n return ReactDOM.createPortal(modal, this.el, this.id);\n }\n}\n\nModal.Spinner = Spinner;\n\ntype SpinnerProps = {\n label: string;\n};\n\nfunction Spinner({ label }: SpinnerProps) {\n return (\n <div\n style={{\n minHeight: 200,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n }}\n >\n <i className=\"fa fa-spinner fa-pulse fa-5x fa-fw\" />\n <span className=\"sr-only\">{label || \"Loading\"}</span>\n {label ? <div style={{ marginTop: 16 }}>{label}</div> : null}\n </div>\n );\n}\n\nexport default Modal;\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinner } from \"@fortawesome/pro-regular-svg-icons\";\n\nexport default function PageLoading() {\n return (\n <div className=\"flex gap-2 items-center\">\n <FontAwesomeIcon icon={faSpinner} spin />\n {I18n.t(\"js.loading\")}\n </div>\n );\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 from \"react\";\nimport {\n MembershipRole,\n PermissionPickableWithDisabled,\n SystemRole,\n} from \"components/shared/DirectoryPicker/types\";\nimport DirectoryPicker from \"components/shared/DirectoryPicker\";\nimport { includes } from \"lodash\";\n\nconst query = { include_membership_roles: true };\n\n/**\n * UI element analogous to the selection of memberships in the Appointment-Create form (invitations) to assign the following users/roles to an action:\n *\n * - Network administrators\n * - Groups (all members)\n * - Groups (administrators only)\n * - Groups (membership role)\n * - Network-wide memberships role\n * - Individual memberships\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport default React.forwardRef(function PermissionPicker(props, _ref) {\n async function extraOptions(\n inputValue: string,\n ): Promise<PermissionPickableWithDisabled[]> {\n return [...systemRoles(inputValue), ...networkMembershipRoles(inputValue)];\n }\n\n function systemRoles(inputValue: string): PermissionPickableWithDisabled[] {\n const systemRoles: SystemRole[] = [\n {\n type: \"system_role\",\n id: \"network_admin\",\n name: I18n.t(\"js.permission_picker.system_roles.network_admin\"),\n },\n ];\n return filterByInputValue(systemRoles, inputValue);\n }\n\n return (\n <DirectoryPicker\n {...props}\n placeholder={I18n.t(\"js.permission_picker.placeholder\")}\n multi\n extraOptions={extraOptions}\n query={query}\n />\n );\n});\n\nexport function networkMembershipRoles(\n inputValue: string,\n): PermissionPickableWithDisabled[] {\n const membershipRoles: MembershipRole[] =\n Preload.current_network.membership_roles.map((r) => ({\n ...r,\n type: \"membership_role\",\n }));\n\n return filterByInputValue(membershipRoles, inputValue);\n}\n\nfunction filterByInputValue<T extends { name: string }>(\n items: T[],\n inputValue: string,\n): T[] {\n return items.filter((r) =>\n includes(r.name.toLowerCase(), inputValue.toLowerCase()),\n );\n}\n","import React from \"react\";\nimport { SimpleMembership } from \"../../@types\";\nimport classNames from \"classnames\";\n\nconst fallbackImageUrl = \"/assets/misc/profile_50x50.jpg\";\nconst findImage = (membership: SimpleMembership, width, height): string => {\n const image = membership.images.find(\n (i) => i.width == width && i.height == height,\n );\n return image ? image.url : fallbackImageUrl;\n};\n\nexport function ProfileImage({\n membership,\n className,\n size,\n}: {\n membership: SimpleMembership;\n className?: string;\n size?: number;\n}) {\n return (\n <img\n className={classNames(\"rounded-full\", className || \"w-5 h-5\")}\n src={findImage(membership, size || 50, size || 50)}\n alt={\"\"}\n aria-hidden\n />\n );\n}\n\nexport default function SimpleMembershipShow({\n membership,\n}: {\n membership: SimpleMembership;\n}) {\n return (\n <div className={\"inline-block\"}>\n {membership.id ? (\n <a\n href={`/members/${membership.id}`}\n className={\"flex flex-row items-center gap-2\"}\n >\n <ProfileImage membership={membership} />\n <span>{membership.name}</span>\n </a>\n ) : (\n <span className={\"text-muted\"}>{membership.name}</span>\n )}\n </div>\n );\n}\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 disabled?: boolean;\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 disabled: props.disabled,\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\";\nimport { removeSearchParams } from \"helpers/tixxt-router\";\n\ninterface TabBarProps {\n tabs: Array<{\n label: string;\n required?: boolean;\n error?: Error;\n url?: string;\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={tab.url || \"#\"}\n onClick={(e) => {\n !tab.url && e.preventDefault();\n selectTabIndex(i);\n removeSearchParams();\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 classNames from \"classnames\";\nimport React from \"react\";\n\ntype Props = {\n name: string;\n href: string;\n isReaderTag?: boolean;\n};\nexport default function Tag({ name, href, isReaderTag }: Props) {\n return (\n <a\n href={href}\n className={classNames(\"tag\", { \"tag--reader\": isReaderTag })}\n >\n {name}\n </a>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport { useQuery } from \"react-query\";\nimport classNames from \"classnames\";\nimport { useSelector } from \"react-redux\";\nimport { currentMemberSelector } from \"selectors/environment\";\nimport DropDown, {\n DropDownItem,\n DropDownSubMenu,\n} from \"components/shared/DropDown\";\nimport { faLanguage } from \"@fortawesome/pro-light-svg-icons\";\n\ninterface TranslationDropDownProps {\n handleLanguageSelect: (\n event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n language: string,\n ) => void;\n object_language: string;\n buttonClassName?: string;\n}\n\ninterface Language {\n language: string;\n name: string;\n supports_formality: boolean;\n}\n\nexport const ORIGINAL_LANGUAGE_SIGNIFIER = \"ORIGINAL\";\n\nexport default function TranslationDropDown({\n handleLanguageSelect,\n object_language,\n buttonClassName,\n}: TranslationDropDownProps) {\n const currentMember = useSelector(currentMemberSelector);\n const { data: languages } = useQuery<Language[]>(\"/translations/languages\", {\n refetchOnWindowFocus: false,\n });\n const [primaryLanguages, setPrimaryLanguages] = useState<Language[]>([]);\n const [secondaryLanguages, setSecondaryLanguages] = useState<Language[]>([]);\n\n const [selectedLanguage, setSelectedLanguage] = useState(\n object_language || ORIGINAL_LANGUAGE_SIGNIFIER,\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 useEffect(() => {\n const [primary, secondary] = categorizeLanguages();\n setPrimaryLanguages(primary);\n setSecondaryLanguages(secondary);\n }, [languages, selectedLanguage, currentMember]);\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) => {\n event.preventDefault();\n handleLanguageSelect(event, lang.language);\n setSelectedLanguage(lang.language);\n }}\n >\n {lang.name}\n </a>\n );\n }\n\n if (!Tixxt.currentNetwork.getConfig(\"translations.deep_l.enabled\")) return;\n\n return (\n <div className=\"translation-controls\">\n <DropDown.Toggle\n className={classNames(\n \"translate-button text-muted text-sm\",\n buttonClassName,\n )}\n icon={faLanguage}\n buttonType=\"normal\"\n small\n />\n <DropDown>\n {selectedLanguage !== ORIGINAL_LANGUAGE_SIGNIFIER && (\n <DropDownItem>\n <a\n className=\"dropdown-item translate-menu-item\"\n href=\"#\"\n onClick={(event) => {\n event.preventDefault();\n handleLanguageSelect(event, ORIGINAL_LANGUAGE_SIGNIFIER);\n setSelectedLanguage(ORIGINAL_LANGUAGE_SIGNIFIER);\n }}\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 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 classNames from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faStar as faRegularStar } from \"@fortawesome/pro-regular-svg-icons\";\nimport { faStar as faSolidStar } from \"@fortawesome/pro-solid-svg-icons\";\nimport React from \"react\";\nimport useTooltip from \"../../../hooks/useTooltip\";\n\ntype ToggleFavoriteButtonArgs = {\n title: string;\n toggleFavorited: () => void;\n isLoading: boolean;\n favorited: boolean;\n};\n\nexport default function ToggleFavoriteButton({\n title,\n isLoading,\n toggleFavorited,\n favorited,\n}: ToggleFavoriteButtonArgs) {\n const tooltipRef = useTooltip<HTMLButtonElement>(title);\n\n return (\n <button\n ref={tooltipRef}\n data-bs-toggle=\"tooltip\"\n title={title}\n className={classNames(\"btn btn-sm\", {\n \"cursor-wait\": isLoading,\n \"text-favorite hover:text-favorite\": favorited,\n \"text-gray-200 hover:text-favorite/50\": !favorited,\n })}\n disabled={isLoading}\n onClick={toggleFavorited}\n >\n <FontAwesomeIcon icon={favorited ? faSolidStar : faRegularStar} />\n </button>\n );\n}\n","import React from \"react\";\nimport classNames from \"classnames\";\n\ninterface ControlsProps {\n wrapperClassName: string;\n children: React.ReactNode;\n label?: React.ReactNode;\n required?: boolean;\n htmlFor?: string;\n name?: string;\n className?: string;\n\n onLabelClick?(...args: unknown[]): unknown;\n}\n\nexport function Controls({\n wrapperClassName,\n children,\n label,\n required,\n htmlFor,\n name,\n onLabelClick,\n className,\n}: ControlsProps) {\n return (\n <div className={wrapperClassName}>\n {label ? (\n <label\n className=\"control-label\"\n htmlFor={htmlFor}\n onClick={onLabelClick}\n data-property-name={name}\n >\n {label}{\" \"}\n {required ? <abbr title={I18n.t(\"js.required\")}>*</abbr> : null}\n </label>\n ) : null}\n <div className={classNames(\"controls\", className)}>{children}</div>\n </div>\n );\n}\n\ninterface ControlGroupProps {\n name?: string;\n label?: React.ReactNode | string;\n required?: boolean;\n children?: React.ReactNode;\n htmlFor?: string;\n className?: string;\n error?: boolean;\n onLabelClick?(...args: unknown[]): unknown;\n}\n\nfunction ControlGroup({\n name,\n label,\n required,\n children,\n htmlFor,\n className,\n error,\n onLabelClick,\n}: ControlGroupProps) {\n return (\n <Controls\n wrapperClassName={classNames(\"control-group input\", `property-${name}`, {\n required,\n error,\n })}\n className={className}\n htmlFor={htmlFor || name}\n label={label}\n onLabelClick={onLabelClick}\n required={required}\n name={name}\n >\n {children}\n </Controls>\n );\n}\n\nexport default ControlGroup;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useDispatch } from \"react-redux\";\nimport { change } from \"redux-form\";\nimport { compose, withHandlers } from \"recompose\";\nimport {\n isEmpty,\n map,\n each,\n castArray,\n compact,\n get,\n last,\n zip,\n isMatch,\n groupBy,\n sum,\n} from \"lodash\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport withDragDropContext from \"components/shared/withDragDropContext\";\nimport ImagePreview from \"./fileUploadField/ImagePreview\";\nimport FileInput from \"./fileUploadField/FileInput\";\nimport UploadedFile from \"./fileUploadField/UploadedFile\";\nimport FieldError from \"components/appCreator/items/form/FieldError\";\nimport { uploadFile } from \"actions/files\";\nimport UploadBar from \"./fileUploadField/UploadBar\";\n\n// Use this with redux-form. For use with react-hook-form you need components/shared/form/fields/FileUpload.tsx\nconst FileUploadField = ({\n multiple,\n onRemoveFile,\n storageDirectory = \"files\",\n input,\n meta,\n isImage,\n selectExisting,\n accept,\n}) => {\n const dispatch = useDispatch();\n const files = compact(castArray(input.value));\n\n // Queues given files for uploading.\n // Discards all but the first file if it is non-multiple\n // and displays warning to the user.\n const uploadFiles = (rawFiles) => {\n const filesData = map(rawFiles, (file) => ({\n name: file.name,\n type: file.type,\n extension: last(file.name.split(\".\")),\n clientId: uuidv4(),\n progress: 0,\n state: \"uploading\",\n }));\n dispatch(change(meta.form, input.name, [...files, ...filesData]));\n\n each(zip(rawFiles, filesData), ([file, { clientId }]) => {\n dispatch(\n uploadFile({\n form: meta.form,\n inputName: input.name,\n clientId,\n file,\n storageDirectory,\n }),\n );\n });\n };\n\n const onSelectExistingFile = (selectedFiles) => {\n dispatch(change(meta.form, input.name, [...files, ...selectedFiles]));\n };\n\n const filesByState = {\n published: [],\n volatile: [],\n uploading: [],\n failed: [],\n ...groupBy(files, \"state\"),\n };\n\n const availableFiles = [...filesByState.published, ...filesByState.volatile];\n const uploadingFiles = [...filesByState.volatile, ...filesByState.uploading];\n const nonRemovedFiles = [\n ...filesByState.published,\n ...filesByState.volatile,\n ...filesByState.failed,\n ...filesByState.uploading,\n ];\n\n return (\n <>\n <div className=\"fileUploadField border-box p-3 flex items-stretch gap-2 mt-2\">\n {isImage && !multiple ? (\n <ImagePreview\n imageId={get(availableFiles, [0, \"id\"])}\n storageDirectory={storageDirectory}\n />\n ) : null}\n <FileInput\n isImage={isImage}\n acceptedType={\n accept ||\n (storageDirectory === \"images\" || storageDirectory === \"assets\"\n ? \"image/*\"\n : \"*\")\n }\n storageDirectory={storageDirectory}\n multiple={multiple}\n empty={isEmpty(availableFiles)}\n onSelectFile={(e) => uploadFiles(e.target.files)}\n selectExisting={!isImage && selectExisting}\n onSelectExistingFile={onSelectExistingFile}\n onDropFile={({ files }) => uploadFiles(files)}\n {...input}\n />\n </div>\n <div className=\"upload-states-view flex flex-col gap-px py-px\">\n {uploadingFiles.length > 1 ? (\n <div className=\"upload-status\">\n <div className=\"upload-progress\">\n <UploadBar\n progress={\n sum(map(uploadingFiles, \"progress\")) / uploadingFiles.length\n }\n state=\"uploading\"\n />\n </div>\n <div className=\"upload-controls\">\n <div>\n <span className=\"text-sm\">\n {I18n.t(\"js.files.uploader.total_progress\", {\n completed: filesByState.volatile.length,\n total: uploadingFiles.length,\n })}\n </span>\n </div>\n </div>\n </div>\n ) : null}\n {map(nonRemovedFiles, (file, key) => (\n <UploadedFile\n key={`${file.external_id || file.id}-${key}`}\n file={file}\n remove={onRemoveFile}\n />\n ))}\n </div>\n {meta.submitFailed && meta.error && <FieldError error={meta.error} />}\n </>\n );\n};\nconst valuePropType = PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string,\n progress: PropTypes.number,\n state: PropTypes.string,\n external_id: PropTypes.string,\n type: PropTypes.string,\n});\nFileUploadField.propTypes = {\n multiple: PropTypes.bool,\n storageDirectory: PropTypes.string,\n isImage: PropTypes.bool,\n onSelectFile: PropTypes.func,\n onDropFile: PropTypes.func,\n onRemoveFile: PropTypes.func,\n selectExisting: PropTypes.bool,\n input: PropTypes.shape({\n name: PropTypes.string,\n value: PropTypes.oneOfType([\n PropTypes.arrayOf(valuePropType),\n valuePropType,\n PropTypes.any,\n ]),\n onChange: PropTypes.func,\n }),\n meta: PropTypes.shape({\n form: PropTypes.string,\n error: PropTypes.string,\n submitFailed: PropTypes.bool,\n }),\n className: PropTypes.string,\n};\n\nexport default compose(\n withDragDropContext,\n withHandlers({\n onRemoveFile:\n ({ input }) =>\n (criteria) => {\n window.bridge.confirm(I18n.t(\"js.files.file.delete_confirm\"), () => {\n const files = compact(castArray(input.value));\n input.onChange(\n // Marks files to be removed in publish phase\n // removes failed uploads immediately\n compact(\n map(files, (f) =>\n isMatch(f, criteria)\n ? f.state === \"failed\"\n ? null\n : { ...f, state: \"removed\" }\n : f,\n ),\n ),\n );\n });\n },\n }),\n)(FileUploadField);\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\n\ninterface HintProps {\n hint?: string;\n className?: string;\n}\n\nfunction Hint({ hint, className = \"\" }: HintProps) {\n return isEmpty(hint) ? null : (\n <div\n className={`help-block ${className}`}\n dangerouslySetInnerHTML={{ __html: Application.markdown(hint) }}\n />\n );\n}\n\nexport default Hint;\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 type { ComponentType } from \"react\";\nimport React from \"react\";\nimport { DropTarget } from \"react-dnd\";\nimport { NativeTypes } from \"react-dnd-html5-backend\";\nimport classNames from \"classnames\";\nimport FileSelector from \"components/files/composer/FileSelector\";\nimport { FileData } from \"components/../@types/files\";\n\ntype FileInputArgs = {\n connectDropTarget?: (element: React.ReactElement<any, any>) => void;\n onSelectFile: (e: any) => void;\n multiple?: boolean;\n acceptedType: string;\n empty: boolean;\n isImage: boolean;\n isOver?: boolean;\n selectExisting?: boolean;\n onSelectExistingFile: (selectedFiles: FileData[]) => void;\n onDropFile: ({ files }: { files: any }) => void;\n storageDirectory: string;\n disabled?: boolean;\n};\n\nfunction FileInput({\n connectDropTarget,\n onSelectFile,\n multiple,\n acceptedType,\n empty,\n isImage,\n isOver,\n selectExisting,\n onSelectExistingFile,\n disabled = false,\n}: FileInputArgs) {\n return multiple || (!multiple && empty) ? (\n connectDropTarget?.(\n <div className=\"filesInput flex-1\">\n <div\n className={classNames(\n \"flex flex-col gap-2 h-full items-center justify-center min-h-[100px] uploader-dropzone\",\n { isOver },\n )}\n >\n <p\n className={classNames(\"font-medium\", { \"text-muted\": !!disabled })}\n >\n {I18n.t(\n `js.files.uploader.drag_and_drop_${\n isImage ? (multiple ? \"images\" : \"image\") : \"files\"\n }`,\n )}\n </p>\n <label\n className={classNames(\n \"fileInputButton btn btn-light btn-sm fileFocusButton\",\n { disabled: !!disabled },\n )}\n >\n <i className=\"fa-regular fa-upload\" />{\" \"}\n {I18n.t(\n `js.files.uploader.select_${isImage ? \"image\" : \"file\"}${\n multiple ? \"s\" : \"\"\n }`,\n )}\n <input\n type=\"file\"\n onChange={onSelectFile}\n multiple={multiple}\n accept={acceptedType}\n style={{ width: \"1px\", opacity: 0 }}\n disabled={disabled || (!multiple && !empty)}\n />\n </label>\n {selectExisting ? (\n <FileSelector\n currentRootFolder={\n Tixxt.currentContext\n ? Tixxt.currentContext.rootFolder().toJSON()\n : Tixxt.currentNetwork.rootFolder().toJSON()\n }\n onSelectFiles={onSelectExistingFile}\n disabled={disabled}\n />\n ) : null}\n </div>\n </div>,\n )\n ) : (\n <div className=\"filesInput\">\n <div className=\"filesDropTarget\">\n <p>\n {I18n.t(\n `js.files.uploader.remove_${isImage ? \"image\" : \"file\"}_hint`,\n )}\n </p>\n </div>\n </div>\n );\n}\n\nexport default DropTarget(\n [NativeTypes.FILE],\n {\n drop(props: { onDropFile(arg: unknown) }, monitor) {\n props.onDropFile(monitor.getItem());\n return props;\n },\n },\n (connect, monitor) => ({\n connectDropTarget: connect.dropTarget(),\n isOver: monitor.isOver(),\n }),\n)(FileInput as ComponentType<FileInputArgs>);\n","import React from \"react\";\nimport { isEmpty } from \"lodash\";\n\ninterface ImagePreviewTypes {\n imageId?: string;\n storageDirectory?: string;\n}\n\nfunction ImagePreview({\n imageId,\n storageDirectory = \"images\",\n}: ImagePreviewTypes) {\n return (\n <div className={\"imageView\"}>\n {!isEmpty(imageId) ? (\n <img\n className=\"max-h-32 max-w-32\"\n src={`/api/storage/${storageDirectory}/${imageId}/${\n storageDirectory === \"images\" ? \"get/200x200\" : \"preview\"\n }`}\n />\n ) : (\n <div className=\"imageIcon w-32 h-32 bg-gray-100 text-gray-400 text-center pt-4\">\n <i className=\"fa-light fa-image text-8xl\" />\n </div>\n )}\n </div>\n );\n}\n\nexport default ImagePreview;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { FileState } from \"../../../../@types/files\";\n\ninterface UploadBarTypes {\n state?: FileState;\n progress: number;\n}\n\nfunction UploadBar({ progress, state }: UploadBarTypes) {\n return (\n <div\n className={classNames(\"bar\", {\n \"bar-success\": state === \"volatile\" || state === \"published\",\n \"bar-danger\": state === \"failed\" || state === \"quarantine\",\n })}\n style={{\n width: `${state === \"uploading\" ? progress : 100}%`,\n }}\n />\n );\n}\n\nexport default UploadBar;\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCircleX as faSolidCircleX } from \"@fortawesome/pro-solid-svg-icons\";\nimport { faVirus as faRegularVirus } from \"@fortawesome/pro-regular-svg-icons\";\n\nimport FileIcon from \"components/shared/FileIcon\";\nimport UploadBar from \"./UploadBar\";\nimport MarkdownTranslation from \"../../MarkdownTranslation\";\nimport { FileData } from \"../../../../@types/files\";\n\ninterface UploadedFileTypes {\n file: FileData & { extension: string };\n remove(...args: unknown[]): unknown;\n}\n\nfunction UploadedFile({ file, remove }: UploadedFileTypes) {\n const handleRemoveClick = (e) => {\n e.preventDefault();\n const criteria = file.id ? { id: file.id } : { clientId: file.clientId };\n remove(criteria);\n };\n\n return (\n <div className=\"upload-status\">\n <div className=\"upload-progress\">\n <UploadBar progress={file.progress} state={file.state} />\n </div>\n <div className=\"upload-controls flex items-center\">\n <div className=\"flex gap-2 items-center truncate\">\n {file.state === \"quarantine\" ? (\n <>\n <FontAwesomeIcon icon={faRegularVirus} className={\"fa-lg mr-2\"} />\n <span className=\"font-bold\">\n {I18n.t(\"js.files.uploader.error_quarantine\")}\n </span>\n <span className=\"text-muted truncate\">{file.name}</span>\n </>\n ) : (\n <>\n <FileIcon extension={file.extension} />\n <span className=\"text-muted truncate\">{file.name}</span>\n </>\n )}\n </div>\n\n {file.status ? (\n <MarkdownTranslation\n translation={`js.files.uploader.error_code_${file.status}`}\n />\n ) : null}\n\n <a\n href=\"#remove\"\n className=\"remove btn\"\n onClick={handleRemoveClick}\n data-id={file.id}\n title={I18n.t(\"js.remove\")}\n >\n <FontAwesomeIcon icon={faSolidCircleX} className={\"fa-sm\"} />\n </a>\n </div>\n </div>\n );\n}\n\nexport default UploadedFile;\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faBoxArchive } from \"@fortawesome/pro-light-svg-icons\";\n\nexport default function DangerZone({\n title,\n body,\n actions,\n}: {\n title: string;\n body: React.ReactNode;\n actions: React.ReactNode;\n}) {\n return (\n <div className=\"danger-zone mt-6\">\n <h1 className=\"font-semibold text-xl my-6\">{title}</h1>\n <div className=\"alert alert-danger flex gap-4\">\n <div>\n <FontAwesomeIcon icon={faBoxArchive} size=\"5x\" />\n </div>\n <div className=\"grow space-y-2\">\n <p>{body}</p>\n <div className=\"flex gap-2\">{actions}</div>\n </div>\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\ntype LabelArgs = {\n label: string;\n required?: boolean;\n};\nexport default function Label({ label, required = false }: LabelArgs) {\n return (\n <label className=\"control-label\">\n {label} {required && <abbr title={I18n.t(\"required\")}>*</abbr>}\n </label>\n );\n}\n","import { UseFormRegister } from \"react-hook-form\";\nimport React from \"react\";\nimport classNames from \"classnames\";\nimport useRegisterPropOrFromContext from \"components/shared/form/fields/useRegisterPropOrFromContext\";\n\nexport default function Checkbox({\n name,\n register,\n label,\n disabled = false,\n className,\n}: {\n name: string;\n label: string;\n register?: UseFormRegister<any>;\n disabled?: boolean;\n className?: string;\n}) {\n register = useRegisterPropOrFromContext(register);\n\n return (\n <label\n className={classNames(\"checkbox gap-2 items-center\", className, {\n \"text-muted\": disabled,\n })}\n >\n <input type=\"checkbox\" {...register(name)} disabled={disabled} />\n {label}\n </label>\n );\n}\n","import React from \"react\";\nimport Label from \"components/shared/form/Label\";\nimport { Control, useController } from \"react-hook-form\";\nimport DirectoryPicker, {\n DirectoryPickerProps,\n} from \"components/shared/DirectoryPicker\";\nimport Hint from \"components/shared/fields/Hint\";\nimport { MultiValue, SingleValue } from \"react-select\";\nimport { ValueType } from \"components/shared/DirectoryPicker/types\";\nimport classNames from \"classnames\";\n\ntype InputArgs = {\n name: string;\n control?: Control<any>;\n label?: string;\n hint?: string;\n required?: string | boolean;\n placeholder?: string;\n multiline?: boolean;\n maxLength?: number;\n defaultValue?: string;\n apiToValues?: (\n apiValues: any,\n ) => MultiValue<ValueType> | SingleValue<ValueType>;\n valuesToApi?: (\n formValues: MultiValue<ValueType> | SingleValue<ValueType>,\n ) => any;\n children?: React.ReactNode;\n};\n\nexport default function DirectoryPickerInput({\n label,\n control,\n name,\n hint,\n required = false,\n defaultValue,\n apiToValues,\n valuesToApi,\n children,\n ...directoryPickerProps\n}: InputArgs & DirectoryPickerProps) {\n const {\n field,\n fieldState: { invalid },\n } = useController({\n name,\n rules: { required },\n defaultValue,\n control,\n });\n\n return (\n <div className=\"control-group\">\n {label && <Label label={label} required={!!required} />}\n <div\n className={classNames(\"controls\", {\n \"border-box p-3\": !!children,\n \"field-error\": invalid,\n })}\n >\n <DirectoryPicker\n {...directoryPickerProps}\n {...field}\n value={apiToValues ? apiToValues(field.value) : field.value}\n onChange={(values) =>\n field.onChange(valuesToApi ? valuesToApi(values) : values)\n }\n />\n {hint && <Hint hint={hint} />}\n {children}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport {\n isEmpty,\n map,\n each,\n compact,\n get,\n last,\n zip,\n isMatch,\n groupBy,\n sum,\n find,\n has,\n filter,\n} from \"lodash\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { ControllerRenderProps } from \"react-hook-form\";\nimport { useMutation } from \"react-query\";\nimport axios from \"axios\";\n\nimport withDragDropContext from \"components/shared/withDragDropContext\";\nimport ImagePreview from \"components/shared/fields/fileUploadField/ImagePreview\";\nimport FileInput from \"components/shared/fields/fileUploadField/FileInput\";\nimport UploadedFile from \"components/shared/fields/fileUploadField/UploadedFile\";\nimport UploadBar from \"components/shared/fields/fileUploadField/UploadBar\";\nimport { FileData } from \"../../../../@types/files\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport classNames from \"classnames\";\n\ntype FileUploadArgs = {\n multiple: boolean;\n storageDirectory: string;\n isImage: boolean;\n selectExisting: boolean;\n field: ControllerRenderProps<any>;\n accept: string;\n disabled?: boolean;\n};\n\ntype UploadFileArgs = {\n fileData: { clientId: string; file: File; storageDirectory: string };\n setProgress: (data: FileData) => void;\n};\nasync function uploadFile({ fileData, setProgress }: UploadFileArgs) {\n const data = new FormData();\n data.append(\"file\", fileData.file);\n data.append(\"name\", fileData.file.name);\n data.append(\"type\", fileData.file.type);\n data.append(\"external_id\", fileData.clientId);\n\n const response = await axios.post(\n `/api/storage/${fileData.storageDirectory}`,\n data,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n onUploadProgress: ({ loaded, total }) => {\n if (total) {\n const progress = (loaded * 100) / total;\n setProgress({\n ...fileData.file,\n name: fileData.file.name,\n type: fileData.file.type,\n size: fileData.file.size,\n clientId: fileData.clientId,\n progress,\n });\n }\n },\n },\n );\n\n return response.data;\n}\n\n// Use this with react-hook-form\nfunction FileUpload({\n multiple,\n storageDirectory = \"files\",\n isImage,\n selectExisting,\n accept,\n field,\n disabled = false,\n}: FileUploadArgs) {\n let selectedFiles = field.value;\n // Values sent to onChange being reflected in value take some time, so we have to store the real value locally\n // in case setProgress is fired quickly, i.e. when selecting multiple files\n const onChangeLocal = (newValue) => {\n selectedFiles = newValue;\n field.onChange(newValue);\n };\n\n const { mutate: getFileToken } = useMutation<\n { token: string },\n Error,\n { fileId: string }\n >(\n async ({ fileId }) =>\n fetchApi(`/api/storage/files/${fileId}/token`, {\n method: \"GET\",\n }),\n {\n onSuccess: (data, params) => {\n setToken(data.token, params.fileId);\n },\n },\n );\n\n const setProgress = (data: FileData) => {\n const newValue = map(selectedFiles, (f) =>\n isMatch(f, { clientId: data.clientId }) ? { ...f, ...data } : f,\n );\n\n if (!find(selectedFiles, { clientId: data.clientId })) {\n newValue.push(data);\n }\n onChangeLocal(newValue);\n };\n\n const setToken = (token: string, fileId: string) => {\n const newValue = map(selectedFiles, (f) =>\n isMatch(f, { id: fileId }) ? { ...f, token } : f,\n );\n onChangeLocal(newValue);\n };\n\n const { mutate: onUploadFile } = useMutation(\n (fileData: { clientId: string; file: File; storageDirectory: string }) =>\n uploadFile({ fileData, setProgress }),\n {\n onSuccess: (data, variables) => {\n setProgress({\n ...data,\n id: data.id,\n name: variables.file.name,\n size: variables.file.size,\n type: variables.file.type,\n clientId: variables.clientId,\n state: \"volatile\",\n progress: 100,\n });\n },\n onError: (error: { response: { status: string } }, data) => {\n setProgress({\n ...data.file,\n clientId: data.clientId,\n progress: 0,\n state: \"failed\",\n status: error.response.status,\n });\n },\n },\n );\n\n const onRemoveFile = (criteria: { [key: string]: string }) => {\n window?.bridge?.confirm(I18n.t(\"js.files.file.delete_confirm\"), () => {\n const newValue = compact(\n map(selectedFiles, (f) =>\n isMatch(f, criteria) ? { ...f, state: \"removed\" } : f,\n ),\n );\n onChangeLocal(newValue);\n });\n };\n\n // Queues given files for uploading.\n // Discards all but the first file if it is non-multiple\n // and displays warning to the user.\n function handleUploadFiles(rawFiles: File[]) {\n const filesData = map(rawFiles, (file) => ({\n name: file.name,\n type: file.type,\n extension: last(file.name.split(\".\")),\n clientId: uuidv4(),\n progress: 0,\n state: \"uploading\",\n }));\n\n const newValue = [...(selectedFiles || []), ...filesData];\n onChangeLocal(newValue);\n\n each(zip(rawFiles, filesData), (zippedPair) => {\n const [file, fileData] = zippedPair;\n if (file && fileData) {\n onUploadFile({\n clientId: fileData.clientId,\n file,\n storageDirectory,\n });\n }\n });\n }\n\n const onSelectExistingFile = (selectedExistingFiles: FileData[]) => {\n const newFiles = compact(\n map(selectedExistingFiles, (file) => {\n file.id && getFileToken({ fileId: file.id });\n return find(selectedFiles, { id: file.id }) ? null : file;\n }),\n );\n onChangeLocal([...selectedFiles, ...newFiles]);\n };\n\n const filesByState = {\n published: [] as FileData[],\n volatile: [] as FileData[],\n uploading: [] as FileData[],\n failed: [] as FileData[],\n ...groupBy(selectedFiles, \"state\"),\n };\n\n // Files without state that came with the defaultValue through e.g. edit something\n const filesWithoutState = map(\n filter(selectedFiles, (file) => !has(file, \"state\")),\n (file) => ({ ...file, state: \"published\" }),\n );\n\n const availableFiles = [\n ...filesWithoutState,\n ...filesByState.published,\n ...filesByState.volatile,\n ];\n const uploadingFiles = [...filesByState.volatile, ...filesByState.uploading];\n const nonRemovedFiles = [\n ...filesWithoutState,\n ...filesByState.published,\n ...filesByState.volatile,\n ...filesByState.failed,\n ...filesByState.uploading,\n ];\n\n return (\n <>\n <div\n className={classNames(\"fileUploadField border-box p-3\", {\n \"bg-neutral/25\": !!disabled,\n })}\n >\n <div className=\"flex items-stretch gap-2 mt-2\">\n {isImage && !multiple ? (\n <ImagePreview\n imageId={get(availableFiles, [0, \"id\"])}\n storageDirectory={storageDirectory}\n />\n ) : null}\n <FileInput\n isImage={isImage}\n acceptedType={\n accept ||\n (storageDirectory === \"images\" || storageDirectory === \"assets\"\n ? \"image/*\"\n : \"*\")\n }\n storageDirectory={storageDirectory}\n multiple={multiple}\n empty={isEmpty(availableFiles)}\n onSelectFile={(e) => handleUploadFiles(e.target.files)}\n selectExisting={!isImage && selectExisting}\n onSelectExistingFile={onSelectExistingFile}\n onDropFile={({ files }) => handleUploadFiles(files)}\n disabled={disabled}\n {...field}\n />\n </div>\n <div className=\"upload-states-view flex flex-col gap-px py-px -m-3 mt-4\">\n {uploadingFiles.length > 1 && (\n <div className=\"upload-status\">\n <div className=\"upload-progress\">\n <UploadBar\n progress={\n sum(map(uploadingFiles, \"progress\")) / uploadingFiles.length\n }\n state=\"uploading\"\n />\n </div>\n <div className=\"upload-controls\">\n <div>\n <span className=\"text-sm\">\n {I18n.t(\"js.files.uploader.total_progress\", {\n completed: filesByState.volatile.length,\n total: uploadingFiles.length,\n })}\n </span>\n </div>\n </div>\n </div>\n )}\n {map(nonRemovedFiles, (file, key) => (\n <UploadedFile\n key={`${file.external_id || file.id}-${key}`}\n file={file}\n remove={onRemoveFile}\n />\n ))}\n </div>\n </div>\n </>\n );\n}\n\nexport default withDragDropContext(FileUpload);\n","import Label from \"components/shared/form/Label\";\nimport React from \"react\";\nimport { Control, Controller } from \"react-hook-form\";\nimport FileUpload from \"components/shared/form/fields/FileUpload\";\n\nexport default function FileUploadField({\n control,\n name,\n label,\n options,\n hint,\n disabled = false,\n}: {\n name: string;\n label?: string;\n control?: Control<any>;\n options?: {\n isImage?: boolean;\n multiple?: boolean;\n selectExisting?: boolean;\n storageDirectory?: \"images\" | \"assets\" | \"files\";\n };\n hint?: string;\n disabled?: boolean;\n}) {\n return (\n <div className=\"control-group\">\n {label && <Label label={label} />}\n <div className=\"controls\">\n <Controller\n name={name}\n control={control}\n render={({ field }) => (\n <FileUpload field={field} {...options} disabled={disabled} />\n )}\n />\n {hint && <span className=\"text-muted text-sm\">{hint}</span>}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport default function FormActions({\n onCancel,\n saveDisabled,\n children,\n showCancel = true,\n showSave = true,\n}: {\n onCancel?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n saveDisabled?: boolean;\n children?: React.ReactNode;\n showCancel?: boolean;\n showSave?: boolean;\n}) {\n return (\n <div className=\"tixxt__form--actions\">\n {showCancel && (\n <button onClick={onCancel} className=\"btn btn-light\">\n {I18n.t(\"js.cancel\")}\n </button>\n )}\n {showSave && (\n <button className=\"btn btn-primary\" disabled={saveDisabled}>\n {I18n.t(\"js.save\")}\n </button>\n )}\n {children}\n </div>\n );\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faInfoCircle } from \"@fortawesome/pro-regular-svg-icons\";\nimport classNames from \"classnames\";\n\nexport default function Hint({\n text,\n usabilityHint = false,\n}: {\n text: string;\n usabilityHint?: boolean;\n}) {\n return (\n <div\n className={classNames(\"flex gap-4 align-baseline text-muted\", {\n \"mb-6\": usabilityHint,\n })}\n >\n {usabilityHint && (\n <FontAwesomeIcon className=\"ml-4\" icon={faInfoCircle} size=\"2xl\" />\n )}\n <span className=\"text-muted text-sm markdown-content prose\">{text}</span>\n </div>\n );\n}\n","import React from \"react\";\nimport { UseFormRegister } from \"react-hook-form\";\nimport Hint from \"components/shared/fields/Hint\";\nimport Label from \"components/shared/form/Label\";\nimport useRegisterPropOrFromContext from \"components/shared/form/fields/useRegisterPropOrFromContext\";\n\ntype InputArgs = {\n name: string;\n label?: string;\n required?: boolean;\n defaultValue?: string;\n register?: UseFormRegister<any>;\n options: { label: string; value: string }[];\n hint?: string;\n};\n\nexport default function RadioButton({\n name,\n register,\n label,\n options,\n hint,\n required,\n defaultValue,\n}: InputArgs) {\n register = useRegisterPropOrFromContext(register);\n\n return (\n <div className=\"control-group\">\n {label && <Label label={label} required={required} />}\n <div className=\"controls white-box checkboxes border-box p-3\">\n {options.map((option) => (\n <label key={option.value} className=\"radio gap-2 items-center\">\n <input\n type=\"radio\"\n value={option.value}\n {...(register ? register(name) : null)}\n defaultChecked={option.value === defaultValue}\n />\n {option.label}\n </label>\n ))}\n {hint && <Hint hint={hint} />}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport ReactSelect, { MultiValue, SingleValue } from \"react-select\";\n\nimport Label from \"components/shared/form/Label\";\nimport { Control, Controller } from \"react-hook-form\";\nimport { ValueType } from \"components/shared/DirectoryPicker/types\";\nimport Hint from \"components/shared/fields/Hint\";\n\ntype SelectArgs = {\n name: string;\n label?: string;\n multi?: boolean;\n required?: boolean | string;\n control?: Control<any>;\n options: { value: string; label: string }[];\n placeholder?: string;\n isSearchable?: boolean;\n hint?: string;\n valuesToApi?: (\n formValues: MultiValue<ValueType> | SingleValue<ValueType>,\n ) => any;\n};\nexport default function Select({\n label,\n name,\n multi = false,\n required = false,\n options,\n control,\n placeholder,\n isSearchable = true,\n hint,\n}: SelectArgs) {\n return (\n <div className=\"control-group\">\n {label && <Label label={label} required={!!required} />}\n <div className=\"controls remove-input-txt-border\">\n <Controller\n name={name}\n control={control}\n rules={{ required: required }}\n render={({ field }) => (\n <>\n <ReactSelect\n closeMenuOnSelect\n isMulti={multi}\n options={options}\n placeholder={placeholder}\n isSearchable={isSearchable}\n noOptionsMessage={() => I18n.t(\"js.plugins.select2.no_match\")}\n {...field}\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n unstyled\n />\n {hint && <Hint hint={hint} />}\n </>\n )}\n />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { UseFormRegister } from \"react-hook-form\";\nimport Label from \"components/shared/form/Label\";\nimport Hint from \"components/shared/fields/Hint\";\nimport useRegisterPropOrFromContext from \"components/shared/form/fields/useRegisterPropOrFromContext\";\n\ntype InputArgs = {\n name: string;\n register?: UseFormRegister<any>;\n label?: string;\n hint?: string;\n required?: string | boolean;\n placeholder?: string;\n multiline?: boolean;\n maxLength?: number;\n disabled?: boolean;\n};\n\nexport default function TextInput({\n label,\n register,\n name,\n hint,\n placeholder = \"\",\n required = false,\n multiline = false,\n maxLength,\n disabled = false,\n}: InputArgs) {\n register = useRegisterPropOrFromContext(register);\n\n return (\n <div className=\"control-group\">\n {label && <Label label={label} required={!!required} />}\n <div className=\"controls\">\n {multiline ? (\n <textarea\n {...register(name, { required })}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n />\n ) : (\n <input\n type=\"text\"\n {...register(name, { required })}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n />\n )}\n {hint && <Hint hint={hint} />}\n </div>\n </div>\n );\n}\n","import { FieldValues, useFormContext, UseFormRegister } from \"react-hook-form\";\nimport invariant from \"invariant\";\n\n/**\n * Returns given register arg if present, fetches register from FormContext otherwise\n * @param register\n */\nexport default function useRegisterPropOrFromContext<T extends FieldValues>(\n register: UseFormRegister<T> | undefined,\n): UseFormRegister<T> {\n const contextMethods = useFormContext<T>();\n if (!register && contextMethods) return contextMethods.register;\n invariant(\n register,\n \"register must be provided directly or through FormContext\",\n );\n\n return register;\n}\n","import { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\nconst useChannelSubscriptionToggle = ({\n onSuccessFunction,\n channelSlug,\n}: {\n onSuccessFunction: (subscribed: boolean) => void;\n channelSlug: string;\n}) => {\n const { mutate: subscribeChannel } = useMutation(\n () => fetchApi(`/channels/${channelSlug}/subscribe`, { method: \"POST\" }),\n\n {\n onSuccess: () => {\n onSuccessFunction(true);\n },\n onError: (error: any) =>\n toastr.error(error.message || I18n.t(\"js.generic_error\")),\n },\n );\n\n const { mutate: unsubscribeChannel } = useMutation(\n () => fetchApi(`/channels/${channelSlug}/unsubscribe`, { method: \"POST\" }),\n\n {\n onSuccess: () => {\n onSuccessFunction(false);\n },\n onError: (error: any) =>\n toastr.error(error.message || I18n.t(\"js.generic_error\")),\n },\n );\n\n return {\n subscribeChannel,\n unsubscribeChannel,\n };\n};\n\nexport default useChannelSubscriptionToggle;\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 { useMemo, useState } from \"react\";\nimport { includes, filter, uniq, map, findIndex, compact } from \"lodash\";\n\nimport useWindowEvent from \"./useWindowEvent\";\n\n// Hook to handle item batch selection (select multiple items with shift key pressed)\n//\n// @param [Array<String>] itemIds the given item ids\n// @param [Array<String>] selectedIds the selected item ids\n// @param [Function] selectIds function to select the ids (e.g. save in component state or whatever)\n//\n// @return [Function] onSelect returns the select function to pass to e.g. an item row or something (needs item id)\n//\n// @example\n// const onSelectFile = useItemBatchSelector(fileIds, selectedFileIds, selectFileIds);\n//\nconst useItemBatchSelection = (ids, selectedIds, selectIds) => {\n const [shiftIsPressed, setShiftIsPressed] = useState(false);\n const [metaIsPressed, setMetaPressed] = useState(false);\n const [firstIdSelected, setFirstIdSelected] = useState(null);\n\n // main select function\n //\n // @params [String] id\n //\n const { onSelect, onKeyDown, onKeyUp } = useMemo(() => {\n const onKeyDown = (e) => {\n switch (e.key) {\n case \"Shift\":\n setShiftIsPressed(true);\n break;\n case \"Meta\":\n setMetaPressed(true);\n break;\n default:\n break;\n }\n };\n\n const onKeyUp = (e) => {\n switch (e.key) {\n case \"Shift\":\n setShiftIsPressed(false);\n break;\n case \"Meta\":\n setMetaPressed(false);\n break;\n default:\n break;\n }\n };\n\n // adds item id to selected item ids\n const addItemId = (id) => {\n includes(selectedIds, id)\n ? selectIds(filter(selectedIds, (fileId) => fileId !== id))\n : selectIds([...selectedIds, id]);\n };\n\n const onSelect = (id, selectSingle = false) => {\n const itemIds = ids.current;\n // determine batch range if item is selected while shift key is pressed\n if (shiftIsPressed) {\n const firstIndex = findIndex(itemIds, (id) => id === firstIdSelected);\n const lastIndex = findIndex(itemIds, (itemId) => itemId === id);\n\n const newFileIds = map(itemIds, (itemId, i) =>\n (i >= firstIndex && i <= lastIndex) ||\n (i <= firstIndex && i >= lastIndex)\n ? itemId\n : null,\n );\n\n setFirstIdSelected(id);\n selectIds(uniq([...selectedIds, ...compact(newFileIds)]));\n } else {\n // select single item if only single item should be selected an meta key is not pressed\n // e.g. on row click instead of checkbox\n selectSingle && !metaIsPressed ? selectIds([id]) : addItemId(id);\n }\n\n setFirstIdSelected(id);\n };\n\n return { onSelect, onKeyDown, onKeyUp };\n }, [selectedIds.join(\",\"), shiftIsPressed, metaIsPressed, firstIdSelected]);\n\n useWindowEvent(\"keydown\", onKeyDown);\n useWindowEvent(\"keyup\", onKeyUp);\n\n return onSelect;\n};\n\nexport default useItemBatchSelection;\n","import { useEffect } from \"react\";\n\nconst useWindowEvent = (eventName, eventHandler) => {\n useEffect(() => {\n window.addEventListener(eventName, eventHandler);\n return () => window.removeEventListener(eventName, eventHandler);\n }, [eventName, eventHandler]);\n};\n\nexport default useWindowEvent;\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 { map, some, isFunction, reduce } from \"lodash\";\nimport { Modifier, EditorState, RichUtils } from \"draft-js\";\n\nimport Separator from \"components/shared/markdownEditor/editorPlugins/buttons/Separator\";\nimport createInlineStyleButton from \"components/shared/markdownEditor/editorPlugins/buttons/createInlineStyleButton\";\nimport createPickerButton from \"components/shared/markdownEditor/editorPlugins/buttons/createPickerButton\";\nimport CustomConfigurator from \"../../../../../CustomConfigurator\";\n\nexport const colorStyle = (style) => `COLOR-${style.toUpperCase()}`;\nexport const allColorStyles = () =>\n map(CustomConfigurator.get(\"markdownEditor.colors\"), ({ style }) =>\n colorStyle(style),\n );\n\nexport const clearColors = (editorState) => {\n const contentWithoutStyles = reduce(\n allColorStyles(),\n (newContentState, style) =>\n Modifier.removeInlineStyle(\n newContentState,\n editorState.getSelection(),\n style,\n ),\n editorState.getCurrentContent(),\n );\n\n return EditorState.push(\n editorState,\n contentWithoutStyles,\n \"change-inline-style\",\n );\n};\n\nexport const RemoveColorsButton = createInlineStyleButton({\n style: \"\",\n title: () => I18n.t(\"js.composer.editor.buttons.no_color\"),\n toggleStyle: ({ getEditorState, setEditorState }) => {\n setEditorState(clearColors(getEditorState()));\n },\n isActive: () => false,\n content: <i className=\"fa fa-ban\" />,\n});\n\nexport const createColorButton = ({ label, style }) =>\n createInlineStyleButton({\n style: colorStyle(style),\n title: () =>\n I18n.t(\"js.composer.editor.buttons.color\", {\n color: isFunction(label) ? label() : label,\n }),\n content: <i className=\"fa fa-font\" style={{ color: style }} />,\n toggleStyle: ({ getEditorState, setEditorState, style }) => {\n setEditorState(\n RichUtils.toggleInlineStyle(clearColors(getEditorState()), style),\n );\n },\n });\n\nexport const FontColorsButton = createPickerButton({\n pickerButtons: () =>\n [RemoveColorsButton, Separator].concat(\n map(CustomConfigurator.get(\"markdownEditor.colors\"), createColorButton),\n ),\n title: () => I18n.t(\"js.composer.editor.buttons.colors\"),\n content: <i className=\"fa fa-font\" />,\n isDisabled: ({ getEditorState }) =>\n getEditorState().getSelection().isCollapsed(),\n isActive: ({ getEditorState }) =>\n some(allColorStyles(), (s) =>\n getEditorState().getCurrentInlineStyle().has(s),\n ),\n});\nexport default FontColorsButton;\n","import React from \"react\";\n\nimport theme from \"components/shared/markdownEditor/editorPlugins/buttons/theme\";\n\nfunction Separator() {\n return <div className={theme.seperator} />;\n}\n\nexport default Separator;\n","import React from \"react\";\nimport classnames from \"classnames\";\nimport { isFunction } from \"lodash\";\n\nimport theme from \"components/shared/markdownEditor/editorPlugins/buttons/theme\";\n\nconst preventDefault = (e) => e.preventDefault();\ninterface ToolbarButtonProps {\n isActive(): boolean;\n isDisabled(): boolean;\n onClick(...args: unknown[]): unknown;\n title: (() => string) | string;\n children: React.ReactNode;\n}\nfunction ToolbarButton({\n isActive,\n onClick,\n title,\n children,\n isDisabled,\n}: ToolbarButtonProps) {\n return (\n <div className={theme.buttonWrapper} onMouseDown={preventDefault}>\n <button\n className={classnames(theme.button, {\n [theme.active]: isActive ? isActive() : false,\n })}\n disabled={isDisabled ? isDisabled() : false}\n onClick={onClick}\n type=\"button\"\n title={isFunction(title) ? title() : title}\n >\n {children}\n </button>\n </div>\n );\n}\n\nexport default ToolbarButton;\n","import { compose, withHandlers, withProps } from \"recompose\";\nimport { RichUtils } from \"draft-js\";\n\nimport ToolbarButton from \"components/shared/markdownEditor/editorPlugins/buttons/ToolbarButton\";\n\nexport default ({ style, content, title, toggleStyle, isActive }) => {\n return compose(\n withProps(() => ({\n title,\n style,\n children: content,\n })),\n withHandlers({\n onClick: (props) => (e) => {\n e.preventDefault();\n if (toggleStyle) {\n toggleStyle(props);\n } else {\n props.setEditorState(\n RichUtils.toggleInlineStyle(props.getEditorState(), style),\n );\n }\n },\n isDisabled: () => () => !document.getSelection().toString(),\n isActive: (props) => () => {\n if (!props.getEditorState) {\n return false;\n }\n\n if (isActive) {\n return isActive(props);\n } else {\n return props.getEditorState().getCurrentInlineStyle().has(style);\n }\n },\n }),\n )(ToolbarButton);\n};\n","import React from \"react\";\nimport { compose, withHandlers, withProps } from \"recompose\";\nimport { isFunction, map } from \"lodash\";\n\nimport ToolbarButton from \"components/shared/markdownEditor/editorPlugins/buttons/ToolbarButton\";\nimport Separator from \"components/shared/markdownEditor/editorPlugins/buttons/Separator\";\n\nfunction Picker(props) {\n const buttons = [\n <ToolbarButton key=\"back\" onClick={closePicker} title=\"Zurück\">\n <i className=\"fa fa-chevron-left\" />\n </ToolbarButton>,\n <Separator key=\"back-seperator\" />,\n ];\n\n return buttons.concat(\n map(\n isFunction(props.pickerButtons)\n ? props.pickerButtons()\n : props.pickerButtons,\n (Button, i) => <Button key={i} {...props} />,\n ),\n );\n\n function closePicker() {\n // Call `onOverrideContent` with `undefined`, to show regular content\n props.onOverrideContent(undefined);\n }\n}\n\nexport default ({ content, title, pickerButtons, isActive, isDisabled }) => {\n return compose(\n withProps(() => ({\n title,\n pickerButtons,\n children: content,\n })),\n withHandlers({\n isDisabled: (props) => () => (isDisabled ? isDisabled(props) : false),\n isActive: (props) => () => (isActive ? isActive(props) : false),\n onClick:\n ({ onOverrideContent }) =>\n () =>\n onOverrideContent((props) => (\n <div className=\"draftJsToolbar__toolbar__dNtBH\">\n <Picker pickerButtons={pickerButtons} {...props} />\n </div>\n )),\n }),\n )(ToolbarButton);\n};\n","const theme = {\n buttonWrapper: \"draftJsToolbar__buttonWrapper\",\n button: \"draftJsToolbar__button\",\n active: \"draftJsToolbar__buttonActive\",\n seperator: \"draftJsToolbar__separator\",\n};\n\nexport default theme;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { compose, withHandlers } from \"recompose\";\nimport { find, get } from \"lodash\";\n\nfunction CodeBlockLanguageSelect({\n options,\n selectedValue,\n createChangeLanguageHandler,\n}) {\n return (\n <div className=\"code-block-language-select\">\n {selectedValue ? (\n <small>\n {get(find(options, [\"value\", selectedValue]), \"label\") ||\n selectedValue}\n </small>\n ) : null}\n <span className=\"dropdown\">\n <a className=\"dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\">\n <i className=\"fa fa-ellipsis-h\" />\n </a>\n <ul className=\"context-menu dropdown-menu left\">\n {options.map(({ label, value }) => (\n <li\n key={value}\n className={\n value === selectedValue ||\n (value === \"plain\" && selectedValue === undefined)\n ? \"active\"\n : \"\"\n }\n >\n <a href=\"#\" onClick={createChangeLanguageHandler(value)}>\n {label}\n </a>\n </li>\n ))}\n </ul>\n </span>\n </div>\n );\n}\n\nCodeBlockLanguageSelect.propTypes = {\n options: PropTypes.array,\n selectedValue: PropTypes.string,\n createChangeLanguageHandler: PropTypes.func,\n};\n\nexport default compose(\n withHandlers({\n createChangeLanguageHandler:\n ({ onChange }) =>\n (newValue) =>\n (clickEvent) => {\n clickEvent.preventDefault();\n clickEvent.stopPropagation();\n\n newValue = newValue === \"plain\" ? undefined : newValue;\n // call onChange with a fake event, cause the onChange handle needs an dom event\n onChange({\n currentTarget: { value: newValue },\n });\n },\n }),\n)(CodeBlockLanguageSelect);\n","import React from \"react\";\nimport createMarkdownPlugin from \"draft-js-markdown-plugin\";\n\nimport CodeBlockLanguageSelect from \"components/shared/markdownEditor/CodeBlockLanguageSelect\";\n\nexport function renderLanguageSelect(props) {\n return <CodeBlockLanguageSelect {...props} />;\n}\n\nexport default function createCustomMarkdownPlugin() {\n return createMarkdownPlugin({\n renderLanguageSelect,\n languages: {\n plain: \"Text\",\n bash: \"Bash\",\n css: \"CSS\",\n html: \"HTML\",\n js: \"JavaScript\",\n markdown: \"Markdown\",\n ruby: \"Ruby\",\n sql: \"SQL\",\n },\n customInlineMatchers: {\n BOLD: [/\\*\\*(.+)\\*\\*(\\s)$/g],\n ITALIC: [/\\*(.+)\\*(\\s)$/g],\n UNDERLINE: [/_(.+)_(\\s)$/g],\n MARK: [/==(.+)==(\\s)$/g],\n CODE: [/`([^`]+)`(\\s)$/g],\n STRIKETHROUGH: [/~~([^~]+)~~(\\s)$/g],\n },\n features: {\n inline: [\"BOLD\", \"ITALIC\", \"UNDERLINE\", \"CODE\", \"STRIKETHROUGH\", \"MARK\"],\n block: [\n \"CODE\",\n \"header-one\",\n \"header-two\",\n \"header-three\",\n \"header-four\",\n \"header-five\",\n // 'header-six',\n \"ordered-list-item\",\n \"unordered-list-item\",\n \"blockquote\",\n ],\n },\n entityType: {\n IMAGE: \"IMAGE\",\n },\n });\n}\n","import { getDefaultKeyBinding, RichUtils } from \"draft-js\";\n\nexport default function createShortcutsPlugin() {\n return {\n handleKeyCommand: (\n command,\n _editorState,\n _,\n { getEditorState, setEditorState },\n ) => {\n const newEditorState = RichUtils.handleKeyCommand(\n getEditorState(),\n command,\n );\n\n if (newEditorState) {\n setEditorState(newEditorState);\n return \"handled\";\n }\n\n return \"not-handled\";\n },\n keyBindingFn: (e) => {\n return getDefaultKeyBinding(e);\n },\n };\n}\n","import React from \"react\";\n\nimport createInlineStyleButton from \"components/shared/markdownEditor/editorPlugins/buttons/createInlineStyleButton\";\n\nexport const BoldButton = createInlineStyleButton({\n style: \"BOLD\",\n title: () => I18n.t(\"js.composer.editor.buttons.bold\"),\n content: <i className=\"fa fa-bold\" />,\n});\n\nexport const ItalicButton = createInlineStyleButton({\n style: \"ITALIC\",\n title: () => I18n.t(\"js.composer.editor.buttons.italic\"),\n content: <i className=\"fa fa-italic\" />,\n});\n\nexport const UnderlineButton = createInlineStyleButton({\n style: \"UNDERLINE\",\n title: () => I18n.t(\"js.composer.editor.buttons.underline\"),\n content: <i className=\"fa fa-underline\" />,\n});\n\nexport const StrikeButton = createInlineStyleButton({\n style: \"STRIKETHROUGH\",\n title: () => I18n.t(\"js.composer.editor.buttons.strikethrough\"),\n content: <i className=\"fa fa-strikethrough\" />,\n});\n\nexport const MarkButton = createInlineStyleButton({\n style: \"MARK\",\n title: () => I18n.t(\"js.composer.editor.buttons.mark\"),\n content: <i className=\"fa fa-pencil-square\" />,\n});\n\nexport const CodeButton = createInlineStyleButton({\n style: \"CODE\",\n title: () => I18n.t(\"js.composer.editor.buttons.code\"),\n content: <i className=\"fa fa-code\" />,\n});\n","import { compose, withHandlers, withProps } from \"recompose\";\nimport { RichUtils } from \"draft-js\";\n\nimport ToolbarButton from \"components/shared/markdownEditor/editorPlugins/buttons/ToolbarButton\";\n\nexport default ({ blockType, content, title, toggleStyle, isActive }) => {\n return compose(\n withProps(() => ({\n title,\n children: content,\n })),\n withHandlers({\n onClick: (props) => (e) => {\n e.preventDefault();\n if (toggleStyle) {\n toggleStyle(props);\n } else {\n props.setEditorState(\n RichUtils.toggleBlockType(props.getEditorState(), blockType),\n );\n }\n },\n isActive: (props) => () => {\n if (!props.getEditorState) {\n return false;\n }\n\n if (isActive) {\n return isActive(props);\n } else {\n const editorState = props.getEditorState();\n const type = editorState\n .getCurrentContent()\n .getBlockForKey(editorState.getSelection().getStartKey())\n .getType();\n\n return type === blockType;\n }\n },\n }),\n )(ToolbarButton);\n};\n","import React from \"react\";\nimport createBlockStyleButton from \"components/shared/markdownEditor/editorPlugins/buttons/createBlockStyleButton\";\n\nexport const UnorderedListButton = createBlockStyleButton({\n blockType: \"unordered-list-item\",\n title: () => I18n.t(\"js.composer.editor.buttons.unordered_list\"),\n content: <i className=\"fa fa-list-ul\" />,\n});\n\nexport const OrderedListButton = createBlockStyleButton({\n blockType: \"ordered-list-item\",\n title: () => I18n.t(\"js.composer.editor.buttons.ordered_list\"),\n content: <i className=\"fa-regular fa-list-ol\" />,\n});\n\nexport const BlockquoteButton = createBlockStyleButton({\n blockType: \"blockquote\",\n title: () => I18n.t(\"js.composer.editor.buttons.blockquote\"),\n content: <i className=\"fa fa-quote-right\" />,\n});\n\nexport const CodeBlockButton = createBlockStyleButton({\n blockType: \"code-block\",\n title: () => I18n.t(\"js.composer.editor.buttons.code_block\"),\n content: <i className=\"fa-regular fa-file-code\" />,\n});\n","import React from \"react\";\nimport { map, padStart, includes, reduce, values } from \"lodash\";\n\nimport Separator from \"components/shared/markdownEditor/editorPlugins/buttons/Separator\";\nimport createBlockStyleButton from \"components/shared/markdownEditor/editorPlugins/buttons/createBlockStyleButton\";\nimport createPickerButton from \"components/shared/markdownEditor/editorPlugins/buttons/createPickerButton\";\n\nconst HEADLINES = [\n { type: \"header-one\", level: 1 },\n { type: \"header-two\", level: 2 },\n { type: \"header-three\", level: 3 },\n { type: \"header-four\", level: 4 },\n { type: \"header-five\", level: 5 },\n];\n\nexport const headlineButtons = reduce(\n HEADLINES,\n (result, { type, level }) => {\n result[`H${level}Button`] = createBlockStyleButton({\n blockType: type,\n title: () =>\n I18n.t(\"js.composer.editor.buttons.headline\", {\n level: level,\n markdown_shortcut: padStart(\"\", level, \"#\"),\n }),\n content: <span>H{level}</span>,\n });\n\n return result;\n },\n {},\n);\n\nexport const RemoveHeadlineButton = createBlockStyleButton({\n blockType: \"unstyled\",\n title: () => I18n.t(\"js.composer.editor.buttons.no_headline\"),\n isActive: () => false,\n content: <i className=\"fa fa-ban\" />,\n});\n\nexport const HeadlinesButton = createPickerButton({\n pickerButtons: [RemoveHeadlineButton, Separator].concat(\n values(headlineButtons),\n ),\n title: () => I18n.t(\"js.composer.editor.buttons.headlines\"),\n content: <i className=\"fa fa-header\" />,\n isActive: ({ getEditorState }) => {\n const editorState = getEditorState();\n const type = editorState\n .getCurrentContent()\n .getBlockForKey(editorState.getSelection().getStartKey())\n .getType();\n\n return includes(map(HEADLINES, \"type\"), type);\n },\n});\nexport default HeadlinesButton;\n","import React, { useEffect, useState } from \"react\";\nimport createToolbarPlugin from \"@draft-js-plugins/static-toolbar\";\nimport { map, isString } from \"lodash\";\n\nimport {\n BoldButton,\n ItalicButton,\n UnderlineButton,\n StrikeButton,\n MarkButton,\n CodeButton,\n} from \"components/shared/markdownEditor/editorPlugins/buttons/inlineStyleButtons\";\nimport {\n UnorderedListButton,\n OrderedListButton,\n BlockquoteButton,\n CodeBlockButton,\n} from \"components/shared/markdownEditor/editorPlugins/buttons/blockStyleButtons\";\nimport HeadlinesButton, {\n headlineButtons,\n} from \"components/shared/markdownEditor/editorPlugins/buttons/HeadlinesButton\";\nimport FontColorsButton from \"components/shared/markdownEditor/editorPlugins/buttons/FontColorsButton\";\nimport LinkButton from \"components/shared/markdownEditor/editorPlugins/buttons/LinkButton\";\nimport Separator from \"components/shared/markdownEditor/editorPlugins/buttons/Separator\";\nimport CustomConfigurator from \"../../../../CustomConfigurator\";\n\nconst AvailableButtons = Object.assign(\n {\n Separator,\n BoldButton,\n ItalicButton,\n UnderlineButton,\n StrikeButton,\n MarkButton,\n CodeButton,\n UnorderedListButton,\n OrderedListButton,\n BlockquoteButton,\n CodeBlockButton,\n LinkButton,\n FontColorsButton,\n HeadlinesButton,\n },\n headlineButtons,\n);\n\nexport default function createCustomToolbarPlugin() {\n const Plugin = createToolbarPlugin();\n function Toolbar() {\n const [key, setKey] = useState(Math.random());\n\n useEffect(() => {\n const composer = document.querySelector(\".activity-composer\");\n composer?.addEventListener(\"click\", click);\n return () => composer?.removeEventListener(\"click\", click);\n\n function click({ target }) {\n if (target === composer) {\n setKey(Math.random());\n }\n }\n }, []);\n\n return (\n <Plugin.Toolbar key={key}>\n {(externalProps) => (\n <div className=\"draftJsToolbar__toolbar__dNtBH\">\n {map(CustomConfigurator.get(\"markdownEditor.buttons\"), (B, i) => {\n const ButtonElem = AvailableButtons[B];\n return isString(B) ? (\n <ButtonElem key={i} {...externalProps} />\n ) : (\n <B key={i} {...externalProps} />\n );\n })}\n </div>\n )}\n </Plugin.Toolbar>\n );\n }\n return [Plugin, Toolbar];\n}\n","import React from \"react\";\nimport { EditorState, SelectionState, Modifier } from \"draft-js\";\nimport { isEmpty, trim } from \"lodash\";\nimport { getSelectionEntity, getEntityRange } from \"draftjs-utils\";\n\nimport ToolbarButton from \"components/shared/markdownEditor/editorPlugins/buttons/ToolbarButton\";\n\nexport const addLinkEntity = (editorState, url) => {\n // Create link entity\n const newContentState = editorState\n .getCurrentContent()\n .createEntity(\"LINK\", \"MUTABLE\", {\n href: url,\n url: url,\n title: url,\n });\n\n // Get key for newly created link entity\n const entityKey = newContentState.getLastCreatedEntityKey();\n\n // Apply entity and push new editor state\n return EditorState.push(\n editorState,\n Modifier.applyEntity(\n newContentState,\n editorState.getSelection(),\n entityKey,\n ),\n \"apply-entity\",\n );\n};\n\nexport const removeLinkEntity = (editorState, currentEntityKey) => {\n // Find entity range\n const entityRange = getEntityRange(editorState, currentEntityKey);\n const entitySelection = SelectionState.createEmpty(\n editorState.getSelection().getAnchorKey(),\n ).merge({\n anchorOffset: entityRange.start,\n focusOffset: entityRange.end,\n });\n\n // Remove entity from whole entity range and push new editor state\n return EditorState.push(\n editorState,\n Modifier.applyEntity(\n editorState.getCurrentContent(),\n entitySelection,\n null, // <- to remove entity\n ),\n \"apply-entity\",\n );\n};\n\nexport const updateLinkEntity = (editorState, currentEntityKey, url) => {\n // Replace data in the existing entity and push new editor state\n return EditorState.push(\n editorState,\n editorState.getCurrentContent().replaceEntityData(currentEntityKey, {\n href: url,\n url: url,\n title: url,\n }),\n \"apply-entity\",\n );\n};\n\ninterface LinkButtonTypes {\n getEditorState(): EditorState;\n setEditorState(val: EditorState): void;\n}\n\nexport default function LinkButton(props: LinkButtonTypes) {\n return (\n <ToolbarButton\n {...props}\n title={I18n.t(\"js.composer.editor.buttons.link\")}\n isActive={isActive}\n isDisabled={isDisabled}\n onClick={onClick}\n >\n <i className=\"fa fa-link\" />\n </ToolbarButton>\n );\n\n function isActive() {\n const editorState = props.getEditorState();\n const currentContent = editorState.getCurrentContent();\n\n const currentEntityKey = getSelectionEntity(editorState);\n\n if (currentEntityKey) {\n const currentEntity = currentContent.getEntity(currentEntityKey);\n return currentEntity.getType() === \"LINK\";\n }\n\n return false;\n }\n\n function isDisabled() {\n const editorState = props.getEditorState();\n\n // never disable if an entity exits at selection\n if (getSelectionEntity(editorState)) {\n return false;\n }\n\n return editorState.getSelection().isCollapsed();\n }\n\n function onClick() {\n const editorState = props.getEditorState();\n const currentContent = editorState.getCurrentContent();\n\n let url: string | null = \"\";\n // Check if current entity exists and is already a link\n // Get the link as default value for prompt, to edit the link\n const currentEntityKey = getSelectionEntity(editorState);\n type currentEntity = ReturnType<typeof currentContent.getEntity>;\n let currentEntity: null | currentEntity = null;\n if (currentEntityKey) {\n currentEntity = currentContent.getEntity(currentEntityKey);\n }\n\n function formatUrl(url: string | undefined): string | null {\n if (!url) return null;\n if (!url.includes(\".\")) return url; // for anchors\n if (/https?:\\/\\//.exec(url as string)) return url;\n\n return `https://${url}`;\n }\n\n function changeEditorState(url: string | null) {\n // Return if url is null or\n // url for entity hasn't changed\n if (\n url === null ||\n // Same problem as in L128\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (currentEntityKey && (currentEntity as any).data.url === url)\n ) {\n return;\n }\n\n let newEditorState = editorState;\n\n if (currentEntityKey) {\n // Entity already exists, update or delete it\n if (isEmpty(trim(url))) {\n // Remove link entity, url is empty\n newEditorState = removeLinkEntity(editorState, currentEntityKey);\n } else {\n // Otherwise, update entity with new url\n newEditorState = updateLinkEntity(editorState, currentEntityKey, url);\n }\n } else {\n // No entity exists, create it\n newEditorState = addLinkEntity(editorState, url);\n }\n\n // Set new EditorState with forced selection to the original user selection\n props.setEditorState(\n EditorState.forceSelection(newEditorState, editorState.getSelection()),\n );\n }\n\n if (\n currentEntityKey &&\n (currentEntity as currentEntity).getType() === \"LINK\"\n ) {\n // Maybe added by a plugin?\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n url = (currentEntity as any).data.url;\n }\n\n // Ask for url\n window.bridge?.prompt(\n I18n.t(\"js.composer.editor.buttons.link_prompt\"),\n url as string, // default (to edit)\n (url?: string) => changeEditorState(formatUrl(url) || \"\"),\n );\n }\n}\n","import React from \"react\";\nimport createUndoPlugin from \"@draft-js-plugins/undo\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faArrowRotateLeft,\n faArrowRotateRight,\n} from \"@fortawesome/pro-solid-svg-icons\";\n\nexport default function customUndoPlugin() {\n return createUndoPlugin({\n undoContent: <FontAwesomeIcon icon={faArrowRotateLeft} />,\n redoContent: <FontAwesomeIcon icon={faArrowRotateRight} />,\n theme: {\n undo: \"btn btn-sm btn-light\",\n redo: \"btn btn-sm btn-light\",\n },\n });\n}\n","import { map } from \"lodash\";\nimport CustomConfigurator from \"../../../CustomConfigurator\";\n\nif (!CustomConfigurator.existsDefault(\"markdownEditor\")) {\n // Set default colors\n CustomConfigurator.setDefault(\n \"markdownEditor.colors\",\n map(\n [\n \"red\",\n \"green\",\n \"blue\",\n \"orange\",\n \"goldenrod\",\n \"indigo\",\n \"purple\",\n \"violet\",\n \"hotpink\",\n \"olive\",\n \"mediumseagreen\",\n \"limegreen\",\n \"dimgrey\",\n ],\n (color) => ({\n label: () => I18n.t(`js.composer.editor.colors.${color}`),\n style: color,\n }),\n ),\n );\n\n // Set default buttons\n CustomConfigurator.setDefault(\"markdownEditor.buttons\", [\n \"BoldButton\",\n \"ItalicButton\",\n \"UnderlineButton\",\n \"StrikeButton\",\n \"Separator\",\n \"FontColorsButton\",\n \"MarkButton\",\n \"CodeButton\",\n \"Separator\",\n \"HeadlinesButton\",\n \"UnorderedListButton\",\n \"OrderedListButton\",\n \"BlockquoteButton\",\n \"Separator\",\n \"LinkButton\",\n ]);\n}\n","import React from \"react\";\n\nimport createInlineMentionPlugin from \"components/activitystreams/composer/inlineMentionPlugin\";\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 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 { faFaceSmile } from \"@fortawesome/pro-regular-svg-icons\";\n\ninterface HOCTypes {\n enableTixxtMentions?: boolean;\n}\n\nconst withBasicMarkdownPlugins = (BaseComponent) => {\n class HOC extends React.Component<HOCTypes> {\n plugins: Array<unknown>;\n pluginComponents: Record<PropertyKey, unknown>;\n\n constructor(props: HOCTypes) {\n super(props);\n\n const [toolbarPlugin, Toolbar] = createToolbarPlugin();\n const markdownPlugin = createMarkdownPlugin();\n const undoPlugin = createUndoPlugin();\n const linkifyPlugin = createLinkifyPlugin();\n const blockBreakoutPlugin = createBlockBreakoutPlugin();\n const shortcutsPlugin = createShortcutsPlugin();\n const emojiPlugin = createEmojiPlugin({\n useNativeArt: true,\n selectButtonContent: <FontAwesomeIcon icon={faFaceSmile} />,\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 toolbarPlugin,\n markdownPlugin,\n undoPlugin,\n linkifyPlugin,\n blockBreakoutPlugin,\n shortcutsPlugin,\n emojiPlugin,\n ];\n\n this.pluginComponents = {\n Toolbar,\n UndoButton: undoPlugin.UndoButton,\n RedoButton: undoPlugin.RedoButton,\n EmojiSuggestions: emojiPlugin.EmojiSuggestions,\n EmojiSelect: emojiPlugin.EmojiSelect,\n };\n\n if (props.enableTixxtMentions) {\n const mentionPlugin = createInlineMentionPlugin();\n\n this.plugins = [mentionPlugin.inlineMentionPlugin, ...this.plugins];\n this.pluginComponents = {\n ...this.pluginComponents,\n InlineMentionSuggestions: mentionPlugin.InlineMentionSuggestions,\n };\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 return HOC;\n};\n\nexport default withBasicMarkdownPlugins;\n","import PropTypes from \"prop-types\";\nimport React, { useEffect } from \"react\";\nimport { compose, withState, withHandlers } from \"recompose\";\nimport Editor from \"@draft-js-plugins/editor\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport classnames from \"classnames\";\n\nimport \"@draft-js-plugins/mention/lib/plugin.css\";\nimport \"@draft-js-plugins/emoji/lib/plugin.css\";\nimport \"draft-js/dist/Draft.css\";\n\nimport \"./configure\"; // this configures the defaults\nimport markdownByEditorState from \"components/shared/markdownEditor/utils/markdownByEditorState\";\nimport editorStateByMarkdown from \"components/shared/markdownEditor/utils/editorStateByMarkdown\";\nimport createStyleMap from \"components/shared/markdownEditor/styleMap\";\nimport withBasicMarkdownPlugins from \"components/shared/markdownEditor/withBasicMarkdownPlugins\";\n\nimport \"./MarkdownEditor.css\";\n\nfunction MarkdownEditor({\n key,\n onEditorStateChange,\n containerClasses,\n editorState,\n onSetEditorRef,\n plugins,\n pluginComponents,\n placeholder,\n focusEditor,\n readOnly,\n onFocus,\n onBlur,\n shouldFocus,\n}) {\n useEffect(() => {\n if (shouldFocus) focusEditor();\n }, [shouldFocus]);\n\n return (\n <div\n className={classnames(\n \"Composer object-content-input form-control px-2 py-1\",\n containerClasses,\n { readOnly: readOnly },\n )}\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={createStyleMap()}\n spellCheck\n stripPastedStyles\n readOnly={readOnly}\n onFocus={onFocus}\n onBlur={onBlur}\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 clearfix flex flex-cols justify-end items-center 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 </ul>\n </div>\n <div style={{ textAlign: \"center\" }}>\n {pluginComponents.InlineMentionSuggestions ? (\n <pluginComponents.InlineMentionSuggestions key=\"mentionSuggestions\" />\n ) : null}\n <pluginComponents.EmojiSuggestions key=\"emojiSuggestions\" />\n </div>\n </div>\n );\n}\n\nMarkdownEditor.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 focusEditor: PropTypes.func,\n readOnly: PropTypes.bool,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n};\n\nexport default compose(\n withBasicMarkdownPlugins,\n withState(\"key\", \"setKey\", () => uuidv4()),\n withState(\"editorState\", \"setEditorState\", ({ content }) =>\n editorStateByMarkdown(content),\n ),\n withState(\"editorRef\", \"setEditorRef\", null),\n withHandlers({\n onEditorStateChange:\n ({ content, onChange, setEditorState }) =>\n (newEditorState) => {\n // Don't trigger change events to the outside if there is no content change\n const newContent = markdownByEditorState(newEditorState);\n if (content !== newContent) {\n setTimeout(() => onChange(newContent), 1);\n }\n setEditorState(newEditorState);\n },\n onSetEditorRef:\n ({ setEditorRef, setComposerRefCallback }) =>\n (ref) => {\n if (setComposerRefCallback) {\n setComposerRefCallback(ref);\n }\n setEditorRef(ref);\n },\n focusEditor:\n ({ editorRef }) =>\n (e) => {\n e?.preventDefault();\n if (editorRef) {\n setTimeout(() => editorRef.focus(), 1);\n }\n },\n }),\n)(MarkdownEditor);\n","import { reduce } from \"lodash\";\n\nimport { colorStyle } from \"components/shared/markdownEditor/editorPlugins/buttons/FontColorsButton\";\nimport CustomConfigurator from \"../../../CustomConfigurator\";\n\nconst calculateColorMap = () =>\n reduce(\n CustomConfigurator.get(\"markdownEditor.colors\"),\n (result, { style }) => {\n const styleEntity = colorStyle(style);\n result[styleEntity] = { color: style };\n return result;\n },\n {},\n );\n\nconst createStyleMap = () =>\n Object.assign(\n {\n CODE: {\n fontFamily: 'Monaco, Menlo, Consolas, \"Courier New\", monospac',\n fontSize: \"11px\",\n whiteSpace: \"pre-wrap\",\n wordWrap: \"break-word\",\n padding: \"2px 4px\",\n borderRadius: \"3px\",\n color: \"#d14\",\n backgroundColor: \"#f7f7f9\",\n border: \"1px solid #e1e1e8\",\n },\n SUPERSCRIPT: { fontSize: \"0.6em\", verticalAlign: \"super\" },\n MARK: { backgroundColor: \"yellow\" },\n },\n calculateColorMap(),\n );\n\nexport default createStyleMap;\n","// Copy from https://github.com/jonschlinkert/remarkable/blob/master/lib/rules_inline/text.js\n// to enable custom terminator chars like '#' for tixxt style hashtags\n\n// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n//\n// Rule to skip pure text\n// '{}$%@~+=:#' reserved for extentions\n\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0a /* \\n */:\n case 0x5c /* \\ */:\n case 0x60 /* ` */:\n case 0x2a /* * */:\n case 0x5f /* _ */:\n case 0x5e /* ^ */:\n case 0x5b /* [ */:\n case 0x5d /* ] */:\n case 0x21 /* ! */:\n case 0x26 /* & */:\n case 0x3c /* < */:\n case 0x3e /* > */:\n case 0x7b /* { */:\n case 0x7d /* } */:\n case 0x24 /* $ */:\n case 0x25 /* % */:\n case 0x40 /* @ */:\n case 0x7e /* ~ */:\n case 0x2b /* + */:\n case 0x3d /* = */:\n case 0x3a /* : */:\n case 0x23 /* # */:\n return true;\n default:\n return false;\n }\n}\n\nconst customText = (state, silent) => {\n let pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) {\n return false;\n }\n\n if (!silent) {\n state.pending += state.src.slice(state.pos, pos);\n }\n\n state.pos = pos;\n\n return true;\n};\n\nconst customizedTextParser = (md) => {\n md.inline.ruler.at(\"text\", customText);\n};\n\nexport default customizedTextParser;\n","export const isAlphaNum = (code) =>\n (code >= 0x30 /* 0 */ && code <= 0x39) /* 9 */ ||\n (code >= 0x41 /* A */ && code <= 0x5a) /* Z */ ||\n (code >= 0x61 /* a */ && code <= 0x7a); /* z */\n","// Customized parser for emphasis (bold / italic)\n// **this is bold**\n// *this is italic*\n\nimport { isAlphaNum } from \"components/shared/markdownEditor/parserPlugins/helpers\";\n\n// parse sequence of emphasis markers,\n// \"start\" should point at a valid marker\nconst scanDelimiters = (state, start) => {\n let pos = start;\n let lastChar, nextChar, count;\n let canOpen = true;\n let canClose = true;\n\n const max = state.posMax;\n const marker = state.src.charCodeAt(start);\n\n lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1;\n\n while (pos < max && state.src.charCodeAt(pos) === marker) {\n pos++;\n }\n if (pos >= max) {\n canOpen = false;\n }\n count = pos - start;\n\n if (count >= 4) {\n // sequence of four or more unescaped markers can't start/end an emphasis\n canOpen = canClose = false;\n } else {\n nextChar = pos < max ? state.src.charCodeAt(pos) : -1;\n\n // check whitespace conditions\n if (nextChar === 0x20 || nextChar === 0x0a) {\n canOpen = false;\n }\n if (lastChar === 0x20 || lastChar === 0x0a) {\n canClose = false;\n }\n\n if (marker === 0x2a /* * */) {\n // check if we aren't inside the word\n if (isAlphaNum(lastChar)) {\n canOpen = false;\n }\n if (isAlphaNum(nextChar)) {\n canClose = false;\n }\n }\n }\n\n return {\n canOpen: canOpen,\n canClose: canClose,\n delimiters: count,\n };\n};\n\nconst emphasis = (state, silent) => {\n let startCount, count, found, oldCount, newCount, stack, res;\n const max = state.posMax;\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (marker !== 0x2a /* * */) {\n return false;\n }\n if (silent) {\n return false;\n } // don't run any pairs in validation mode\n\n res = scanDelimiters(state, start);\n startCount = res.delimiters;\n if (!res.canOpen) {\n state.pos += startCount;\n if (!silent) {\n state.pending += state.src.slice(start, state.pos);\n }\n return true;\n }\n\n if (state.level >= state.options.maxNesting) {\n return false;\n }\n\n state.pos = start + startCount;\n stack = [startCount];\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === marker) {\n res = scanDelimiters(state, state.pos);\n count = res.delimiters;\n if (res.canClose) {\n oldCount = stack.pop();\n newCount = count;\n\n while (oldCount !== newCount) {\n if (newCount < oldCount) {\n stack.push(oldCount - newCount);\n break;\n }\n\n // assert(newCount > oldCount)\n newCount -= oldCount;\n\n if (stack.length === 0) {\n break;\n }\n state.pos += oldCount;\n oldCount = stack.pop();\n }\n\n if (stack.length === 0) {\n startCount = oldCount;\n found = true;\n break;\n }\n state.pos += count;\n continue;\n }\n\n if (res.canOpen) {\n stack.push(count);\n }\n state.pos += count;\n continue;\n }\n\n state.parser.skipToken(state);\n }\n\n if (!found) {\n // parser failed to find ending tag, so it's not valid emphasis\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + startCount;\n\n if (!silent) {\n if (startCount === 2 || startCount === 3) {\n state.push({ type: \"strong_open\", level: state.level++ });\n }\n if (startCount === 1 || startCount === 3) {\n state.push({ type: \"em_open\", level: state.level++ });\n }\n\n state.parser.tokenize(state);\n\n if (startCount === 1 || startCount === 3) {\n state.push({ type: \"em_close\", level: --state.level });\n }\n if (startCount === 2 || startCount === 3) {\n state.push({ type: \"strong_close\", level: --state.level });\n }\n }\n\n state.pos = state.posMax + startCount;\n state.posMax = max;\n return true;\n};\n\nconst customizedEmphasisParser = (md) => {\n md.inline.ruler.at(\"emphasis\", emphasis);\n};\n\nexport default customizedEmphasisParser;\n","export const mentionRule = (state, silent) => {\n let mentionStart, mentionEnd, mentionSeparator;\n let oldPos = state.pos;\n let start = state.pos;\n let max = state.posMax;\n\n const mentionMarker = state.src.charCodeAt(start);\n\n if (mentionMarker !== 0x40 /* @ */ && mentionMarker !== 0x23 /* # */) {\n return false;\n }\n if (state.src.charCodeAt(start + 1) !== 0x5b /* [ */) {\n return false;\n }\n if (state.level >= state.options.maxNesting) {\n return false;\n }\n\n state.pos = start + 1;\n while (state.pos < max) {\n const marker = state.src.charCodeAt(state.pos);\n if (marker === 0x5b /* [ */) {\n mentionStart = state.pos + 1;\n } else if (marker === 0x3a /* : */) {\n mentionSeparator = state.pos;\n } else if (marker === 0x5d /* ] */) {\n mentionEnd = state.pos;\n break;\n }\n\n state.parser.skipToken(state);\n }\n\n state.pos = oldPos;\n\n // parser failed to find ']', so it's not a valid mention\n if (mentionEnd < 0) {\n return false;\n }\n\n // We found the end of the mention, and know for a fact it's a valid mention;\n // so all that's left to do is to call tokenizer.\n if (!silent) {\n state.pos = mentionStart;\n state.posMax = mentionEnd;\n\n const id = state.src.substr(mentionStart, mentionSeparator - mentionStart);\n const name = state.src.substr(\n mentionSeparator + 1,\n mentionEnd - mentionSeparator - 1,\n );\n\n state.pos = mentionSeparator + 1;\n state.posMax = mentionEnd;\n\n state.push({\n type: \"mention_open\",\n level: state.level++,\n marker: String.fromCharCode(mentionMarker),\n id,\n name,\n });\n state.parser.tokenize(state);\n state.push({\n type: \"mention_close\",\n level: state.level--,\n });\n }\n\n state.pos = mentionEnd + 1;\n state.posMax = max;\n\n return true;\n};\n\nconst markdownMentionsParser = (md) => {\n md.inline.ruler.push(\"mention\", mentionRule);\n};\n\nexport default markdownMentionsParser;\n","// Customized parser for underline\n// _this is underline_\n// Marker: 0x5f (_)\n\nimport { isAlphaNum } from \"components/shared/markdownEditor/parserPlugins/helpers\";\n\nconst underline = (state, silent) => {\n let found, stack, lastChar, nextChar;\n const max = state.posMax;\n const start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x5f /* _ */) {\n return false;\n }\n\n if (silent) {\n return false;\n }\n\n if (start + 2 >= max) {\n return false;\n }\n\n if (state.level >= state.options.maxNesting) {\n return false;\n }\n\n lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1;\n nextChar = state.src.charCodeAt(start + 1);\n\n if (isAlphaNum(lastChar)) {\n return false;\n }\n if (nextChar === 0x20 || nextChar === 0x0a) {\n return false;\n }\n\n state.pos = start + 1;\n stack = 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x5f /*_*/) {\n lastChar = state.src.charCodeAt(state.pos - 1);\n nextChar = state.pos + 1 < max ? state.src.charCodeAt(state.pos + 1) : -1;\n\n if (\n !isAlphaNum(nextChar) &&\n nextChar !== 0x5f &&\n lastChar !== 0x5f /*_*/\n ) {\n if (lastChar !== 0x20 /* SPACE */ && lastChar !== 0x0a /* \\n */) {\n // closing '_'\n stack--;\n } else if (\n nextChar !== 0x20 /* SPACE */ &&\n nextChar !== 0x0a /* \\n */\n ) {\n // opening '_'\n stack++;\n }\n if (stack <= 0) {\n found = true;\n break;\n } else {\n continue;\n }\n }\n }\n\n state.parser.skipToken(state);\n }\n\n if (!found) {\n // parser failed to find ending tag, so it's not valid underline\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n if (!silent) {\n state.push({ type: \"underline_open\", level: state.level++ });\n state.parser.tokenize(state);\n state.push({ type: \"underline_close\", level: --state.level });\n }\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n\n return true;\n};\n\nconst underlineParser = (md) => {\n md.inline.ruler.push(\"underline\", underline);\n};\n\nexport default underlineParser;\n","import { trim, reduce } from \"lodash\";\n// Parser for custom text colors\n// <span style=\"color:red;\">Text</span>\n\n// 0 => whole token\n// 1 => span open tag\n// 2 => style\n// 3 => text\n// 4 => span close tag\nconst regexp = /^(<span (?:.*?)style=\"(.*?)\"(?:.*?)>)(.*?)(<\\/span>)/i;\n\nconst cssStyle = (state, silent) => {\n const start = state.pos;\n const posMax = state.posMax;\n\n const match = regexp.exec(state.src.slice(start));\n\n if (!match) return false;\n if (silent) return false;\n\n const styles = reduce(\n match[2].split(\";\"),\n (styles, style) => {\n const styleTuple = style.split(\":\");\n styles[trim(styleTuple[0])] = trim(styleTuple[1]);\n return styles;\n },\n {},\n );\n\n if (!styles.color) return false;\n\n // adjust state position to match text\n state.pos = start + match[1].length;\n state.posMax = state.pos + match[3].length;\n\n if (styles.color) {\n state.push({ type: `color_${styles.color}_open`, level: state.level++ });\n }\n\n state.parser.tokenize(state);\n\n if (styles.color) {\n state.push({ type: `color_${styles.color}_close`, level: --state.level });\n }\n\n // adjust state position after token\n state.pos = start + match[0].length;\n state.posMax = posMax;\n\n return true;\n};\n\nconst cssStyleParser = (md) => {\n md.inline.ruler.push(\"cssStyle\", cssStyle);\n};\n\nexport default cssStyleParser;\n","import { markdownToDraft } from \"markdown-draft-js\";\nimport { EditorState, convertFromRaw } from \"draft-js\";\nimport { reduce } from \"lodash\";\n\nimport customizedTextParser from \"components/shared/markdownEditor/parserPlugins/customizedTextParser\";\nimport customizedEmphasisParser from \"components/shared/markdownEditor/parserPlugins/customizedEmphasisParser\";\nimport markdownMentionsParser from \"components/shared/markdownEditor/parserPlugins/markdownMentionsParser\";\nimport underlineParser from \"components/shared/markdownEditor/parserPlugins/underlineParser\";\nimport cssStyleParser from \"components/shared/markdownEditor/parserPlugins/cssStyleParser\";\n\nimport { colorStyle } from \"components/shared/markdownEditor/editorPlugins/buttons/FontColorsButton\";\nimport CustomConfigurator from \"../../../../CustomConfigurator\";\n\nconst calculateColorStyles = () =>\n reduce(\n CustomConfigurator.get(\"markdownEditor.colors\"),\n (result, { style }) => {\n result[`color_${style}_open`] = colorStyle(style);\n return result;\n },\n {},\n );\n\nconst enableAllStyleRules = (md) => {\n md.inline.ruler.enable([\"mark\"]);\n md.block.ruler.disable([\"hr\", \"table\"]);\n};\n\nconst editorStateByMarkdown = (content) => {\n const newRawState = markdownToDraft(content, {\n preserveNewlines: true,\n remarkablePlugins: [\n enableAllStyleRules,\n customizedTextParser,\n customizedEmphasisParser,\n markdownMentionsParser,\n underlineParser,\n cssStyleParser,\n ],\n remarkableOptions: {\n html: false,\n },\n blockEntities: {\n mention_open: (item) => ({\n type: item.marker === \"#\" ? \"#mention\" : \"mention\",\n mutability: \"IMMUTABLE\",\n data: {\n mention: {\n id: item.id,\n name: item.name,\n },\n },\n }),\n image: (item) => ({\n type: \"IMAGE\",\n mutability: \"IMMUTABLE\",\n data: {\n alt: item.alt,\n src: item.src,\n },\n }),\n },\n blockStyles: Object.assign(\n {\n mark_open: \"MARK\",\n del_open: \"STRIKETHROUGH\",\n underline_open: \"UNDERLINE\",\n },\n calculateColorStyles(),\n ),\n });\n\n return EditorState.createWithContent(convertFromRaw(newRawState));\n};\n\nexport default editorStateByMarkdown;\n","import { draftToMarkdown } from \"markdown-draft-js\";\nimport { convertToRaw } from \"draft-js\";\nimport { reduce } from \"lodash\";\n\nimport { colorStyle } from \"components/shared/markdownEditor/editorPlugins/buttons/FontColorsButton\";\nimport CustomConfigurator from \"../../../../CustomConfigurator\";\n\nconst calculateColorStyles = () =>\n reduce(\n CustomConfigurator.get(\"markdownEditor.colors\"),\n (result, { style }) => {\n result[colorStyle(style)] = {\n open: () => `<span style=\"color:${style};\">`,\n close: () => \"</span>\",\n };\n return result;\n },\n {},\n );\n\nconst markdownByEditorState = (editorState) => {\n const currentContent = editorState.getCurrentContent();\n const rawContent = convertToRaw(currentContent);\n return draftToMarkdown(rawContent, {\n preserveNewlines: true,\n entityItems: {\n mention: {\n open: (entity) => `@[${entity.data.mention.id}:`,\n close: () => \"]\",\n },\n \"#mention\": {\n open: (entity) => `#[${entity.data.mention.id}:`,\n close: () => \"]\",\n },\n IMAGE: {\n open: (entity) => ``,\n close: () => \"\",\n },\n },\n styleItems: Object.assign(\n {\n BOLD: {\n open: () => \"**\",\n close: () => \"**\",\n },\n ITALIC: {\n open: () => \"*\",\n close: () => \"*\",\n },\n UNDERLINE: {\n open: () => \"_\",\n close: () => \"_\",\n },\n STRIKETHROUGH: {\n open: () => \"~~\",\n close: () => \"~~\",\n },\n CODE: {\n open: () => \"`\",\n close: () => \"`\",\n },\n MARK: {\n open: () => \"==\",\n close: () => \"==\",\n },\n },\n calculateColorStyles(),\n ),\n });\n};\n\nexport default markdownByEditorState;\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 { useMutation, useQuery } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { stringify } from \"query-string\";\nimport { isNull, omitBy } from \"lodash\";\n\ntype PropertySetParams = {\n name: \"file_profile\" | \"folder_profile\" | string;\n contextType: \"network\" | \"group\" | string;\n contextId?: string;\n inherit?: boolean;\n};\n\nexport const propertySetUrl = ({\n name,\n contextType,\n contextId,\n inherit,\n}: PropertySetParams) =>\n `/api/v1/property_sets/${name}?${stringify(\n omitBy(\n {\n context_type: contextType,\n context_id: contextId,\n inherit,\n },\n isNull,\n ),\n )}`;\n\ntype PropertySetPayload = {\n type: \"modified\" | \"basic\";\n properties: { type: \"string\"; name: \"string\"; label: \"string\" }[];\n};\n\nexport function usePropertySet(params: PropertySetParams, options?) {\n options = options || {};\n\n // Disable requests for file_ or folder_profile property_sets if they are disabled via network config\n if (\n (options.enabled === undefined && params.name === \"file_profile\") ||\n params.name == \"folder_profile\"\n ) {\n const profileConfig = Preload.current_network.config[`${params.name}s`];\n if (!profileConfig?.enabled) options.enabled = false;\n }\n\n return useQuery<PropertySetPayload>(propertySetUrl(params), {\n staleTime: Infinity,\n retry: false, // disable retry to enable fast rendering of folder listing in case something is misconfigured\n ...options,\n });\n}\n\nfunction persistPropertySet({\n body,\n ...params\n}: PropertySetParams & { body: any }) {\n return fetchApi(propertySetUrl(params), {\n method: \"PUT\",\n body,\n });\n}\n\nexport function usePersistPropertySet(options?) {\n return useMutation(persistPropertySet, options);\n}\n","import React from \"react\";\nimport classnames from \"classnames\";\n\ninterface FormActionsProps {\n pristine?: boolean;\n processing?: boolean;\n submitting: boolean;\n\n reset?(...args: unknown[]): unknown;\n\n submitText?: string;\n submitIcon?: string;\n\n onCancel?(...args: unknown[]): unknown;\n\n className?: string;\n}\n\nfunction FormActions({\n processing,\n pristine,\n submitting,\n reset,\n submitText,\n submitIcon,\n onCancel,\n className,\n}: FormActionsProps) {\n return (\n <div className={classnames(\"tixxt__form--actions\", className)}>\n <a\n href=\"#\"\n className=\"btn btn-light\"\n onClick={\n onCancel\n ? (e) => {\n e.preventDefault();\n onCancel(reset);\n }\n : (e) => {\n e.preventDefault();\n reset?.();\n history.back();\n }\n }\n >\n {I18n.t(\"js.cancel\")}\n </a>\n <button\n className=\"btn btn-primary\"\n type=\"submit\"\n disabled={pristine || submitting || processing}\n >\n {submitIcon !== \"no-icon\" && (\n <>\n <i\n key=\"icon\"\n className={submitIcon ? submitIcon : \"fa-regular fa-floppy-disk\"}\n />{\" \"}\n </>\n )}\n\n {submitText ? submitText : I18n.t(\"js.save\")}\n </button>\n </div>\n );\n}\n\nexport default FormActions;\n","import type { SubmitHandler } from \"redux-form\";\nimport React from \"react\";\nimport { reduxForm } from \"redux-form\";\nimport classNames from \"classnames\";\nimport FormActions from \"./FormActions\";\n\nexport interface FormTypes {\n children?: React.ReactNode;\n handleSubmit?: SubmitHandler<\n Record<PropertyKey, unknown>,\n Record<PropertyKey, unknown>,\n string\n >;\n pristine?: boolean;\n submitting?: boolean;\n\n reset?(): void;\n\n initialValues?: Record<PropertyKey, unknown>;\n\n onSubmit(values: any, dispatch: any): unknown | Promise<void>;\n\n onSubmitSuccess?(...args: unknown[]): unknown;\n\n onSubmitFail?(error: Error): unknown;\n\n enableReinitialize?: boolean;\n\n renderChildren?(...props: unknown[]): React.ReactNode;\n\n className?: string;\n processing?: boolean;\n classNameFormActions?: string;\n submitText?: string;\n submitIcon?: string;\n allowSaveWithoutChange?: boolean;\n\n onCancel?(...args: unknown[]): unknown;\n\n fullWidth?: boolean;\n noActions?: boolean;\n form?: string;\n}\n\nfunction Form({\n children,\n handleSubmit,\n pristine,\n submitting = false,\n reset,\n renderChildren,\n className,\n processing = false,\n classNameFormActions,\n submitText,\n submitIcon,\n allowSaveWithoutChange,\n onCancel,\n noActions = false,\n ...otherProps\n}: FormTypes) {\n return (\n <form\n onSubmit={handleSubmit}\n className={classNames(\"form-horizontal\", className)}\n >\n {renderChildren ? renderChildren(otherProps) : children}\n {noActions ? null : (\n <FormActions\n processing={processing}\n className={classNameFormActions}\n pristine={pristine && !allowSaveWithoutChange}\n submitting={submitting}\n reset={reset}\n submitText={submitText}\n submitIcon={submitIcon}\n onCancel={onCancel}\n />\n )}\n </form>\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n//@ts-ignore\nconst ReduxForm = reduxForm({})(Form);\n\nexport default ReduxForm as unknown as (props: FormTypes) => React.ReactElement;\n","// extracted by mini-css-extract-plugin\nexport default {\"Sorter\":\"gc7nD18MOo0nNWIiASbp\",\"SorterDisabled\":\"G3SH6NsDOumH4MWgumV5\"};","import React from \"react\";\nimport styles from \"./tables.module.css\";\n\nimport classNames from \"classnames\";\n\ninterface SorterProps {\n attribute: string;\n label: string;\n handleSort?(...args: unknown[]): unknown;\n // sortBy is expected to be a tuple of [attribute, direction]\n // @example Sort by name ascending\n // ['name', 1]\n sortBy: [string, number];\n disabled?: boolean;\n}\n\nfunction Sorter({\n attribute,\n label,\n sortBy,\n handleSort,\n disabled,\n}: SorterProps) {\n // Sort is disabled in file search results\n if (!handleSort || disabled)\n return (\n <span className={classNames(\"text-sm\", styles.SorterDisabled)}>\n {label}\n </span>\n );\n\n const active = sortBy && sortBy[0] === attribute;\n const reverse = sortBy && sortBy[1] === -1;\n const handleClick = (e) => {\n e.preventDefault();\n handleSort([attribute, active ? (reverse ? 1 : -1) : 1]);\n };\n\n return (\n <span className={classNames(\"text-sm\", styles.Sorter)}>\n <a href={`#sort-by-${attribute}`} onClick={handleClick}>\n {label}\n </a>\n <i\n className={classNames(\"fa-solid fa-sort-down\", {\n hidden: !active || !reverse,\n })}\n />\n <i\n className={classNames(\"fa-solid fa-sort-up\", {\n hidden: !active || reverse,\n })}\n />\n <i\n className={classNames(\"text-muted fa-solid fa-sort\", {\n hidden: active,\n })}\n />\n </span>\n );\n}\n\nexport default Sorter;\n","import { DragDropContext } from \"react-dnd\";\nimport HTML5Backend from \"react-dnd-html5-backend\";\n\nexport default DragDropContext(HTML5Backend);\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { Datepicker as OriginalDatepicker } from \"vanillajs-datepicker\";\n\nexport function getDefaultOptions() {\n OriginalDatepicker.locales[I18n.currentLocale()] = I18n.t(\n \"js.plugins.datepicker\",\n );\n\n return {\n weekStart: 1,\n buttonClass: \"btn btn-light\",\n format: I18n.t(\"js.plugins.Locale.Formats.datepicker_date\"),\n clearBtn: true,\n autohide: true,\n calendarWeeks: true,\n language: I18n.currentLocale(),\n };\n}\n\n// Auto apply our default options\nexport default function Datepicker(elem, options: object = {}): void {\n return new OriginalDatepicker(elem, { ...getDefaultOptions(), ...options });\n}\n","//= require ./version\nimport { memoize } from \"lodash\";\n\nwindow.CKEDITOR_BASEPATH = \"/static/ckeditor/\";\n\n// Loads CKEditor, but only once\nconst loadAndConfigureCKEditor = memoize(\n () =>\n new Promise((resolve) => {\n const script = document.createElement(\"script\");\n script.src = \"/static/ckeditor/ckeditor.js\";\n script.async = true;\n script.onload = () => {\n configure();\n resolve(window.CKEDITOR);\n };\n document.body.appendChild(script);\n }),\n);\n\nexport default loadAndConfigureCKEditor;\n\nfunction configure() {\n if (!window.CKEDITOR) return;\n\n // Define changes to default configuration here.\n // For complete reference see:\n // http://docs.ckeditor.com/#!/api/CKEDITOR.config\n CKEDITOR.disableAutoInline = true;\n const config = CKEDITOR.config;\n\n // don't load config file via ajax\n config.customConfig = \"\";\n config.language = I18n.locale.split(\"_\")[0];\n\n // Codesnippet config\n config.codeSnippet_theme = \"default\"; // doesn't work here, cause the plugin changes the default again\n config.codeSnippet_languages = {\n bash: \"Bash\",\n coffeescript: \"CoffeeScript\",\n cpp: \"C++\",\n cs: \"C#\",\n css: \"CSS\",\n html: \"HTML\",\n java: \"Java\",\n javascript: \"JavaScript\",\n json: \"JSON\",\n markdown: \"Markdown\",\n objectivec: \"Objective-C\",\n perl: \"Perl\",\n php: \"PHP\",\n python: \"Python\",\n ruby: \"Ruby\",\n sql: \"SQL\",\n vbscript: \"VBScript\",\n xml: \"XML\",\n };\n\n // The toolbar groups arrangement, optimized for two toolbar rows.\n config.toolbarGroups = [\n {\n name: \"clipboard\",\n groups: [\"clipboard\", \"undo\"],\n },\n {\n name: \"editing\",\n groups: [\"find\", \"selection\"],\n },\n {\n name: \"links\",\n },\n {\n name: \"insert\",\n },\n {\n name: \"forms\",\n },\n {\n name: \"tools\",\n },\n {\n name: \"document\",\n groups: [\"mode\", \"document\", \"doctools\"],\n },\n {\n name: \"others\",\n },\n \"/\",\n {\n name: \"basicstyles\",\n groups: [\"basicstyles\"],\n },\n {\n name: \"paragraph\",\n groups: [\"list\", \"indent\", \"align\", \"blocks\"],\n },\n {\n name: \"styles\",\n },\n {\n name: \"colors\",\n },\n {\n name: \"about\",\n },\n ];\n\n // No links with onclick please\n // Other Elements(+Attributes) can be added too\n // http://docs.ckeditor.com/#!/guide/dev_acf\n config.disallowedContent = \"a[onclick]\";\n config.allowedContent = true;\n\n // Remove some buttons provided by the standard plugins, which are\n // not needed in the Standard(s) toolbar.\n config.removeButtons = \"Subscript,Superscript\";\n\n // Set the most common block elements.\n config.format_tags = \"p;h1;h2;h3;pre\";\n\n // Simplify the dialog windows.\n config.removeDialogTabs = \"image:advanced;link:advanced\";\n config.extraPlugins =\n \"autogrow,colorbutton,colordialog,font,justify,find,codesnippet,iframe\";\n config.removePlugins = \"about,scayt,specialchar,stylescombo,wsc\";\n config.filebrowserImageBrowseUrl = \"/system/ckeditor/images\";\n config.filebrowserImageUploadUrl = \"/api/storage/assets/ckeditor/images\";\n\n // Add custom css to style content\n config.contentsCss = [\n CKEDITOR.getUrl(\"contents.css\"),\n window.Assets[\"ckeditor_override.css\"],\n ];\n\n // Modify Link Dialog to only allow null and _blank as targets\n // hook into dialogDefinition Event\n // http://ckeditor.com/latest/samples/plugins/dialog/dialog.html\n CKEDITOR.on(\"dialogDefinition\", function (ev) {\n var dialogDefinition, editor, targetTab, targetTypeSelect;\n // if this is the link dialog\n if (ev.data.name === \"link\") {\n dialogDefinition = ev.data.definition;\n editor = ev.editor;\n // override target select options\n targetTab = dialogDefinition.getContents(\"target\");\n targetTypeSelect = targetTab.get(\"linkTargetType\");\n return (targetTypeSelect.items = [\n [editor.lang.common.notSet, \"notSet\"],\n [editor.lang.common.targetNew, \"_blank\"],\n ]);\n }\n });\n}\n","// wraps a function thats used as event handler to always call\n// preventDefault on event object, i.e. for <a href=\"#\" onClick={...}> stuff\nconst preventDefault = (handler) => (e) => {\n e.preventDefault();\n return handler();\n};\n\nexport default preventDefault;\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 { map, partition, fromPairs, isEmpty } from \"lodash\";\n\nimport { publishFiles, destroyFile } from \"actions/files\";\n\n// Publishes all files or images with state 'volatile' which exist in values.\n// Used before saving items to apps api,before sending message with attachments,\n// etc.\n//\n// @example\n// const result = await publishAllVolatile({\n// dispatch,\n// values: { profile_image: [{ id: 123, state: \"volatile\", ... }] },\n// storageDirectory: 'images',\n// });\n//\n// console.log(result)\n// //=> { profile_image: [{ id: 123, state: \"published\", token: 456, ... }] }\nconst publishAllVolatile = async ({ dispatch, values, storageDirectory }) => {\n const pairs = await Promise.all(\n map(values, async (files, fieldName) => {\n const [volatile, nonVolatile] = partition(files, { state: \"volatile\" });\n const [remove, others] = partition(nonVolatile, { state: \"removed\" });\n\n if (isEmpty(volatile) && isEmpty(remove)) return [fieldName, files];\n\n const { payload: published } = await dispatch(\n publishFiles({\n body: { [storageDirectory]: volatile },\n storageDirectory,\n }),\n );\n\n await Promise.all(\n map(\n remove,\n async (file) =>\n await dispatch(\n destroyFile({\n id: file.id,\n storageDirectory,\n }),\n ),\n ),\n );\n\n return [fieldName, [...others, ...published]];\n }),\n );\n return fromPairs(pairs);\n};\n\nexport default publishAllVolatile;\n","import { map, partition, fromPairs, isEmpty } from \"lodash\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\n\n// Custom Hook that Publishes all files or images with state 'volatile' which exist in values.\n// Used before saving items to apps api,before sending message with attachments,\n// etc.\n//\n// @example\n// const publishAllVolatile = usePublishAllVolatile();\n// const result = await publishAllVolatile({\n// values: { profile_image: [{ id: 123, state: \"volatile\", ... }] },\n// storageDirectory: 'images',\n// });\n//\n// console.log(result)\n// //=> { profile_image: [{ id: 123, state: \"published\", token: 456, ... }] }\ntype PublishFilesArgs = {\n body: { [key: string]: any };\n fieldName: string;\n others: File[];\n storageDirectory: string;\n};\nconst usePublishAllVolatile = () => {\n const publishFiles = useMutation<\n { [key: string]: File[] }[],\n unknown,\n PublishFilesArgs\n >(({ body, storageDirectory }: PublishFilesArgs) => {\n return fetchApi(`/api/storage/${storageDirectory}/publish`, {\n method: \"POST\",\n body,\n });\n });\n\n const destroyFiles = useMutation(\n ({\n id,\n storageDirectory,\n }: {\n id: string;\n fieldName: string;\n storageDirectory: string;\n }) => {\n return fetchApi(`/api/storage/${storageDirectory}/${id}`, {\n method: \"DELETE\",\n });\n },\n );\n\n const publishAllVolatile = async ({ values, storageDirectory }) => {\n const pairs = await Promise.all(\n map(values, async (files, fieldName) => {\n const [volatile, nonVolatile] = partition(files, { state: \"volatile\" });\n const [remove, others] = partition(nonVolatile, { state: \"removed\" });\n\n if (isEmpty(volatile) && isEmpty(remove)) return [fieldName, files];\n\n const published = await publishFiles.mutateAsync({\n body: { [storageDirectory]: volatile },\n storageDirectory,\n fieldName,\n others,\n });\n\n await Promise.all(\n map(remove, async (file) => {\n await destroyFiles.mutateAsync({\n id: file.id,\n storageDirectory,\n fieldName,\n });\n }),\n );\n\n const removed = map(remove, (file) => ({ ...file, _destroy: true }));\n\n return [fieldName, [...others, ...published, ...removed]];\n }),\n );\n return fromPairs(pairs);\n };\n\n return publishAllVolatile;\n};\n\nexport default usePublishAllVolatile;\n","import { forEach } from \"lodash\";\n\nexport function onValidationError(errors) {\n resetValidationErrors();\n forEach(errors, (error) => {\n error?.ref?.classList.add(\"field-error\");\n\n toastr.error(error?.message || I18n.t(\"generic_error\"));\n });\n}\n\nexport function resetValidationErrors() {\n forEach(document.getElementsByClassName(\"field-error\"), (element) => {\n element?.classList.remove(\"field-error\");\n });\n}\n","import { enGB, de, es, fr } from \"date-fns/locale\";\nimport { format, formatDistanceToNow, setDefaultOptions } from \"date-fns\";\nimport documentReady from \"helpers/documentReady\";\nimport { includes, split } from \"lodash\";\n\nconst LOCALE_LOOKUP = {\n de_DU: de,\n de: de,\n en: enGB,\n es: es,\n fr: fr,\n};\n\ndocumentReady(() => {\n let currentLocale = I18n.currentLocale();\n if (includes(currentLocale, \"_\") && currentLocale !== \"de_DU\")\n currentLocale = split(currentLocale, \"_\")[0];\n\n setDefaultOptions({ locale: LOCALE_LOOKUP[currentLocale] });\n});\n\nexport default function formatDate(\n date: Date | number,\n dateFormat: string,\n options = {},\n) {\n return format(date, dateFormat, {\n ...options,\n });\n}\n\nexport function formatDateFromNow(date: Date | number, options = {}) {\n return formatDistanceToNow(date, {\n ...options,\n });\n}\n","import { SubmissionError } from \"redux-form\";\nimport { compact, reduce } from \"lodash\";\n\n// formats the given api error and throws redux-form SubmissionError\n//\n// @prop responseErrors [Array<Object>] the given api errors\n// @prop options [Object] (optional) e.g. key_prefix to prefix a key\n// @throws [SubmissionError]\n//\n// @example\n// handleItemApiError([\n// {\n// property_name: \"first_name\",\n// t: [\"apps.value.cant_be_empty\", { property: \"Vorname\" }],\n// },\n// ]);\n// => {first_name: 'Dieses Feld muss ausgefüllt werden.'}\n//\nconst handleItemApiError = (responseErrors, options = {}) => {\n const { key_prefix } = options;\n\n const submitErrors = reduce(\n responseErrors,\n (errors, error) => {\n const key = compact([key_prefix, error[\"property_name\"]]).join(\".\");\n errors[key] = I18n.t.apply(I18n, error[\"t\"]);\n return errors;\n },\n {},\n );\n\n throw new SubmissionError(submitErrors);\n};\n\nexport default handleItemApiError;\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\";\nimport { isString } from \"lodash\";\n\nconst queryCache = new QueryCache();\nconst queryClient = new QueryClient({\n queryCache,\n defaultOptions: {\n queries: {\n queryFn: async ({ queryKey }) =>\n isString(queryKey[0]) && 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 { includes, isEmpty, isPlainObject } from \"lodash\";\n\nexport const csrfTokenHeader = () => {\n const meta = document.querySelector('meta[name=\"csrf-token\"]');\n return { \"X-CSRF-Token\": meta ? meta.getAttribute(\"content\") : null };\n};\n\nexport const buildHeaders = ({ method, body, headers }) => {\n let h = { Accept: \"application/json\", \"Cache-Control\": \"no-store\" };\n\n if (includes([\"POST\", \"PUT\", \"DELETE\", \"PATCH\"], method)) {\n h = { ...h, ...csrfTokenHeader() };\n }\n\n if (!isEmpty(body)) {\n h[\"Content-Type\"] = \"application/json\";\n }\n\n if (isPlainObject(headers)) {\n return h;\n } else {\n return { ...h, ...headers };\n }\n};\n\nexport const okJson = async (response: {\n status: number;\n ok: boolean;\n json: () => any;\n}) => {\n if (response.status === 204) return null;\n\n if (response.ok) {\n return response.json();\n } else {\n throw new Error(I18n.t(\"js.generic_error\"));\n }\n};\n\nexport async function fetchApi(\n url: string,\n options:\n | {\n method?: string;\n body?: any;\n headers?: object;\n parsePaginationHeaders?: boolean;\n signal?: AbortSignal;\n }\n | undefined = {},\n) {\n const { method = \"GET\", body, headers = {} } = options;\n\n const response = await fetch(url, {\n method,\n headers: buildHeaders({ method, body, headers }),\n credentials: \"include\",\n body: body ? JSON.stringify(body) : null,\n signal: options.signal,\n });\n\n const payload = await okJson(response);\n if (options.parsePaginationHeaders) {\n return {\n payload,\n pagination: {\n totalPages: Number(response.headers.get(\"X-Total-Pages\")),\n },\n };\n } else {\n return payload;\n }\n}\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\";\nimport { frontendByLocation } from \"components/layout/TixxtContent\";\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// set search param für current url\nexport function setSearchParam(key: string, value: string) {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.search);\n\n if (value) {\n params.set(key, value);\n } else {\n params.delete(key);\n }\n\n const newUrlString =\n params.size > 0 ? `${url.pathname}?${params}` : url.pathname;\n\n window.history.replaceState({}, \"\", newUrlString);\n}\n\n// removes all search params from current url\nexport function removeSearchParams() {\n const url = new URL(window.location.href);\n url.search = \"\";\n\n window.history.replaceState({}, document.title, url.toString());\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 // Turbo.visit if navigating from spa to turbo\n const toPathname = to instanceof URL ? to.pathname : to.toString();\n if (\n frontendByLocation(location.pathname) === \"spa\" &&\n frontendByLocation(toPathname) === \"turbo\"\n ) {\n window.Turbo?.visit(toPathname, {});\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\nexport function Redirect({\n to,\n ...options\n}: { to: Parameters<typeof navigate>[0] } & Parameters<typeof navigate>[1]) {\n useEffect(() => {\n navigate(to, options);\n }, []);\n\n return null;\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 } 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 { 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 { 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 { useEffect, useRef } from \"react\";\nimport Tooltip from \"bootstrap/js/dist/tooltip\";\n\nexport default function useTooltip<T extends HTMLElement>(title?: string) {\n const elemRef = useRef<T>(null);\n\n useEffect(() => {\n if (elemRef.current) {\n Tooltip.getOrCreateInstance(elemRef.current);\n }\n\n return function () {\n if (elemRef.current) Tooltip.getInstance(elemRef.current)?.dispose();\n };\n }, [elemRef.current]);\n\n useEffect(() => {\n if (elemRef.current && title) {\n const tooltipInstance = Tooltip.getInstance(elemRef.current);\n if (tooltipInstance) {\n tooltipInstance.setContent({\n \".tooltip-inner\": title,\n });\n }\n }\n }, [title]);\n\n return elemRef;\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, { 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, { 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 React from \"react\";\nimport { networkMembershipRoles } from \"components/shared/PermissionPicker\";\nimport { FormProvider, useForm, useWatch } from \"react-hook-form\";\nimport DirectoryPickerInput from \"components/shared/form/fields/DirectoryPickerInput\";\nimport Checkbox from \"components/shared/form/fields/Checkbox\";\nimport FormActions from \"components/shared/form/fields/FormActions\";\nimport { useMutation } from \"react-query\";\nimport { fetchApi } from \"helpers/reactQueryApi\";\nimport { forEach, map } from \"lodash\";\nimport { useNavigate } from \"helpers/tixxt-router\";\n\ntype AssignChannelSubscriptionsArgs = {\n members: { id: string; type: string }[] | null;\n channels: string[];\n subscribe_all_network_members: boolean;\n};\n\ntype FormData = {\n members: { id: string; type: string }[];\n channels: { slug: string }[];\n subscribe_all_network_members: boolean;\n};\n\nexport default function AssignChannelSubscriptionsForm() {\n const navigate = useNavigate();\n const methods = useForm<FormData>();\n const { handleSubmit } = methods;\n\n const { mutate: assignChannelSubscriptions, isLoading } = useMutation<\n unknown,\n unknown,\n AssignChannelSubscriptionsArgs\n >(\n (body: AssignChannelSubscriptionsArgs) =>\n fetchApi(\n \"/administration/channel_settings/assign_channel_subscriptions\",\n { method: \"POST\", body },\n ),\n {\n onSuccess: () => {\n toastr.success(\n I18n.t(\n \"js.administration.channel_settings.assign_channel_subscriptions.assign_success\",\n ),\n );\n },\n onError: () => {\n toastr.error(I18n.t(\"js.administration.widgetbars.load_error\"));\n },\n },\n );\n\n const subscribeAllNetworkMembers = useWatch({\n control: methods.control,\n name: \"subscribe_all_network_members\",\n });\n\n function submit({\n channels,\n members,\n subscribe_all_network_members,\n }: FormData) {\n const channelSlugs: string[] = map(channels, \"slug\");\n const memberData = subscribe_all_network_members\n ? null\n : map(members, (member) => ({\n id: member.id,\n type: member.type,\n }));\n assignChannelSubscriptions({\n members: memberData,\n channels: channelSlugs,\n subscribe_all_network_members,\n });\n }\n\n function onValidationError(errors) {\n forEach(document.getElementsByClassName(\"field-error\"), (element) => {\n element?.classList.remove(\"field-error\");\n });\n\n forEach(errors, (error) => {\n toastr.error(error?.message || I18n.t(\"generic_error\"));\n });\n }\n\n return (\n <FormProvider {...methods}>\n <form\n className=\"form-horizontal mb-6\"\n onSubmit={handleSubmit(submit, onValidationError)}\n >\n <DirectoryPickerInput\n label={I18n.t(\n \"js.administration.channel_settings.assign_channel_subscriptions.members.label\",\n )}\n name=\"members\"\n multi\n extraOptions={networkMembershipRoles}\n disabled={subscribeAllNetworkMembers}\n >\n <Checkbox\n name=\"subscribe_all_network_members\"\n label={I18n.t(\n \"js.administration.channel_settings.assign_channel_subscriptions.all_network_members.label\",\n )}\n className=\"mt-2\"\n />\n </DirectoryPickerInput>\n <DirectoryPickerInput\n label={I18n.t(\n \"js.administration.channel_settings.assign_channel_subscriptions.channels.label\",\n )}\n name=\"channels\"\n endpoint=\"/directory/channels\"\n query={{ only_public: true }}\n disabled={false}\n showDefaultOptions={false}\n required\n multi\n />\n <FormActions\n saveDisabled={isLoading}\n onCancel={(e) => {\n e.preventDefault();\n navigate(\"/administration\");\n }}\n />\n </form>\n </FormProvider>\n );\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport { createRoot } from \"react-dom/client\";\nimport React from \"react\";\nimport { networkMembershipRoles } from \"../components/shared/PermissionPicker\";\nimport { Wrapper as QueryClientProvider } from \"../helpers/queryClient\";\nimport DirectoryPicker from \"../components/shared/DirectoryPicker\";\nimport AssignChannelSubscriptionsForm from \"../components/administration/channels/AssignChannelSubscriptionsForm\";\n\n// Connects to data-controller=\"assign_channel_subscriptions_form\"\n// Intended be used on a div container\nexport default class extends Controller {\n connect() {\n this.originalType = this.element.type;\n this.element.type = \"hidden\";\n\n const container = document.createElement(\"div\");\n this.element.insertAdjacentElement(\"afterend\", container);\n this.root = createRoot(container);\n this.root.render(\n <QueryClientProvider>\n <AssignChannelSubscriptionsForm />\n </QueryClientProvider>,\n );\n }\n\n handleChange = (newValue) => {\n this.element.value = JSON.stringify(newValue);\n\n this.root.render(\n <QueryClientProvider>\n <DirectoryPicker\n value={newValue}\n onChange={this.handleChange}\n multi\n extraOptions={networkMembershipRoles}\n disabled={\n this.hasMembersFieldTarget && this.membersFieldTarget.disabled\n }\n />\n </QueryClientProvider>,\n );\n };\n\n disconnect() {\n if (this.root) {\n this.root.unmount();\n this.element.type = this.originalType;\n }\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\";\nimport { createRoot } from \"react-dom/client\";\nimport React from \"react\";\nimport PermissionPicker from \"../components/shared/PermissionPicker\";\nimport { Wrapper as QueryClientProvider } from \"../helpers/queryClient\";\n\n// Connects to data-controller=\"permission-picker\"\n// Intended be used on a text input containing JSON\nexport default class extends Controller {\n connect() {\n this.originalType = this.element.type;\n this.element.type = \"hidden\";\n\n const container = document.createElement(\"div\");\n this.element.insertAdjacentElement(\"afterend\", container);\n this.root = createRoot(container);\n const initialValue = JSON.parse(this.element.value || \"[]\");\n this.handleChange(initialValue);\n }\n\n handleChange = (newValue) => {\n this.element.value = JSON.stringify(newValue);\n\n this.root.render(\n <QueryClientProvider>\n <PermissionPicker value={newValue} onChange={this.handleChange} />\n </QueryClientProvider>,\n );\n };\n\n disconnect() {\n if (this.root) {\n this.root.unmount();\n this.element.type = this.originalType;\n }\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 { Controller } from \"@hotwired/stimulus\";\nimport { debounce } from \"lodash\";\n\n// Connects to data-controller=\"shared--password-toggle\"\nexport default class extends Controller {\n connect() {\n this.toggleVisibility = this.toggleVisibility.bind(this);\n this.addToggleIcons();\n }\n\n addToggleIcons() {\n const passwordFields = this.element.querySelectorAll(\n 'input[type=\"password\"]',\n );\n passwordFields.forEach((passwordField) => {\n const icon = this.#createVisibilityIcon(\"fa-eye\");\n passwordField.insertAdjacentElement(\"afterend\", icon);\n });\n }\n\n toggleVisibility = debounce(function (event) {\n let icon = null;\n\n if (event.target.nodeName === \"svg\") {\n icon = event.target.parentElement;\n } else {\n icon = event.target.parentElement.parentElement;\n }\n\n const passwordField = icon.previousElementSibling;\n\n if (passwordField && passwordField.type === \"password\") {\n passwordField.type = \"text\";\n const newIcon = this.#createVisibilityIcon(\"fa-eye-slash\");\n icon.parentElement.replaceChild(newIcon, icon);\n } else if (passwordField) {\n passwordField.type = \"password\";\n const newIcon = this.#createVisibilityIcon(\"fa-eye\");\n icon.parentElement.replaceChild(newIcon, icon);\n }\n }, 1);\n\n #createVisibilityIcon(style) {\n const icon = document.createElement(\"i\");\n icon.classList.add(\n \"fa-regular\",\n style,\n \"absolute\",\n \"right-2\",\n \"top-2\",\n \"cursor-pointer\",\n );\n icon.dataset.action = \"click->shared--password-toggle#toggleVisibility\";\n return icon;\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","// Änderungen an app/javascript/controllers/shared/toggle_controller.js\nimport { 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\n// or on a button to toggle visibility of target elements\n// @see app/views/administration/invites/sent.html.haml\nexport default class extends Controller {\n static targets = [\"toggleable\"];\n\n connect() {\n this.target = this.element.dataset.toggleTarget;\n\n if (\n !(\n this.element.nodeName === \"BUTTON\" ||\n this.element.classList.contains(\"toggle-filter\")\n )\n ) {\n this.toggle();\n }\n }\n\n toggle(event) {\n if (\n event &&\n (this.element.nodeName === \"BUTTON\" ||\n this.element.classList.contains(\"toggle-filter\"))\n ) {\n event.preventDefault();\n }\n\n let show;\n if (this.element.nodeName === \"INPUT\") {\n show = this.element.checked;\n } else if (\n this.element.nodeName === \"BUTTON\" ||\n this.element.classList.contains(\"toggle-filter\")\n ) {\n const targetElements = document.querySelectorAll(this.target);\n show =\n targetElements.length > 0\n ? targetElements[0].classList.contains(\"hidden\")\n : false;\n\n this.element.classList.toggle(\"active\", show);\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 AssignChannelSubscriptionsFormController from \"./assign_channel_subscriptions_form_controller\";\napplication.register(\n \"assign-channel-subscriptions-form\",\n AssignChannelSubscriptionsFormController,\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 PermissionPickerController from \"./permission_picker_controller\";\napplication.register(\"permission-picker\", PermissionPickerController);\n\nimport Shared__GoBackButtonController from \"./shared/go_back_button_controller\";\napplication.register(\"shared--go-back-button\", Shared__GoBackButtonController);\n\nimport Shared__PasswordToggleController from \"./shared/password_toggle_controller\";\napplication.register(\n \"shared--password-toggle\",\n Shared__PasswordToggleController,\n);\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 * Use something like class=\"fa-solid fa-star\" in a view/template/component and rerun the script\n */\n\nimport { library, dom, config } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n faAdjust as faSolidAdjust,\n faAlignJustify as faSolidAlignJustify,\n faAngleDoubleDown as faSolidAngleDoubleDown,\n faAngleDoubleLeft as faSolidAngleDoubleLeft,\n faAngleDoubleRight as faSolidAngleDoubleRight,\n faAngleDoubleUp as faSolidAngleDoubleUp,\n faAngleLeft as faSolidAngleLeft,\n faAngleRight as faSolidAngleRight,\n faArchive as faSolidArchive,\n faArrowCircleUp as faSolidArrowCircleUp,\n faArrowDown as faSolidArrowDown,\n faArrowLeft as faSolidArrowLeft,\n faArrowRight as faSolidArrowRight,\n faArrows as faSolidArrows,\n faArrowsAlt as faSolidArrowsAlt,\n faAt as faSolidAt,\n faBan as faSolidBan,\n faBarChart as faSolidBarChart,\n faBars as faSolidBars,\n faBold as faSolidBold,\n faBook as faSolidBook,\n faBug as faSolidBug,\n faBullhorn as faSolidBullhorn,\n faCalendar as faSolidCalendar,\n faCaretDown as faSolidCaretDown,\n faCaretLeft as faSolidCaretLeft,\n faCaretRight as faSolidCaretRight,\n faCertificate as faSolidCertificate,\n faCheck as faSolidCheck,\n faCheckSquare as faSolidCheckSquare,\n faChevronCircleDown as faSolidChevronCircleDown,\n faChevronDown as faSolidChevronDown,\n faChevronLeft as faSolidChevronLeft,\n faChevronRight as faSolidChevronRight,\n faChevronUp as faSolidChevronUp,\n faCircle as faSolidCircle,\n faCircleInfo as faSolidCircleInfo,\n faCircleQuestion as faSolidCircleQuestion,\n faClone as faSolidClone,\n faCloudDownload as faSolidCloudDownload,\n faCode as faSolidCode,\n faCodeFork as faSolidCodeFork,\n faCoffee as faSolidCoffee,\n faCog as faSolidCog,\n faCogs as faSolidCogs,\n faColumns as faSolidColumns,\n faComment as faSolidComment,\n faCompress as faSolidCompress,\n faEllipsis as faSolidEllipsis,\n faEllipsisH as faSolidEllipsisH,\n faEnvelope as faSolidEnvelope,\n faExclamation as faSolidExclamation,\n faExpand as faSolidExpand,\n faExternalLink as faSolidExternalLink,\n faEye as faSolidEye,\n faEyeSlash as faSolidEyeSlash,\n faFile as faSolidFile,\n faFileCsv as faSolidFileCsv,\n faFileExcel as faSolidFileExcel,\n faFilter as faSolidFilter,\n faFlag as faSolidFlag,\n faFlagCheckered as faSolidFlagCheckered,\n faFolder as faSolidFolder,\n faFolderOpen as faSolidFolderOpen,\n faFont as faSolidFont,\n faGears as faSolidGears,\n faGlobe as faSolidGlobe,\n faGripDots as faSolidGripDots,\n faHashtag as faSolidHashtag,\n faHeader as faSolidHeader,\n faHome as faSolidHome,\n faImage as faSolidImage,\n faInfoCircle as faSolidInfoCircle,\n faItalic as faSolidItalic,\n faLink as faSolidLink,\n faLinkSlash as faSolidLinkSlash,\n faList as faSolidList,\n faListAlt as faSolidListAlt,\n faListOl as faSolidListOl,\n faListUl as faSolidListUl,\n faLock as faSolidLock,\n faMailbox as faSolidMailbox,\n faMapMarker as faSolidMapMarker,\n faMessageXmark as faSolidMessageXmark,\n faPaperPlane as faSolidPaperPlane,\n faPaperclip as faSolidPaperclip,\n faPencil as faSolidPencil,\n faPencilSquare as faSolidPencilSquare,\n faPipe as faSolidPipe,\n faPlay as faSolidPlay,\n faPlus as faSolidPlus,\n faPlusCircle as faSolidPlusCircle,\n faPrint as faSolidPrint,\n faQuestion as faSolidQuestion,\n faQuestionCircle as faSolidQuestionCircle,\n faQuoteLeft as faSolidQuoteLeft,\n faQuoteRight as faSolidQuoteRight,\n faRefresh as faSolidRefresh,\n faReply as faSolidReply,\n faReplyAll as faSolidReplyAll,\n faSave as faSolidSave,\n faSearch as faSolidSearch,\n faShare as faSolidShare,\n faShield as faSolidShield,\n faSort as faSolidSort,\n faSortAsc as faSolidSortAsc,\n faSortDesc as faSolidSortDesc,\n faSortDown as faSolidSortDown,\n faSortNumericAsc as faSolidSortNumericAsc,\n faSortUp as faSolidSortUp,\n faSpaceShuttle as faSolidSpaceShuttle,\n faSpinner as faSolidSpinner,\n faSquare as faSolidSquare,\n faSquareO as faSolidSquareO,\n faStar as faSolidStar,\n faStepBackward as faSolidStepBackward,\n faStepForward as faSolidStepForward,\n faStrikethrough as faSolidStrikethrough,\n faTag as faSolidTag,\n faTags as faSolidTags,\n faThumbsUp as faSolidThumbsUp,\n faThumbtack as faSolidThumbtack,\n faTimes as faSolidTimes,\n faTimesCircle as faSolidTimesCircle,\n faToggleOff as faSolidToggleOff,\n faToggleOn as faSolidToggleOn,\n faTrash as faSolidTrash,\n faUnderline as faSolidUnderline,\n faUnlock as faSolidUnlock,\n faUnlockAlt as faSolidUnlockAlt,\n faUser as faSolidUser,\n faUserCircle as faSolidUserCircle,\n faUserMinus as faSolidUserMinus,\n faUserPlus as faSolidUserPlus,\n faUserSecret as faSolidUserSecret,\n faUserTimes as faSolidUserTimes,\n faUserXmark as faSolidUserXmark,\n faUsers as faSolidUsers,\n faVolumeXmark as faSolidVolumeXmark,\n faXmark as faSolidXmark,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport {\n faDailymotion as faBrandsDailymotion,\n faDeviantart as faBrandsDeviantart,\n faFacebook as faBrandsFacebook,\n faFlickr as faBrandsFlickr,\n faInstagram as faBrandsInstagram,\n faKickstarter as faBrandsKickstarter,\n faMicrosoft as faBrandsMicrosoft,\n faSlideshare as faBrandsSlideshare,\n faSoundcloud as faBrandsSoundcloud,\n faSpotify as faBrandsSpotify,\n faTwitter as faBrandsTwitter,\n faVimeo as faBrandsVimeo,\n faYoutube as faBrandsYoutube,\n} from \"@fortawesome/free-brands-svg-icons\";\nimport {\n faAlignCenter as faRegularAlignCenter,\n faAlignLeft as faRegularAlignLeft,\n faAlignRight as faRegularAlignRight,\n faAngleLeft as faRegularAngleLeft,\n faAngleRight as faRegularAngleRight,\n faArrowDownToBracket as faRegularArrowDownToBracket,\n faArrowLeft as faRegularArrowLeft,\n faArrows as faRegularArrows,\n faArrowsRepeat as faRegularArrowsRepeat,\n faArrowsUpDownLeftRight as faRegularArrowsUpDownLeftRight,\n faBars as faRegularBars,\n faBold as faRegularBold,\n faBolt as faRegularBolt,\n faBookmark as faRegularBookmark,\n faBoxArchive as faRegularBoxArchive,\n faBullhorn as faRegularBullhorn,\n faCalendar as faRegularCalendar,\n faCalendarDay as faRegularCalendarDay,\n faCalendarPlus as faRegularCalendarPlus,\n faCalendarRange as faRegularCalendarRange,\n faChartColumn as faRegularChartColumn,\n faCheck as faRegularCheck,\n faCheckCircle as faRegularCheckCircle,\n faCheckSquare as faRegularCheckSquare,\n faChevronDown as faRegularChevronDown,\n faChevronUp as faRegularChevronUp,\n faCircle as faRegularCircle,\n faCircleCheck as faRegularCircleCheck,\n faCircleInfo as faRegularCircleInfo,\n faCircleNotch as faRegularCircleNotch,\n faCirclePlay as faRegularCirclePlay,\n faCirclePlus as faRegularCirclePlus,\n faCircleUser as faRegularCircleUser,\n faClipboard as faRegularClipboard,\n faClock as faRegularClock,\n faClone as faRegularClone,\n faCloudDownload as faRegularCloudDownload,\n faCloudUpload as faRegularCloudUpload,\n faComment as faRegularComment,\n faCommentDots as faRegularCommentDots,\n faCommentSlash as faRegularCommentSlash,\n faComments as faRegularComments,\n faComputerClassic as faRegularComputerClassic,\n faDesktop as faRegularDesktop,\n faEarthEurope as faRegularEarthEurope,\n faEdit as faRegularEdit,\n faEllipsis as faRegularEllipsis,\n faEllipsisH as faRegularEllipsisH,\n faEllipsisVertical as faRegularEllipsisVertical,\n faEnvelope as faRegularEnvelope,\n faExchange as faRegularExchange,\n faEye as faRegularEye,\n faFile as faRegularFile,\n faFileCode as faRegularFileCode,\n faFileExcel as faRegularFileExcel,\n faFilePowerpoint as faRegularFilePowerpoint,\n faFileText as faRegularFileText,\n faFileWord as faRegularFileWord,\n faFiles as faRegularFiles,\n faFilter as faRegularFilter,\n faFloppyDisk as faRegularFloppyDisk,\n faFolder as faRegularFolder,\n faFolderOpen as faRegularFolderOpen,\n faHandshake as faRegularHandshake,\n faImage as faRegularImage,\n faInbox as faRegularInbox,\n faItalic as faRegularItalic,\n faKeyboard as faRegularKeyboard,\n faLink as faRegularLink,\n faList as faRegularList,\n faListOl as faRegularListOl,\n faListUl as faRegularListUl,\n faLocationDot as faRegularLocationDot,\n faLock as faRegularLock,\n faMailbox as faRegularMailbox,\n faMapLocation as faRegularMapLocation,\n faMapLocationDot as faRegularMapLocationDot,\n faMessages as faRegularMessages,\n faMinusCircle as faRegularMinusCircle,\n faMobile as faRegularMobile,\n faPaperclipVertical as faRegularPaperclipVertical,\n faPenToSquare as faRegularPenToSquare,\n faPencil as faRegularPencil,\n faPencilSquare as faRegularPencilSquare,\n faPipe as faRegularPipe,\n faPlus as faRegularPlus,\n faPlusCircle as faRegularPlusCircle,\n faPlusSquare as faRegularPlusSquare,\n faPowerOff as faRegularPowerOff,\n faScissors as faRegularScissors,\n faSearch as faRegularSearch,\n faShareSquare as faRegularShareSquare,\n faSidebar as faRegularSidebar,\n faSpinner as faRegularSpinner,\n faSquare as faRegularSquare,\n faStar as faRegularStar,\n faSuitcaseRolling as faRegularSuitcaseRolling,\n faTable as faRegularTable,\n faTags as faRegularTags,\n faTerminal as faRegularTerminal,\n faThumbsUp as faRegularThumbsUp,\n faTimes as faRegularTimes,\n faTimesCircle as faRegularTimesCircle,\n faTrash as faRegularTrash,\n faTrashCan as faRegularTrashCan,\n faTriangleExclamation as faRegularTriangleExclamation,\n faUnderline as faRegularUnderline,\n faUnlock as faRegularUnlock,\n faUpload as faRegularUpload,\n faUser as faRegularUser,\n faUserCircle as faRegularUserCircle,\n faUserPlus as faRegularUserPlus,\n faUserXmark as faRegularUserXmark,\n faUsers as faRegularUsers,\n faVirus as faRegularVirus,\n faVolumeXmark as faRegularVolumeXmark,\n faXmark as faRegularXmark,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCloudArrowDown as faLightCloudArrowDown,\n faEnvelope as faLightEnvelope,\n faFile as faLightFile,\n faFileAudio as faLightFileAudio,\n faFileCode as faLightFileCode,\n faFileCsv as faLightFileCsv,\n faFileExcel as faLightFileExcel,\n faFileImage as faLightFileImage,\n faFileLines as faLightFileLines,\n faFilePdf as faLightFilePdf,\n faFilePowerpoint as faLightFilePowerpoint,\n faFileVideo as faLightFileVideo,\n faFileWord as faLightFileWord,\n faFileZipper as faLightFileZipper,\n faImage as faLightImage,\n faMobileScreenButton as faLightMobileScreenButton,\n faPaperclipVertical as faLightPaperclipVertical,\n} from \"@fortawesome/pro-light-svg-icons\";\nimport {\n faChartSimple as faDuotoneChartSimple,\n faMedal as faDuotoneMedal,\n faUsers as faDuotoneUsers,\n} from \"@fortawesome/pro-duotone-svg-icons\";\n\nconfig.autoReplaceSvg = \"nest\";\n\nlibrary.add(\n faBrandsDailymotion,\n faBrandsDeviantart,\n faBrandsFacebook,\n faBrandsFlickr,\n faBrandsInstagram,\n faBrandsKickstarter,\n faBrandsMicrosoft,\n faBrandsSlideshare,\n faBrandsSoundcloud,\n faBrandsSpotify,\n faBrandsTwitter,\n faBrandsVimeo,\n faBrandsYoutube,\n faDuotoneChartSimple,\n faDuotoneMedal,\n faDuotoneUsers,\n faLightCloudArrowDown,\n faLightEnvelope,\n faLightFile,\n faLightFileAudio,\n faLightFileCode,\n faLightFileCsv,\n faLightFileExcel,\n faLightFileImage,\n faLightFileLines,\n faLightFilePdf,\n faLightFilePowerpoint,\n faLightFileVideo,\n faLightFileWord,\n faLightFileZipper,\n faLightImage,\n faLightMobileScreenButton,\n faLightPaperclipVertical,\n faRegularAlignCenter,\n faRegularAlignLeft,\n faRegularAlignRight,\n faRegularAngleLeft,\n faRegularAngleRight,\n faRegularArrowDownToBracket,\n faRegularArrowLeft,\n faRegularArrows,\n faRegularArrowsRepeat,\n faRegularArrowsUpDownLeftRight,\n faRegularBars,\n faRegularBold,\n faRegularBolt,\n faRegularBookmark,\n faRegularBoxArchive,\n faRegularBullhorn,\n faRegularCalendar,\n faRegularCalendarDay,\n faRegularCalendarPlus,\n faRegularCalendarRange,\n faRegularChartColumn,\n faRegularCheck,\n faRegularCheckCircle,\n faRegularCheckSquare,\n faRegularChevronDown,\n faRegularChevronUp,\n faRegularCircle,\n faRegularCircleCheck,\n faRegularCircleInfo,\n faRegularCircleNotch,\n faRegularCirclePlay,\n faRegularCirclePlus,\n faRegularCircleUser,\n faRegularClipboard,\n faRegularClock,\n faRegularClone,\n faRegularCloudDownload,\n faRegularCloudUpload,\n faRegularComment,\n faRegularCommentDots,\n faRegularCommentSlash,\n faRegularComments,\n faRegularComputerClassic,\n faRegularDesktop,\n faRegularEarthEurope,\n faRegularEdit,\n faRegularEllipsis,\n faRegularEllipsisH,\n faRegularEllipsisVertical,\n faRegularEnvelope,\n faRegularExchange,\n faRegularEye,\n faRegularFile,\n faRegularFileCode,\n faRegularFileExcel,\n faRegularFilePowerpoint,\n faRegularFileText,\n faRegularFileWord,\n faRegularFiles,\n faRegularFilter,\n faRegularFloppyDisk,\n faRegularFolder,\n faRegularFolderOpen,\n faRegularHandshake,\n faRegularImage,\n faRegularInbox,\n faRegularItalic,\n faRegularKeyboard,\n faRegularLink,\n faRegularList,\n faRegularListOl,\n faRegularListUl,\n faRegularLocationDot,\n faRegularLock,\n faRegularMailbox,\n faRegularMapLocation,\n faRegularMapLocationDot,\n faRegularMessages,\n faRegularMinusCircle,\n faRegularMobile,\n faRegularPaperclipVertical,\n faRegularPenToSquare,\n faRegularPencil,\n faRegularPencilSquare,\n faRegularPipe,\n faRegularPlus,\n faRegularPlusCircle,\n faRegularPlusSquare,\n faRegularPowerOff,\n faRegularScissors,\n faRegularSearch,\n faRegularShareSquare,\n faRegularSidebar,\n faRegularSpinner,\n faRegularSquare,\n faRegularStar,\n faRegularSuitcaseRolling,\n faRegularTable,\n faRegularTags,\n faRegularTerminal,\n faRegularThumbsUp,\n faRegularTimes,\n faRegularTimesCircle,\n faRegularTrash,\n faRegularTrashCan,\n faRegularTriangleExclamation,\n faRegularUnderline,\n faRegularUnlock,\n faRegularUpload,\n faRegularUser,\n faRegularUserCircle,\n faRegularUserPlus,\n faRegularUserXmark,\n faRegularUsers,\n faRegularVirus,\n faRegularVolumeXmark,\n faRegularXmark,\n faSolidAdjust,\n faSolidAlignJustify,\n faSolidAngleDoubleDown,\n faSolidAngleDoubleLeft,\n faSolidAngleDoubleRight,\n faSolidAngleDoubleUp,\n faSolidAngleLeft,\n faSolidAngleRight,\n faSolidArchive,\n faSolidArrowCircleUp,\n faSolidArrowDown,\n faSolidArrowLeft,\n faSolidArrowRight,\n faSolidArrows,\n faSolidArrowsAlt,\n faSolidAt,\n faSolidBan,\n faSolidBarChart,\n faSolidBars,\n faSolidBold,\n faSolidBook,\n faSolidBug,\n faSolidBullhorn,\n faSolidCalendar,\n faSolidCaretDown,\n faSolidCaretLeft,\n faSolidCaretRight,\n faSolidCertificate,\n faSolidCheck,\n faSolidCheckSquare,\n faSolidChevronCircleDown,\n faSolidChevronDown,\n faSolidChevronLeft,\n faSolidChevronRight,\n faSolidChevronUp,\n faSolidCircle,\n faSolidCircleInfo,\n faSolidCircleQuestion,\n faSolidClone,\n faSolidCloudDownload,\n faSolidCode,\n faSolidCodeFork,\n faSolidCoffee,\n faSolidCog,\n faSolidCogs,\n faSolidColumns,\n faSolidComment,\n faSolidCompress,\n faSolidEllipsis,\n faSolidEllipsisH,\n faSolidEnvelope,\n faSolidExclamation,\n faSolidExpand,\n faSolidExternalLink,\n faSolidEye,\n faSolidEyeSlash,\n faSolidFile,\n faSolidFileCsv,\n faSolidFileExcel,\n faSolidFilter,\n faSolidFlag,\n faSolidFlagCheckered,\n faSolidFolder,\n faSolidFolderOpen,\n faSolidFont,\n faSolidGears,\n faSolidGlobe,\n faSolidGripDots,\n faSolidHashtag,\n faSolidHeader,\n faSolidHome,\n faSolidImage,\n faSolidInfoCircle,\n faSolidItalic,\n faSolidLink,\n faSolidLinkSlash,\n faSolidList,\n faSolidListAlt,\n faSolidListOl,\n faSolidListUl,\n faSolidLock,\n faSolidMailbox,\n faSolidMapMarker,\n faSolidMessageXmark,\n faSolidPaperPlane,\n faSolidPaperclip,\n faSolidPencil,\n faSolidPencilSquare,\n faSolidPipe,\n faSolidPlay,\n faSolidPlus,\n faSolidPlusCircle,\n faSolidPrint,\n faSolidQuestion,\n faSolidQuestionCircle,\n faSolidQuoteLeft,\n faSolidQuoteRight,\n faSolidRefresh,\n faSolidReply,\n faSolidReplyAll,\n faSolidSave,\n faSolidSearch,\n faSolidShare,\n faSolidShield,\n faSolidSort,\n faSolidSortAsc,\n faSolidSortDesc,\n faSolidSortDown,\n faSolidSortNumericAsc,\n faSolidSortUp,\n faSolidSpaceShuttle,\n faSolidSpinner,\n faSolidSquare,\n faSolidSquareO,\n faSolidStar,\n faSolidStepBackward,\n faSolidStepForward,\n faSolidStrikethrough,\n faSolidTag,\n faSolidTags,\n faSolidThumbsUp,\n faSolidThumbtack,\n faSolidTimes,\n faSolidTimesCircle,\n faSolidToggleOff,\n faSolidToggleOn,\n faSolidTrash,\n faSolidUnderline,\n faSolidUnlock,\n faSolidUnlockAlt,\n faSolidUser,\n faSolidUserCircle,\n faSolidUserMinus,\n faSolidUserPlus,\n faSolidUserSecret,\n faSolidUserTimes,\n faSolidUserXmark,\n faSolidUsers,\n faSolidVolumeXmark,\n faSolidXmark,\n);\n\ndom.watch();\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 { faFaceSmile } from \"@fortawesome/pro-regular-svg-icons\";\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={faFaceSmile} />,\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 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 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 submitIcon={\"no-icon\"}\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 { 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 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 useItemBatchSelection from \"../shared/hooks/useItemBatchSelection\";\nimport Modal from \"../shared/Modal\";\nimport DefaultFolderRow from \"./table/FolderRow\";\nimport DefaultFileRow from \"./table/FileRow\";\nimport { useMoveFilesAndFolders, useRemoveFilesAndFolders } from \"./api\";\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\n const allSelected = difference(ids.current, selectedIds).length === 0;\n\n const { mutate: move, isLoading: isMoving } = useMoveFilesAndFolders({\n onSuccess: (data, { targetFolderId }) => {\n selectIds([]);\n onMoveItems(targetFolderId);\n },\n });\n\n const { mutate: remove, isLoading: isRemoving } = useRemoveFilesAndFolders({\n onSuccess: () => {\n onRemoveItems(selectedIds);\n selectIds([]);\n },\n });\n\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 const requests = [];\n if (!isEmpty(selectedItemIdsByType.file)) {\n requests.push({\n type: \"files\",\n body: {\n file_ids: map(selectedItemIdsByType.file, (f) => f.id),\n },\n });\n }\n if (!isEmpty(selectedItemIdsByType.folder)) {\n requests.push({\n type: \"folders\",\n body: {\n folder_ids: map(selectedItemIdsByType.folder, (f) => f.id),\n },\n });\n }\n\n remove(requests);\n },\n );\n };\n\n const moveSelected = (targetFolder) => {\n const requests = [];\n\n if (!isEmpty(selectedItemIdsByType.file)) {\n requests.push({\n type: \"files\",\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 if (!isEmpty(selectedItemIdsByType.folder)) {\n requests.push({\n type: \"folders\",\n body: {\n folder_ids: map(selectedItemIdsByType.folder, (f) => f.id),\n target_folder_id: targetFolder.id,\n },\n });\n }\n\n move({ targetFolderId: targetFolder.id, requests });\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 )}\n {isRemoving && (\n <Modal static>\n <Modal.Spinner label={I18n.t(\"js.files.batch_actions.is_removing\")} />\n </Modal>\n )}\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 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 FolderSelectModal from \"./FolderSelectModal\";\nimport {\n useMoveFilesAndFolders,\n useRemoveFilesAndFolders,\n} from \"components/files/api\";\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 [showModal, setShowModal] = useState(false);\n const contextPath =\n searchProps.contextType == \"group\"\n ? `/groups/${searchProps.contextId}`\n : \"\";\n\n const { mutate: remove } = useRemoveFilesAndFolders({\n onSuccess: () => {\n onRemoveItems([folderId]);\n },\n });\n\n const { mutate: move } = useMoveFilesAndFolders({\n onSuccess: (data, { targetFolderId }) => {\n onMoveItems(targetFolderId);\n },\n });\n\n function removeFolder(e) {\n e.preventDefault();\n\n if (confirm(I18n.t(\"js.files.folder.delete_confirmation\", { name }))) {\n remove([\n {\n type: \"folders\",\n body: {\n folder_ids: [folderId],\n },\n },\n ]);\n }\n }\n\n function moveFolder(targetFolder) {\n move({\n targetFolderId: targetFolder.id,\n requests: [\n {\n type: \"folders\",\n body: {\n folder_ids: [folderId],\n target_folder_id: targetFolder.id,\n },\n },\n ],\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, { 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","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","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 { faFileLines } from \"@fortawesome/pro-regular-svg-icons\";\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 icon={faFileLines} className={\"mr-1\"} />\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 {\n faPencil,\n faUsers,\n faTags,\n faIdCard,\n faKey,\n faUnlock,\n faLock,\n faTrash,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport React, { ChangeEvent, useState } from \"react\";\nimport DropDown, {\n DropDownItem,\n DropDownSubMenu,\n} from \"components/shared/DropDown\";\nimport { includes, isEmpty, map } from \"lodash\";\nimport { MembershipRole } from \"../../@types\";\n\ntype MembershipRoleItemArgs = {\n role: MembershipRole;\n membershipRoleIds: string[];\n changeMembershipRole: (e: ChangeEvent<HTMLInputElement>) => void;\n};\n\nfunction MembershipRoleItem({\n role,\n membershipRoleIds,\n changeMembershipRole,\n}: MembershipRoleItemArgs) {\n const [checked, setChecked] = useState(includes(membershipRoleIds, role.id));\n\n return (\n <DropDownItem key={role.id} className=\"dropdown-item\">\n <label className=\"checkbox\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => {\n setChecked(!checked);\n changeMembershipRole(e);\n }}\n name=\"role_id\"\n value={role.id}\n />\n <span\n className=\"badge text-muted\"\n style={{\n backgroundColor: role?.color || \"var(--gray-500)\",\n color: role?.text_color || \"white\",\n }}\n >\n {role.name}\n </span>\n </label>\n </DropDownItem>\n );\n}\n\ntype MemberManagerDropdownArgs = {\n can: {\n edit: boolean;\n edit_groups: boolean;\n destroy: boolean;\n };\n administrationPath: string;\n membershipId: string;\n isExternal: boolean;\n isLocked: boolean;\n toggleExternalMember: () => void;\n toggleMemberLock: () => void;\n changeMembershipRole: (e: ChangeEvent<HTMLInputElement>) => void;\n roles: MembershipRole[];\n membershipRoles: MembershipRole[];\n};\n\nexport default function MemberManagerDropdown({\n can,\n administrationPath,\n membershipId,\n isExternal,\n isLocked,\n toggleExternalMember,\n toggleMemberLock,\n roles,\n membershipRoles,\n changeMembershipRole,\n}: MemberManagerDropdownArgs) {\n return (\n <>\n <DropDown.Toggle className=\"text-muted\" small />\n <DropDown>\n {can.edit && (\n <DropDownItem\n url={`${administrationPath}/edit`}\n icon={faPencil}\n text={I18n.t(\"js.administration.members.edit_user_and_profile\")}\n />\n )}\n {can.edit_groups && (\n <DropDownItem\n url={`${administrationPath}/group-memberships`}\n icon={faUsers}\n text={I18n.t(\"js.administration.members.edit_groups_memberships\")}\n />\n )}\n {Preload.current_network.config.membership_roles_enabled &&\n !isEmpty(roles) && (\n <DropDownSubMenu\n text={I18n.t(\"js.administration.membership_roles.assign.title\")}\n side={window.isApp ? \"left\" : \"right\"}\n icon={faTags}\n dividerTop\n >\n {map(roles, (role) => (\n <MembershipRoleItem\n role={role}\n membershipRoleIds={map(membershipRoles, \"id\")}\n changeMembershipRole={changeMembershipRole}\n />\n ))}\n </DropDownSubMenu>\n )}\n {Preload.current_member?.minister && (\n <DropDownItem\n url={`/administration/ministry/memberships/${membershipId}`}\n icon={faIdCard}\n text={I18n.t(\"js.administration.members.ministry_link\")}\n dividerTop\n />\n )}\n {can.edit && (\n <>\n {Preload.current_network.config.guest_users.allowed && (\n <DropDownItem\n onSelect={(e) => {\n e.preventDefault();\n toggleExternalMember();\n }}\n icon={faIdCard}\n text={\n isExternal\n ? I18n.t(\n \"js.administration.member_manager.external_to_normal\",\n )\n : I18n.t(\n \"js.administration.member_manager.normal_to_external\",\n )\n }\n dividerTop\n />\n )}\n {Preload.current_network.config.two_factor !== \"disabled\" && (\n <DropDownItem\n url={`/administration/members/${membershipId}/authentication/factors`}\n method=\"delete\"\n confirm={I18n.t(\n \"js.administration.authentication.2fa.delete_confirmation\",\n )}\n icon={faKey}\n text={I18n.t(\n \"js.administration.authentication.2fa.reset_two_factor_configuration\",\n )}\n dividerTop\n />\n )}\n <DropDownItem\n onSelect={(e) => {\n e.preventDefault();\n toggleMemberLock();\n }}\n icon={isLocked ? faUnlock : faLock}\n text={\n isLocked\n ? I18n.t(\"js.administration.member_manager.unlock_user\")\n : I18n.t(\"js.administration.member_manager.lock_user\")\n }\n dividerTop\n />\n </>\n )}\n {can.destroy && (\n <>\n <DropDownItem\n linkStyle=\"!text-danger\"\n url={administrationPath}\n method=\"delete\"\n confirm={I18n.t(\"js.administration.members.confirm_delete\")}\n icon={faTrash}\n text={I18n.t(\"js.administration.members.delete_user\")}\n dividerTop\n />\n </>\n )}\n </DropDown>\n </>\n );\n}\n","import MarkdownEditor from \"./markdownEditor\";\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 MemberManagerDropdown from \"./MemberManagerDropDown\";\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/TranslationControls\": wrapProvider(store)(TranslationControls),\n \"shared/MemberManagerDropdown\": MemberManagerDropdown,\n};\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport type { Dispatch } from \"redux\";\nimport { forEach } from \"lodash\";\nimport TranslationDropDown, {\n ORIGINAL_LANGUAGE_SIGNIFIER,\n} from \"./TranslationDropDown\";\n\ninterface TranslationControlsProps {\n object_language: string;\n types: string[];\n target_id: string;\n resetTranslation: (language: string) => void;\n translateObject: (\n content: string,\n language: string,\n type?: string,\n name?: string,\n ) => void;\n buttonClassName?: string;\n}\n\nexport default function TranslationControls({\n types,\n target_id,\n object_language,\n resetTranslation,\n translateObject,\n buttonClassName,\n}: TranslationControlsProps) {\n const dispatch: Dispatch = useDispatch();\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 forEach(types, (type) => translate(language, type));\n }\n\n function translate(targetLanguage: string, type: string) {\n if (targetLanguage === ORIGINAL_LANGUAGE_SIGNIFIER) {\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, type, data.name);\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\n return (\n <TranslationDropDown\n handleLanguageSelect={handleLanguageSelect}\n object_language={object_language}\n buttonClassName={buttonClassName}\n />\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 from \"react\";\nimport PropTypes from \"prop-types\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faFilterCircleXmark } from \"@fortawesome/pro-regular-svg-icons\";\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={faFilterCircleXmark} />\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 getSelectedWidgetIndex = (state) =>\n get(state, [...editWidgetbarPath, \"selectedWidgetIndex\"]);\n\nexport const getCalendars = (state) =>\n get(state, [...editWidgetbarPath, \"calendars\"]);\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 { faGripDots } from \"@fortawesome/pro-solid-svg-icons\";\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={faGripDots}\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 map from \"lodash/map\";\nimport widgets, { widgetTypes } from \"helpers/widgets/widgets\";\nimport { DraggableWidget } from \"components/administration/widgetbar/Widget\";\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 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, { useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { map } from \"lodash\";\n\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 { faSpinner as faRegularSpinner } from \"@fortawesome/pro-regular-svg-icons\";\nimport { faArrowLeft as faSolidArrowLeft } from \"@fortawesome/pro-solid-svg-icons\";\nimport { setGroupId } from \"actions/administration/widgetbar\";\nimport { getWidgets } from \"helpers/selectors/widgetbarSelectors\";\nimport classnames from \"classnames\";\nimport { useMutation } from \"react-query\";\nimport withDragDropContext from \"../../shared/withDragDropContext\";\nimport {\n FETCH_CALENDARS_ACTIONS,\n FETCH_WIDGETBAR_ACTIONS,\n} from \"../../../actions/administration/widgetbar\";\nimport { fetchApi } from \"../../../helpers/reactQueryApi\";\n\nfunction WidgetbarForm({\n groupId,\n identifier,\n}: {\n groupId?: string;\n identifier: string;\n}) {\n const dispatch = useDispatch();\n\n useEffect(() => {\n groupId && dispatch(setGroupId({ groupId }));\n }, []);\n\n const context = groupId ? `/groups/${groupId}` : \"\";\n\n const {\n mutate: loadWidgetbar,\n isLoading,\n isError,\n } = useMutation<{ widgetbar: { widgets: any[] } }, unknown>(\n () => fetchApi(`${context}/administration/widgetbars/${identifier}.json`),\n {\n onSuccess: (data) => {\n dispatch({\n type: FETCH_WIDGETBAR_ACTIONS.SUCCESS,\n payload: data,\n });\n },\n onError: () => {\n toastr.error(I18n.t(\"js.administration.widgetbars.load_error\"));\n },\n },\n );\n\n const { mutate: loadCalendars } = useMutation<{ calendars: any[] }, unknown>(\n () => fetchApi(`${context}/administration/widgetbars/calendars.json`),\n {\n onSuccess: (data) => {\n dispatch({\n type: FETCH_CALENDARS_ACTIONS.SUCCESS,\n payload: data,\n });\n },\n },\n );\n\n const { mutate: updateWidgetbar } = useMutation(\n (body: { widgetbar: { widgets: any[] } }) =>\n fetchApi(`${context}/administration/widgetbars/${identifier}.json`, {\n method: \"PUT\",\n body,\n }),\n {\n onSuccess: () => {\n toastr.success(I18n.t(\"js.administration.widgetbars.save_success\"));\n },\n onError: () => {\n toastr.error(I18n.t(\"js.administration.widgetbars.save_error\"));\n },\n },\n );\n\n useEffect(() => {\n loadWidgetbar();\n loadCalendars();\n }, []);\n\n const widgets = useSelector((state) => getWidgets(state));\n\n function onSubmit(e) {\n e.preventDefault();\n\n const 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 updateWidgetbar(body);\n }\n\n if (isLoading) {\n return (\n <div>\n <FontAwesomeIcon icon={faRegularSpinner} spin />\n <i className=\"fa fa-spinner fa-spin\" />\n {I18n.t(\"js.administration.widgetbars.loading\")}\n </div>\n );\n } else if (isError) {\n return <NotFound />;\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={faSolidArrowLeft}\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 identifier={identifier} />\n <WidgetbarLayout />\n <WidgetPropertiesLayout />\n </div>\n </form>\n );\n }\n}\n\nexport default withDragDropContext(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 React from \"react\";\nimport map from \"lodash/map\";\nimport { getWidgetName } from \"helpers/widgets/widgets\";\nimport { useQuery } from \"react-query\";\n\ninterface WidgetbarSelectionTypes {\n groupId?: string;\n}\n\nexport default function WidgetbarSelection({\n groupId,\n}: WidgetbarSelectionTypes) {\n const { data, isLoading } = useQuery<{\n widgetbars: {\n slug: string;\n widgets: any[];\n }[];\n }>(`${groupId ? `/groups/${groupId}` : \"\"}/administration/widgetbars.json`);\n\n const widgetbars = data?.widgetbars;\n\n return isLoading ? (\n <div>{I18n.t(\"js.loading\")}</div>\n ) : (\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 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 groupContext?: boolean;\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 groupContext,\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 {groupContext && (\n <td>\n {I18n.t(\n `js.administration.membership_roles.display_type.${display_type}`,\n )}\n </td>\n )}\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 groupContext,\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 {groupContext && (\n <td>\n <select\n onChange={handleChange(\"display_type\") as ChangeEventHandler}\n value={display_type}\n >\n <option value=\"default\">\n {I18n.t(\n \"js.administration.membership_roles.display_type.default\",\n )}\n </option>\n <option value=\"grouped\">\n {I18n.t(\n \"js.administration.membership_roles.display_type.grouped\",\n )}\n </option>\n <option value=\"hidden\">\n {I18n.t(\"js.administration.membership_roles.display_type.hidden\")}\n </option>\n </select>\n </td>\n )}\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 groupContext: boolean;\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 groupContext,\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 const backRef = `${contextUrl}/administration/members`;\n\n return (\n <div ref={tooltipRef}>\n <div className=\"btn-toolbar\">\n <div className=\"btn-group\">\n <a className=\"btn\" title={I18n.t(\"js.back\")} href={backRef}>\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 {groupContext\n ? I18n.t(\"js.administration.membership_roles.add\")\n : I18n.t(\"js.administration.user_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 {groupContext && (\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 )}\n\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 groupContext={groupContext}\n handleChange={handleChange}\n handleCancelEdit={handleCancelEdit}\n {...role}\n />\n ) : (\n <Role\n key={role.id}\n groupContext={groupContext}\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 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 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 { faPlus } from \"@fortawesome/pro-solid-svg-icons\";\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={faPlus} 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 { faChevronRight as faRegularChevronRight } from \"@fortawesome/pro-regular-svg-icons\";\nimport { faStar as faSolidStar } from \"@fortawesome/pro-solid-svg-icons\";\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={faRegularChevronRight}\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={faSolidStar}\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 {\n faBullhorn as faLightBullhorn,\n faEarthEurope as faLightEarthEurope,\n faInbox as faLightInbox,\n faCalendarDay as faLightCalendarDay,\n faCircleCheck as faLightCircleCheck,\n faFolderOpen as faLightFolderOpen,\n faUser as faLightUser,\n faEllipsis as faLightEllipsis,\n faBrush as faLightBrush,\n faCircleInfo as faLightCircleInfo,\n} from \"@fortawesome/pro-light-svg-icons\";\nimport {\n faBullhorn as faDuotoneBullhorn,\n faEarthEurope as faDuotoneEarthEurope,\n faInbox as faDuotoneInbox,\n faCalendarDay as faDuotoneCalendarDay,\n faCircleCheck as faDuotoneCircleCheck,\n faFolderOpen as faDuotoneFolderOpen,\n faBrush as faDuotoneBrush,\n faCircleInfo as faDuotoneCircleInfo,\n} from \"@fortawesome/pro-duotone-svg-icons\";\nimport ModuleSwitcher from \"./ModuleSwitcher\";\nimport { isEmpty, 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 Channels() {\n let url: string | undefined =\n Preload.current_network.config.channels?.start_page;\n if (!url || isEmpty(url)) url = \"/channels\";\n\n return {\n title: I18n.t(\"js.channels.module_name\"),\n icon: ({ duo, active }) => (\n <FontAwesomeIcon\n icon={duo ? faDuotoneBullhorn : faLightBullhorn}\n className={active ? \"fa-swap-opacity\" : \"\"}\n />\n ),\n slug: \"channels\",\n url,\n };\n },\n get Activitystreams() {\n return {\n title: I18n.t(\"js.activitystreams.module_name\"),\n icon: ({ duo, active }) => (\n <FontAwesomeIcon\n icon={duo ? faDuotoneEarthEurope : faLightEarthEurope}\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 icon={duo ? faDuotoneInbox : faLightInbox} />\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 ? faDuotoneCalendarDay : faLightCalendarDay}\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 ? faDuotoneCircleCheck : faLightCircleCheck}\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 icon={duo ? faDuotoneFolderOpen : faLightFolderOpen} />\n ),\n slug: \"files\",\n url: \"/files\",\n };\n },\n get Directory() {\n return {\n title: \"Kontakte\",\n icon: ({ active }) => (\n <FontAwesomeIcon\n icon={faLightUser}\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={faLightEllipsis}\n className={active ? \"fa-swap-opacity\" : \"\"}\n />\n ),\n slug: \"more\",\n url: \"/more\",\n };\n },\n};\n\ntype Props = {\n activeModule?:\n | \"channels\"\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={faDuotoneBrush} />\n ) : (\n <FontAwesomeIcon icon={faLightBrush} />\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 ? faDuotoneCircleInfo : faLightCircleInfo}\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 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, { useState } from \"react\";\nimport TixxtModuleSwitcher from \"components/layout/TixxtModuleSwitcher\";\nimport {\n ContextNavigation,\n UserbarLink,\n UserbarSection,\n} from \"components/layout/Userbar\";\nimport { useChannels } from \"components/channels/api\";\nimport { closeUserbar } from \"../../layout/togglebar\";\nimport { isEmpty, some } from \"lodash\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { useBlog } from \"components/blogs/api\";\n\nfunction persistOpenState(open: boolean, section: string) {\n localStorage.setItem(`${section}/open`, open.toString());\n}\n\nfunction loadOpenState(section: string) {\n const item = localStorage.getItem(`${section}/open`);\n return item === null ? null : item === \"true\";\n}\n\nfunction EmptySubscribedHint() {\n return (\n <div className={\"text-center\"}>\n <div className=\"opacity-60 userbar-link-hint\">\n {I18n.t(\"js.channels.userbar.subscribed.empty\")}\n </div>\n <a\n className=\"opacity-80\"\n href={`/directory/channels`}\n onClick={closeUserbar}\n >\n {I18n.t(\"js.channels.userbar.subscribed.call_to_action\")}\n </a>\n </div>\n );\n}\n\nfunction EmptyRecentHint() {\n return (\n <div className={\"text-center\"}>\n <div className=\"opacity-60 userbar-link-hint\">\n {I18n.t(\"js.channels.userbar.recent.empty\")}\n </div>\n </div>\n );\n}\n\nfunction EmptyPopularHint() {\n return (\n <div className={\"text-center\"}>\n <div className=\"opacity-60 userbar-link-hint\">\n {I18n.t(\"js.channels.userbar.popular.empty\")}\n </div>\n </div>\n );\n}\n\nconst DISPLAY_LIMITS = {\n subscribed: 50,\n recent: 10,\n popular: 25,\n};\n\nexport default function ChannelsUserbar() {\n const { data: channelsData, isLoading } = useChannels();\n const { blogId } = useParams();\n const { data: blog } = useBlog(blogId);\n const channelTypes = [\"subscribed\", \"recent\", \"popular\"];\n const channelData = channelTypes.map((type) => ({\n type,\n isLoading,\n data: channelsData?.[type] ?? [],\n openState: loadOpenState(`${type}ChannelsSection`),\n }));\n\n const [openStates, setOpenStates] = useState(\n channelData.reduce((acc, { type, data, openState }) => {\n acc[type] = openState === null ? !isEmpty(data.data) : openState;\n return acc;\n }, {}),\n );\n\n const handleSetOpen = (type, open) => {\n setOpenStates((prev) => ({ ...prev, [type]: open }));\n persistOpenState(open, `${type}ChannelsSection`);\n };\n\n const renderSection = (type, channels, isLoading) => {\n const titleKey = `js.channels.userbar.${type}.section_title`;\n const emptyHint =\n type === \"subscribed\" ? (\n <EmptySubscribedHint />\n ) : type === \"recent\" ? (\n <EmptyRecentHint />\n ) : (\n <EmptyPopularHint />\n );\n const showMoreKey = `js.channels.userbar.${type}.show_more`;\n\n return (\n <UserbarSection\n key={type}\n title={I18n.t(titleKey)}\n isOpen={openStates[type]}\n setIsOpen={(open) => handleSetOpen(type, open)}\n hasFavorites={\n type === \"subscribed\" && some(channels, { i: { favorited: true } })\n }\n collapsible\n >\n {(channels ?? []).length === 0 &&\n (isLoading ? (\n <UserbarLink key={0} to={`/channels`} active={false}>\n {I18n.t(\"js.loading\")}\n </UserbarLink>\n ) : (\n emptyHint\n ))}\n {(channels ?? []).slice(0, DISPLAY_LIMITS[type]).map((channel) => (\n <UserbarLink\n key={channel.id}\n to={`/channels/${channel.slug}`}\n favorited={type === \"subscribed\" && channel.i.favorited}\n showWhileClosed={type === \"subscribed\" && channel.i.favorited}\n collapsed={!openStates[type]}\n active={blog ? channel.id == blog.parent_id : undefined}\n >\n {channel.title}\n </UserbarLink>\n ))}\n {(channels ?? []).length > DISPLAY_LIMITS[type] &&\n type === \"subscribed\" && (\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/channels?only_subscribed=true`}\n onClick={closeUserbar}\n >\n {I18n.t(showMoreKey)}\n </a>\n </li>\n )}\n {(type === \"recent\" || type === \"popular\") && (\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/channels`}\n onClick={closeUserbar}\n >\n {I18n.t(showMoreKey)}\n </a>\n </li>\n )}\n </UserbarSection>\n );\n };\n\n return (\n <>\n <TixxtModuleSwitcher activeModule=\"channels\" />\n <ContextNavigation>\n <UserbarSection\n key=\"start_page\"\n title={I18n.t(\"js.userbar.content_section.title\")}\n isOpen={true}\n >\n {!isEmpty(channelsData?.start_page) ? (\n (channelsData?.start_page ?? []).map((channel) => (\n <UserbarLink key={channel.id} to={`/channels/${channel.slug}`}>\n {I18n.t(`js.channels.userbar.start_page.section_title`)}\n </UserbarLink>\n ))\n ) : (\n <UserbarLink key=\"channels/\" to={`/channels`}>\n {I18n.t(`js.channels.userbar.start_page.section_title`)}\n </UserbarLink>\n )}\n {Preload.current_member?.can.create_channels && (\n <UserbarLink key=\"/channels/new\" to={`/channels/new`}>\n {I18n.t(\"js.channels.userbar.contents.create_new_channel\")}\n </UserbarLink>\n )}\n </UserbarSection>\n {channelData.map(({ type, isLoading, data: channels }) =>\n renderSection(type, channels, isLoading),\n )}\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\";\nimport { useParams } from \"helpers/tixxt-router\";\nimport { useChannel } from \"components/channels/api\";\n\nexport default function ChannelAdministrationUserbar() {\n const { channelSlug } = useParams();\n const { data: channel, isLoading } = useChannel(channelSlug);\n return (\n <>\n {!window.isApp && <TixxtModuleSwitcher activeModule={\"channels\"} />}\n <ContextNavigation>\n <UserbarSection\n title={I18n.t(\"js.channels.administration_userbar.channel_title\")}\n >\n <UserbarLink to={`/channels/${channelSlug}/administration`}>\n {isLoading ? I18n.t(\"js.loading\") : channel?.title}\n </UserbarLink>\n </UserbarSection>\n <UserbarSection\n title={I18n.t(\n \"js.channels.administration_userbar.administration_title\",\n )}\n >\n <UserbarLink to={`/channels/${channelSlug}/edit`}>\n {I18n.t(\"js.administration.userbar.channels.settings.title\")}\n </UserbarLink>\n <UserbarLink to={`/channels/${channelSlug}/layout/edit`}>\n {I18n.t(\"js.administration.userbar.channels.layout.title\")}\n </UserbarLink>\n <UserbarLink to={`/channels/${channelSlug}/design/edit`}>\n {I18n.t(\"js.administration.userbar.channels.design.title\")}\n </UserbarLink>\n <UserbarLink to={`/channels/${channelSlug}/widgets`} prefixMatch>\n {I18n.t(\"js.administration.userbar.channels.widgets.title\")}\n </UserbarLink>\n </UserbarSection>\n </ContextNavigation>\n </>\n );\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\";\nimport ChannelsUserbar from \"components/channels/Userbar\";\nimport ChannelAdministrationUserbar from \"components/administration/channels/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 {\n path: \"/channels/:channelSlug/administration\",\n element: <ChannelAdministrationUserbar />,\n },\n {\n path: \"/channels/:channelSlug/edit\",\n element: <ChannelAdministrationUserbar />,\n },\n {\n path: \"/channels/:channelSlug/layout/edit\",\n element: <ChannelAdministrationUserbar />,\n },\n {\n path: \"/channels/:channelSlug/design/edit\",\n element: <ChannelAdministrationUserbar />,\n },\n {\n path: \"/channels/:channelSlug/widgets\",\n element: <ChannelAdministrationUserbar />,\n },\n {\n path: \"/channels/:channelSlug/widgets/*\",\n element: <ChannelAdministrationUserbar />,\n },\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/channels\", element: <ChannelsUserbar /> },\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: \"/channels\", element: <ChannelsUserbar /> },\n { path: \"/channels/:channelSlug\", element: <ChannelsUserbar /> },\n { path: \"/channels/:channelSlug/*\", element: <ChannelsUserbar /> },\n {\n path: \"/blogs\",\n element: <ChannelsUserbar />,\n },\n {\n path: \"/blogs/:blogId/articles/:articleId\",\n element: <ChannelsUserbar />,\n },\n {\n path: \"/blogs/:blogId/articles/:articleId/*\",\n element: <ChannelsUserbar />,\n },\n {\n path: \"/blogs/:blogId/*\",\n element: <ChannelsUserbar />,\n },\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, { 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 faEarthEurope as faRegularEarthEurope,\n faInbox as faRegularInbox,\n faFolderOpen as faRegularFolderOpen,\n faCalendarDay as faRegularCalendarDay,\n faTable as faRegularTable,\n faCompass as faRegularCompass,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faEarthEurope as faDuotoneEarthEurope,\n faInbox as faDuotoneInbox,\n faFolderOpen as faDuotoneFolderOpen,\n faCalendarDay as faDuotoneCalendarDay,\n faTable as faDuotoneTable,\n faCompass as faDuotoneCompass,\n} from \"@fortawesome/pro-duotone-svg-icons\";\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 ? faDuotoneEarthEurope : faRegularEarthEurope}\n />\n );\n case \"messages\":\n return (\n <FontAwesomeIcon\n className={\"\"}\n icon={duo ? faDuotoneInbox : faRegularInbox}\n />\n );\n case \"files\":\n return (\n <FontAwesomeIcon\n className={\"\"}\n icon={duo ? faDuotoneFolderOpen : faRegularFolderOpen}\n />\n );\n case \"appointments\":\n return (\n <FontAwesomeIcon\n className={\"\"}\n icon={duo ? faDuotoneCalendarDay : faRegularCalendarDay}\n />\n );\n case \"items\":\n return (\n <FontAwesomeIcon\n className={\"\"}\n icon={duo ? faDuotoneTable : faRegularTable}\n />\n );\n default:\n return (\n <FontAwesomeIcon\n className={\"\"}\n icon={duo ? faDuotoneCompass : faRegularCompass}\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 { faChevronRight as faSolidChevronRight } from \"@fortawesome/pro-solid-svg-icons\";\nimport {\n faMagnifyingGlass as faRegularMagnifyingGlass,\n faUsers as faRegularUsers,\n faXmark as faRegularXmark,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faMagnifyingGlass as faDuotoneMagnifyingGlass,\n faUsers as faDuotoneUsers,\n} from \"@fortawesome/pro-duotone-svg-icons\";\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 ? faDuotoneMagnifyingGlass : faRegularMagnifyingGlass}\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 ? faDuotoneMagnifyingGlass : faRegularMagnifyingGlass\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 ? faDuotoneUsers : faRegularUsers}\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={faRegularXmark}\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={faSolidChevronRight} />\n </button>\n </form>\n );\n}\n","import React from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faComments as faLightComments } from \"@fortawesome/pro-light-svg-icons\";\nimport { faComments as faDuotoneComments } from \"@fortawesome/pro-duotone-svg-icons\";\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 ? faDuotoneComments : faLightComments}\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 faNewspaper as faRegularNewspaper,\n faEnvelopeOpenText as faRegularEnvelopeOpenText,\n faCalendarCircleUser as faRegularCalendarCircleUser,\n faIdBadge as faRegularIdBadge,\n faUserPen as faRegularUserPen,\n faPenToSquare as faRegularPenToSquare,\n faGears as faRegularGears,\n faEye as faRegularEye,\n faChartUser as faRegularChartUser,\n faScrewdriverWrench as faRegularScrewdriverWrench,\n faGear as faRegularGear,\n faArrowRightFromBracket as faRegularArrowRightFromBracket,\n} from \"@fortawesome/pro-regular-svg-icons\";\nimport { faBell as faLightBell } from \"@fortawesome/pro-light-svg-icons\";\nimport {\n faBell as faDuotoneBell,\n faCircleChevronDown as faDuotoneCircleChevronDown,\n} from \"@fortawesome/pro-duotone-svg-icons\";\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={faRegularNewspaper}\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={faRegularEnvelopeOpenText}\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={faRegularCalendarCircleUser}\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 <DropDown.Toggle\n className=\"header__link notifications__link relative\"\n icon={duo ? faDuotoneBell : faLightBell}\n iconClassName=\"notifications__icon fa-xl\"\n title={I18n.t(\"js.layouts.user_central.notifications_title\")}\n buttonType=\"normal\"\n >\n {unreadCount > 0 && <NotificationPing />}\n </DropDown.Toggle>\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 onClick={(e) => e.stopPropagation()}\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={faDuotoneCircleChevronDown}\n className={\"menu__indicator absolute right-2.5 bottom-2.5\"}\n />\n {availableUpdates?.length > 0 && (\n <NotificationPing className={\"right-2\"} />\n )}\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={faRegularIdBadge}\n text={I18n.t(\"js.memberships.my_profile\")}\n />\n {currentMember.can.update_profile && (\n <DropDownItem\n url={`/members/${currentMember.id}/edit`}\n icon={faRegularUserPen}\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={faRegularPenToSquare}\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={faRegularGears}\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={faRegularEye}\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={faRegularChartUser}\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={faRegularScrewdriverWrench}\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={faRegularGear}\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={faRegularArrowRightFromBracket}\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 {\n faBars as faLightBars,\n faHouse as faLightHouse,\n} from \"@fortawesome/pro-light-svg-icons\";\nimport {\n faBars as faDuotoneBars,\n faHouse as faDuotoneHouse,\n} from \"@fortawesome/pro-duotone-svg-icons\";\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 ? faDuotoneBars : faLightBars}\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 ? faDuotoneHouse : faLightHouse}\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\";\nimport ApplyOverrideChannelTheme from \"components/channels/design/ApplyOverrideChannelTheme\";\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 <ApplyOverrideChannelTheme />\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\";\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 { faGift } from \"@fortawesome/pro-regular-svg-icons\";\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={faGift} />\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 { faGift } from \"@fortawesome/pro-regular-svg-icons\";\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={faGift} />\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 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\";\nimport ChannelListView from \"../components/directory/channels/ChannelListView\";\nimport StreamTargeting from \"../components/activitystreams/composer/StreamTargeting\";\n\nadaptBackboneView.addComponents({\n \"activitystreams/Composer\": ActivityComposer,\n \"activitystreams/ReplyComposer\": wrapProvider(store)(ReplyComposer),\n \"activitystreams/StreamTargeting\": StreamTargeting,\n \"calendars/MonthSheetView\": CalendarSheet,\n \"rundschreiben/ExternalIdComponent\": ExternalIdComponent,\n \"widgetbars/ActivitystreamWidgetbar\": ActivitystreamWidgetbar,\n \"directory/ChannelListView\": ChannelListView,\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","import React from \"react\";\nimport { Activitystream } from \"../../../api/activitystreams\";\nimport ReactSelect from \"react-select\";\nimport { groupBy, map, orderBy, toLower } from \"lodash\";\nimport Label from \"components/shared/form/Label\";\n\ntype StreamTargeting = {\n streams: Activitystream[];\n selectedStreams: Activitystream[];\n onSelectStreams: (slug: string[]) => void;\n};\n\nexport default function StreamTargeting({\n streams,\n selectedStreams,\n onSelectStreams,\n}: StreamTargeting) {\n const groupedStreams = map(\n groupBy(\n streams,\n (stream) =>\n stream.category_name ||\n I18n.t(\n \"js.activitystreams.composer.stream_targeting.selection.network_streams\",\n ),\n ),\n (options, key) => {\n const serializedOptions = map(options, (opt) => ({\n label: opt.name,\n value: opt.slug,\n }));\n return {\n label: key,\n options: orderBy(\n serializedOptions,\n (stream) => toLower(stream.label),\n \"asc\",\n ),\n };\n },\n );\n\n return (\n <div className=\"mb-2\">\n <Label label={I18n.t(\"composer.editor.stream_targeting.label\")} />\n <ReactSelect\n options={groupedStreams}\n value={map(selectedStreams, (stream) => ({\n label: stream.name,\n value: stream.slug,\n }))}\n onChange={(options) => onSelectStreams(map(options, \"value\"))}\n placeholder={I18n.t(\"composer.editor.stream_targeting.label\")}\n noOptionsMessage={() => I18n.t(\"js.plugins.select2.no_match\")}\n className=\"form-select-container\"\n classNamePrefix=\"form-select\"\n closeMenuOnSelect\n unstyled\n isMulti\n isSearchable\n />\n </div>\n );\n}\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 { 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 chats from \"./chats\";\nimport messages from \"./messages\";\nimport session from \"./session\";\nimport composer from \"./composer\";\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 chatReducer = combineReducers({\n chats,\n session,\n messages,\n composer,\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 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 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\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 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","import { createSelector } from \"reselect\";\nimport { get, mapValues, sortBy, orderBy, groupBy, pick, find } from \"lodash\";\nimport { Group, State } from \"../@types\";\n\nexport const networkSelector = (state: State) => state.network;\n\nexport const selectNetworkId = (state) => state.network.id;\n\nexport const networkNameSelector = (state) => get(state, \"network.name\");\nexport const selectNetworkMAUrlScheme = (state) =>\n get(networkSelector(state), [\"config\", \"mobile_app\", \"url_scheme\"]);\n\nexport const networkAdminSelector = (state) =>\n get(networkSelector(state), [\"can\", \"administrate\"]);\n\nexport const currentMemberSelector = (state: State) =>\n get(state, \"currentMember\");\n\nexport const groupCategoriesSelector = createSelector(\n [networkSelector],\n (network: State[\"network\"]) =>\n orderBy(get(network, \"group_categories\"), \"order\", \"asc\"),\n);\n\nexport const groupCategorySelector = (state, slug) => {\n const groupCategories = groupCategoriesSelector(state);\n return find(groupCategories, [\"slug\", slug]);\n};\nexport const groupCategoryFromIdSelector = (state, id) => {\n const groupCategories = groupCategoriesSelector(state);\n return find(groupCategories, [\"id\", id]);\n};\nconst groupSorter = (groups) =>\n sortBy(groups, [\n ({ active_main_group }) => (active_main_group ? 0 : 1),\n ({ name }) => name.toLowerCase(),\n ]);\n\ntype StateGroups = {\n bySlug: { [key: string]: Group[] };\n myGroupSlugs: string[];\n};\n\nexport const myGroupsByCategoryIdSelector = createSelector(\n (state: { groups: StateGroups }) => state.groups,\n (groups: StateGroups) => {\n const myGroups = pick(groups.bySlug, groups.myGroupSlugs);\n return mapValues(groupBy(myGroups, \"category_id\"), groupSorter);\n },\n);\n\nexport const groupSelector = (state, groupSlug) =>\n state.groups.bySlug[groupSlug];\n\nexport const fetchGroupRequestSelector = (state) =>\n state.groups.fetchGroupRequest;\n\nexport const groupDefaultsSelector = (state) => state.groups.groupDefaults;\n","import { get } from \"lodash\";\nimport { groupSelector, networkSelector } from \"./environment\";\n\n// Select the currentFolder from state\nexport const currentFolderMetaSelector = (state) =>\n get(state, [\"folders\", \"currentFolder\"]);\n\nexport const rootFolderIdSelector =\n ({ groupSlug }) =>\n (state) =>\n get(\n groupSlug ? groupSelector(state, groupSlug) : networkSelector(state),\n \"root_folder_id\",\n );\n","import { get } from \"lodash\";\n\nexport const selectFolderProfilesEnabled = (state) =>\n get(state, [\"network\", \"config\", \"folder_profiles\", \"enabled\"]);\n\nexport const selectFileProfilesEnabled = (state) =>\n get(state, [\"network\", \"config\", \"file_profiles\", \"enabled\"]);\n\nexport const selectFileProfileColumnFields = (state) =>\n get(state, [\"network\", \"config\", \"file_profiles\", \"column_fields\"]);\n","// extracted by mini-css-extract-plugin\nexport default {\"Text\":\"z63zsfq_KSzcTO2SGLsY\",\"SimpleInput\":\"t5R5AKZFkWkaozIYri0y\",\"Date\":\"EpkbB7lShncM_4IXi5SS\",\"Address\":\"IPFRWL8jo7WSGBDDoyuQ\",\"AddressRow\":\"EvVYeQ1fpHlK_VQpoc3_\",\"CityRow\":\"kKwbSxQ2obcdfrsAzvhN EvVYeQ1fpHlK_VQpoc3_\",\"StreetRow\":\"zZrrcJ4lXpCHEfsp3RgX EvVYeQ1fpHlK_VQpoc3_\",\"AddressNumber\":\"t2gUytGHRMKc0xvHVgk7\",\"AddressZip\":\"cmbbRVhfPpA6LIK3wiVQ\",\"Email\":\"ssIOenP7KiAWpqAumeUT\",\"File\":\"vF45nkt0KGJ2Ckq1ntH0\",\"Html\":\"xsSOzvb37nqJ9X0qW7lI\",\"Image\":\"Wegzu2wZdwcvwAg8cHyS\",\"Number\":\"p_Z8ZDYPt80K8DdGhMyV\",\"Url\":\"i0PIRVIQoS7ipXf_WmXD\",\"StateRow\":\"owPGccUwFwc6vggiwTN_\",\"Selection\":\"ngajHMGP2a0i8Ci1bVGd\",\"Relation\":\"GVscBWYHxWNKtjMXHwMv ngajHMGP2a0i8Ci1bVGd\",\"Membership\":\"yHLOfuP2Ky3jV3Jhd8iQ ngajHMGP2a0i8Ci1bVGd\",\"Tag\":\"KpeLfIAxE6tanlooACtR ngajHMGP2a0i8Ci1bVGd\"};","// extracted by mini-css-extract-plugin\nexport default {\"Address\":\"RlTRDbuhXFVtJdOgt3CQ\",\"Date\":\"B_pdkknf9xOJVZ3384d9\",\"Email\":\"gQj2zWvB3WayBwppHzcW\",\"Html\":\"Ym_OsONhaqnGgTsK8hCb\",\"Image\":\"aIGB4S867sRyVG4UG0Yp\",\"Selection\":\"AZVMaE4xau_pvXr7E004\",\"Tag\":\"NUbQL3eZEit7cDkZolZ9\",\"Headline\":\"GyPcD5RuMnHh41yNPi23\",\"Relation\":\"oaMSYfUoM6rVtLyqW6CC\",\"Text\":\"KpDb3W4SM9NEPjNBuHE3\",\"GenericValueList\":\"ogcZx00a0lpX3AQbUdfw\",\"MembershipRelation\":\"oBquGMe8MlopgHEkxuiQ\",\"Statistics\":\"VW3S2H7nIKwkNQvCHPa_\"};","// extracted by mini-css-extract-plugin\nexport default {};","// extracted by mini-css-extract-plugin\nexport default {\"ValueSetTable\":\"v80inUU_hqP9o4gp7Fab\",\"value\":\"T2jS67UEXYfbM9sKUf5F\"};","var map = {\n\t\"./de.js\": 59740,\n\t\"./en-gb.js\": 22243,\n\t\"./es.js\": 55655\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 88257;"],"names":["CustomConfigurator","constructor","instance","this","_defaults","_config","get","path","getPath","set","value","setPath","setDefault","exists","isNil","existsDefault","window","Object","freeze","IS_CHAT_QUERY","IS_NETWORK_QUERY","createChatQueryAction","event","type","toUpperCase","actionCreator","data","replyType","createNetworkQueryAction","basicActionCreator","loadChatDetails","loadMoreMessages","markAsRead","muteChat","muteAppChat","unmuteChat","unmuteAppChat","createChat","setChatStatus","unreadsQueryOptions","refetchInterval","convertPayload","payload","features","activitystreams","Activitystreams","appointments","Calendars","messages","Messages","total","sum","values","useFeaturesUnreads","currentMember","Preload","current_member","delayedEnabled","setDelayedEnabled","useState","useEffect","timeout","setTimeout","clearTimeout","useQuery","fetchApi","enabled","onSuccess","isApp","unreads","bridge","postMessage","useActivitiesUnreads","useSelector","currentMemberSelector","Tixxt","Activitystream","all","processUnreadCounts","useFoldersUnreads","options","Avatar","mention","theme","avatar","React","src","className","mentionSuggestionsEntryAvatar","role","props","rest","parentProps","omit","name","mentionSuggestionsEntryText","MentionEntry","DefaultEntryComponent","assign","inlineMentionPlugin","createMentionPlugin","mentionTrigger","entityMutability","mentionComponent","children","supportWhitespace","InlineMentionSuggestions","open","setOpen","suggestions","setSuggestions","onOpenChange","useCallback","_open","MentionSuggestions","onSearchChange","async","response","$","ajax","url","currentNetwork","dataType","q","contentType","map","m","id","showNameWithProfileField","displayName","detectionProfileField","detection_profile_field","isExternal","is_external","images","small","entryComponent","createInlineMentionPlugin","useAdministrationUserbarLinks","groupSlug","groupCategorySlug","params","context_type","context_id","stringify","refetchOnWindowFocus","useMembershipProfile","membershipId","lightThemeToCss","bannerType","logoType","cssContent","push","LOGO_RULES","BANNER_RULES","join","themeToCss","derivedColors","variable","colorObj","colorObjToCSSProperties","result","color","abstract","tailwind","r","g","b","TinyColor","toRgb","default","extended","hidden","colors","col","image","override","bannerImage","bannerUrl","fetchImprint","updateImprint","body","method","useUpdateImprint","useMutation","isLoading","loading","imprints","mutate","toastr","success","I18n","t","PageTitle","title","isEmpty","ReduxForm","form","initialValues","onSubmit","imprint","onSubmitFail","error","allowSaveWithoutChange","ControlGroup","label","Field","component","MarkdownEditorAdapter","show_newsletter_info","InfoText","translation","LegalTextRow","legalText","onDeleteLegalText","href","target","rel","moment","format","style","fontSize","onClick","e","preventDefault","confirm","legalTexts","refetch","refetchLegalTexts","useLegalTexts","deleteLegalText","useDeleteLegalText","colSpan","align","index","key","useLegalText","useCreateLegalText","useUpdateLegalText","required","multiple","disabled","FileUploadField","isImage","storageDirectory","inputTitle","normalizeValue","isArray","displayValue","formatValue","state","compact","castArray","SelectAdapter","input","meta","loadOptions","variables","callback","debouncedLoadOptions","debounce","onBlur","isClearable","isDisabled","inputId","placeholder","noOptionsMessage","isMulti","styles","menu","base","zIndex","Fragment","AsyncSelect","classNamePrefix","unstyled","FieldError","normalize","Membership","extractUrl","SimpleInput","Url","DatePickerAdapter","elemRef","useRef","setDisplayValue","datepicker","Datepicker","current","addEventListener","formattedDate","detail","date","onChange","destroy","Date","rawValue","isValid","ref","focus","FontAwesomeIcon","icon","faCalendar","CKEditorAdpater","Component","super","createRef","componentDidMount","CKEDITOR","loadAndConfigureCKEditor","lastValue","editor","replace","codeSnippet_theme","bodyClass","Html","on","updateElement","componentDidUpdate","newValue","setData","componentWillUnmount","render","isNew","compactArray","arr","formatOptionsBasedOnApps","relatedApps","appDetailsById","indexBy","optionsGroupedByAppId","groupBy","optionsInApp","app_id","formatCreateLabel","allow_create_related","appId","dispatch","useDispatch","useMemo","fetchRelationOptions","propertyName","onCreateOption","AsyncCreatableSelect","CreatableSelect","Select","polymorphic","related_apps","sortedOptions","sortBy","Relation","PROPERTIES","address","Address","email","Email","Image","membership","MembershipRelation","selection","Selection","text","Text","number","Number","tag","Tag","file","File","DatePicker","html","relation","RelationField","isManualFocusHandlingRequired","prop","multiline","canUpdate","property","item","can","update","inputRef","properties","fieldErrors","fieldIdBase","uuidv4","focusHandlers","handleNewInputRef","newRef","handleLabelClick","currentTarget","dataset","errors","each","i","fieldId","propErrors","propHasErrors","Headline","Hint","hint","isPropRequired","htmlFor","onLabelClick","PropertyEdit","isPlainObject","wrapperClassName","prefix","postfix","otherProps","inputElement","classNames","defaultImageUrl","size","imageUrl","thumbnailUrl","alt","GenericValueList","extension","related_app_id","imageLoadingError","onerror","Assets","MemberLink","imageId","onError","current_network","config","anonymize_membership","anonymize_membership_name","dateTime","Statistics","view_count","with_name","street","zip","city","country","dangerouslySetInnerHTML","__html","unescape","DateView","statistics","headline","STATES","Deutschland","DEFAULT_LABELS","labels","force_country","fieldFor","fieldName","remainingProps","classnames","FormSection","StateRow","SelectionField","round","precision","isNumber","toFixed","isString","parseFloat","NumberInput","max","min","Numbe","flatMap","createFormatValue","find","reject","option","CheckboxRadioAdapter","checked","uniq","without","finalOptions","includes","select","rawSelect","internal","allowCreate","tagParentsFromContext","useContext","TagParentsContext","console","tagParents","tag_parents","exclude_new","inputValue","count","formatOptionLabel","startsWith","createOptionPosition","new","SelectComponent","createContext","field","warn","Provider","setComposerRefCallback","isFunction","MarkdownEditor","initial","content","onFocus","readOnly","autoFocus","maxlength","maxLength","selectionFilterUrl","SelectionUrlContext","MaybeLink","tagFilterUrl","TagUrlContext","connect","appUrl","currentAppUrlSelector","tagUrl","showAsLink","listStyle","listItemStyle","link","SharedTag","Application","markdown","val","AppointmentToolbar","view","setViewType","setDate","calendars","toggleExcludedCalendarIds","excludedCalendarIds","canCreate","scrollToToday","hideActions","datePickerRef","useParams","group","groups","bySlug","calendarId","undefined","cal","parent_id","create_appointments","pickLevel","element","active","isSame","faRegularShare","subtract","faSolidCaretLeft","faRegularSpinner","faRegularCalendarDay","add","faSolidCaretRight","DropDown","Toggle","length","faRegularFilter","CalendarFilterDropdown","faRegularTableCells","faRegularList","Item","faRegularCogs","typeLabels","network","personal","sortedGroupedCalendars","grouped","entries","categoryName","categoryCalendars","alignment","faSolidCircle","faRegularCircle","iconClassName","onSelect","calendar","iconStyle","formatTime","momentDate","FormattedTime","start","end","allDay","day","isBetween","html_url","markers","canceled","has_meeting","markerColor","backgroundColor","faComments","isFirst","weekNum","notActualMonth","maxHeight","columnNumber","lastRow","momentDay","divRef","visibleAppointmentCount","Math","floor","height","hiddenAppointmentCount","hovered","setHovered","handleHover","removeEventListener","useHover","initialDimensions","setInitialDimensions","useLayoutEffect","newInitialDimensions","width","clientWidth","clientHeight","isEqual","innerWidth","bg","onDoubleClick","Backbone","history","navigate","trigger","appointment","calId","unknown_calendars","concat","AppointmentLine","HeaderCell","appointmentsByDate","useFullWidthLayout","days","weekCount","ceil","dates","keys","startOfMonth","match","endOfMonth","endOf","rowStyle","gridTemplateRows","FullSizeContent","maxCellHeight","drop","range","at","week","j","CalendarSheetCell","createAppointmentContact","appointmentId","useCreateAppointmentContact","useAppointments","participating","keepPreviousData","split","useAppointment","translateTo","translated","targetLanguage","contentId","useCalendars","createAppointment","useCreateAppointment","updateAppointment","useUpdateAppointment","useAppointmentDate","appointmentStart","appointmentEnd","formattedStart","formatDate","all_day","formattedEnd","isSameDay","AppointmentDate","isRecurring","recurrence_pattern","next_occurrence_url","next_occurrence_date","FormattedTimeZone","time_zone","faArrowsRepeat","recurrence_end_time","TZDate","recurrence_interval","recurrence_frequency","interval","frequency","faClock","start_date","start_time","AppointmentDescription","description","isRendered","truncateDescription","setTruncateDescription","handleReadMore","document","getElementById","maybeTruncatedDescription","truncate","omission","AppointmentLocation","location","locationIsExtended","some","addressForUri","encodeURIComponent","pick","faLocationDot","address1","address2","meeting_link_type","getLocationLinkText","maps_url","showMap","AppointmentMeeting","meeting","appointmentName","canStartMeeting","tooltipRef","useTooltip","dateStr","room_name","navigator","clipboard","writeText","conference_call_phone_number","conference_call_access_code","join_url","app_url","then","catch","faClone","faDesktop","faPlayCircle","DATE_FORMAT","weeksInRange","rangeStart","rangeEnd","currentDate","weeks","weekday","collectAppointmentsByDate","startOf","flatten","datesInRange","reduce","filter","isInRange","appointmentsInDateRange","weeksInMonth","msToDayFactor","dateStamp","offsetMinutes","utcOffset","zone","valueOf","dateStampsRange","appointmentDate","spansDate","stamp","spansMultipleDays","useBlog","useSaveBlog","blog","useChannels","initialData","start_page","subscribed","recent","popular","useChannel","slug","updateChannelFavorited","favorited","channel","queryClient","getQueryData","setQueryData","updateChannelSubscription","useWidgets","channelSlug","useWidget","widgetId","useDeleteWidget","usePersistWidget","persistWidget","useArticles","currentPage","extraQuery","page","routes","ChannelOverride","NoChannel","ApplyOverrideChannelTheme","useRoutes","design","css","channelDesignToCss","createPortal","head","indexOf","getWidgetContentHeight","w","getWidgetContentColumns","getWidgetWidthByType","full","third","getWidgetColspan","getWidgetContainerResponsiveHeight","getWidgetColspanType","getWidgetColumnIndex","colspan","colspan3","col1","colspan2","col2","col3","useChannelLayout","useUpdateChannelLayout","newItems","rows","smartChunk","whatever","limitPerCol","numberCols","out","standaloneCount","chunk","slice","N_PER_COL","PeopleWidget","memberships","profile_fields","WidgetContext","byColumn","times","n","StandalonePerson","RowPerson","ProfileImage","f","profile","ImagesWidget","hiddenCount","layout","hasHidden","Loading","BannerWidget","banner_background_color","hide_title","banner_title_color","backgroundImage","TextWidget","html_content","ChannelRssWidget","preview_data","rss_data","maxItems","limitedItems","items","itemsPerColumn","itemsByColumn","columnItems","ItemCarousel","visibleItemsCount","containerWidth","totalItems","containerHeight","navigationButtonsStyle","currentIndex","setCurrentIndex","maxIndex","itemPercent","gapPerItem","translateAmount","handlePrev","prev","faSolidCircleChevronLeft","handleNext","faSolidCircleChevronRight","transform","child","useContainerWidth","containerRef","setContainerWidth","resizeObserver","ResizeObserver","elementWidth","getBoundingClientRect","observe","unobserve","BlogWidget","latest_articles","title_background_override","article","blog_id","image_path","created_at","AppointmentsWidget","event_image","large_thumb","start_meeting","description_rendered","SpotlightWidget","articles","useNavigate","getFileType","pop","toLowerCase","LinkView","image_url","FileIcon","FolderIcon","EmbedLinkView","embed","secureEmbedServiceUrl","showEmbed","setShowEmbed","allow","gridTemplateAreas","provider_icon","gridArea","faToggleOff","faToggleOn","getImageAsset","LinkWidget","selected_image","override_image","override_description","crawl_type","first","secure_embed_service_url","WidgetByType","peopleProps","textProps","imagesProps","bannerProps","rssProps","blogProps","appointmentsWidgetProps","spotlightProps","linkProps","Settings","development","memoize","bgColor","normalText","getComputedStyle","getPropertyValue","mostReadable","includeFallbackColors","toHexString","WidgetContainer","titleBackgroundOverride","hideTitle","contentClassName","collapseToSingleColumn","singleRowOnly","readableTextColor","Muted","compose","withProps","counter","getCounterForChat","chatId","muted","isMuted","composingHomie","getComposingHomie","route","Notification","permission","requestPermission","Row","last_message","last_interacted_at","mom","ChatImage","last_read_id","Composing","from","fromNow","statusOption","busy","online","invisible","useCurrentStatus","isOnline","getMemberOnlineStatus","presence","getMemberBusyStatus","StartNewButton","navigateToNewChat","faRegularComment","ChatStatusCircle","status","faSolidEyeSlash","StatusButton","toggleStatusMessageForm","OnlineStatusDropdown","selectedOption","setSelectedOption","handleOptionChange","show_online_status","StatusMessageForm","initialRender","statusText","setStatusText","currentStatus","submitStatus","chat__header","Textarea","minRows","maxRows","CloseButton","toggleChatbar","faRegularXmark","chats","getSortedChats","connected","ChatList","showStatusMessageForm","ChatHeader","ButtonLeft","ButtonRight","mobile_app_chat__list","withState","withHandlers","toggleOpen","GroupedItems","allowToggle","renderItemComponent","faChevronRight","Tile","memberChat","groupChat","categoryOrMemberType","memberOrGroup","c","NewChat","query","setQuery","only_my_groups","only_chat_enabled","member","groupsByCategoryName","BackToRootButton","faSpinner","faSearch","Chat","selected","chatName","parts","trim","chatInitials","currentChat","getCurrentChat","selectChat","nextChat","currIndex","findIndex","nextIndex","prevChat","prevIndex","QuickChatSelect","chat","MUTE_DURATIONS","toDate","MuteLink","muteUntil","dispatchAction","muted_until","ChatRoomSettingsButton","faVolumeOff","faEllipsisH","appOnly","THROTTLE","ScrollContainer","cancelScrollEvent","stopImmediatePropagation","returnValue","handleWheel","div","container","scrollTop","scrollHeight","wheelDelta","deltaY","isDeltaPositive","trackScrolling","lastScrollPosition","direction","callbackThreshold","autoscrollThreashold","setState","autoscrollBreaked","callStartReached","callEndReached","bumper","lastScrollPoint","onStartReached","leading","trailing","onEndReached","scroll","smooth","autoscroll","performScroll","lastScrollHeight","scrollBehavior","offsetHeight","DIV","onClickScrollToBottom","handleScrolling","throttle","handleResize","prevProps","startElement","endElement","MessageAuthor","MessageSettings","myMessage","fromId","fromDeleted","hideStartPrivateChat","messageId","EMOJI_REGEX","createEmojiRegex","onlyEmojis","every","toArray","sym","isEmoji","symbol","lastIndex","test","markdownRenderer","getNewMarkdownRenderer","Remarkable","use","linkify","noop","breaks","linkTarget","core","ruler","disable","inline","enable","block","markdownTextToHtml","log","MessageText","emoji","getEmojiClassName","symbols_count","nextProps","QuotedMessage","message","getTitle","deliveryStatus","MessageDeliveryStatus","faCheck","faCheckDouble","getIcon","MessageDate","fullDate","chat_id","getMyId","fromProfile","getMyProfile","getMessageDeliveryStatus","getImageUrl","ChatMessage","groupedMessage","quoted_message","deleted","DaySeparator","getRequestStateForChat","getMessagesForChat","loadingMessages","moreMessagesAvailable","lastMessageFrom","lastMessageDate","mobile_app_chat_room_android","isAndroid","mobile_app_chat_room_ios","isIOS","sameAuthor","sameDay","getMessageById","removeMessageToQuote","MessageToQuote","MessageComposer","messageToQuoteId","getComposerMessageToQuoteId","composerTextByChatId","setComposerTextByChatId","initialValue","setValue","storedValue","localStorage","getItem","JSON","parse","setItem","usePersistentState","handleSubmit","register","getValues","setFocus","reset","useForm","invokeDebounced","submit","quoted_message_id","getCanForChat","write","onKeyDown","keyCode","shiftKey","ctrlKey","altKey","metaKey","faPaperPlane","MobileAppWrapper","getChatProfile","ChatRoom","subtitle","BackButton","faArrowLeft","getUnreadChatsCountWithoutChat","getUnreadChatsCount","chatStatus","navigation","classList","remove","OnlineStatus","isBusy","ICONS","faUser","faUsers","getChatImageUrl","getChatOnlineStatus","getChatBusyStatus","DirectoryActionButton","DirectoryPagination","pagination","PaginationComponent","Pagination","totalPages","per_page","onPaginate","setSearchParam","toString","PageLoading","DirectoryRow","fallbackIcon","actions","badges","titleIcons","DirectoryRowBadge","tooltipTitle","FILTER","charCode","String","fromCharCode","Glossary","selectedLetter","setSelected","DirectoryToolbar","searchField","showFilterInitially","hasActiveFilters","showFilter","setShowFilter","queryString","setQueryString","searchedString","setSearchedString","selectLetter","letter","onSearch","faMagnifyingGlass","faFilter","ToolBar","create_channels","faCirclePlus","only_subscribed","ChannelRow","subscribers_count","is_subscribed","isSubscribed","setIsSubscribed","subscribersCount","setSubscribersCount","subscribeChannel","unsubscribeChannel","useChannelSubscription","onSuccessFunction","_id","faBullhorn","faBellSlash","faBell","ChannelListView","useDirectoryFilter","toNumber","searchParams","useSearchParams","currentFilter","forEach","getCurrentFilter","Breadcrumb","folder","handleNavigate","parentFolder","faFolder","currentRootFolder","closeModal","onSelectFolder","selectedItemIds","modalTitle","setSortBy","currentFolder","breadcrumb","useFolderResource","Modal","onClose","modalActionProps","submitText","Sorter","attribute","handleSort","orderBy","FolderRow","i18n_type","navigateDisabled","fixedWidth","SelectedFolder","unselectFolder","folderId","useFetchFolder","spin","defaultFolder","showModal","setShowModal","targetFolder","FolderSelectModal","faFolderOpen","contextUrl","searchUrl","module","filters","selectionUrl","namespace","useRemoveFilesAndFolders","requests","Promise","useMoveFilesAndFolders","onSelectFiles","headerRef","isHoveringHeader","setIsHoveringHeader","sortDirection","setSortDirection","onmouseover","onmouseleave","files","ids","selectedIds","selectIds","onSelectItem","useItemBatchSelection","allSelected","difference","contents","selectAllCheckbox","selectedFiles","FolderContentsTable","extraColumns","extraPreColumn","SelectableFolderRow","FileRow","SelectableFileRow","rowProps","endsWith","disableSelection","onSelectFile","isSelected","showCheckbox","context","onlyShowName","FilesEditorView","FileSelectModal","fileId","action","showReviewChanges","trackView","fetch","credentials","El","selectFolder","currentFolderId","currentFolderNamespace","currentRootFolderId","currentRootFolderNamespace","currentFolderMeta","currentFolderMetaSelector","FileName","version","finalizedAt","lockedUntil","lockedById","firstHalf","secondHalf","major","faFlagCheckered","faLock","author","updatedAt","openUrl","downloadUrl","Data","pow","humanizeFileSize","isPDF","isOpenable","faEye","faCloudDownload","updated_at","content_type","FileInfo","propTypes","isSortable","useExtraColumns","contextId","contextType","columnFields","selectFileProfileColumnFields","fileLoading","fileProfilePropertySet","usePropertySet","folderLoading","folderProfilePropertySet","columnProperties","Header","propertySetStyles","PropertyShow","Status","total_files_count","total_subfolders_count","onNavigateItem","DefaultFileRow","DefaultFolderRow","skipFileAttributes","filteredContents","renderTable","setRenderTable","timeoutID","folder_link_id","FolderContentsTableWithProfile","tableProps","noExtraColspan","striped","FolderInfo","hiddenStyle","opacity","visibility","hover","setHover","checkboxAvailable","onMouseOver","onMouseLeave","pickImage","wantedWidth","wantedHeight","last","imagesPropType","PropTypes","isRequired","percent","activityUrl","sources","original_filename","img","filesCount","tags","mentions","display_name","attachments","person","ImageAttachments","MentionAttachments","TagAttachments","LinkAttachment","FileAttachments","LOOKUP","note","Note","question","Question","schedule","Survey","survey","teaser","article_id","actor","object","TypeView","actorImage","nameWithProfileField","NameWithProfileField","hit","curr","hitContent","ActivityAttachments","answer_count","reply_count","MessageHit","subject","to","DateRange","html_description","CalendarList","hitMeta","recurring_appointment","Highlights","highlights","setIndex","highlight","sort_by","setPaginationState","FoundIn","found_in","reduceRight","MetaRow","FileHit","FileHitMeta","FileHits","hits","SearchQueryPaginationContext","file_profile","UrlContextProvider","serializeSortBy","parseSortByParam","FolderHit","FolderHitMeta","FolderHits","folder_profile","is_network_admin","profileFieldAvailable","has","ExternalMemberBadge","archived","access","member_count","activity_count","pagePath","group_slug","ItemHit","item_id","itemId","frontend_app_url","frontendAppUrl","app","appLoading","useLoadApp","externalAppId","itemLoading","useLoadItem","externalItemId","display_values","title_property","imageProp","p","imageValue","isObject","SearchResultPagination","per","paginationState","SearchSortSelector","availableSorts","Result","iconClass","fullResultUrl","initialLoading","renderHit","renderHits","queryName","routeParams","available_sorts","contextValue","pageLoading","useSearchResultsPage","query_name","GenericErrorBoundary","showMore","QUERY_MAPPING","activities_query","ActivityHit","messages_query","appointments_query","RecurringAppointmentHit","ModifiedRecurringAppointmentHit","AppointmentHit","files_query","folders_query","memberships_query","stringifyQuery","MembershipHit","groups_query","groupHits","groupCategory","group_categories","group_category_id","GroupHit","pages_query","PageHit","items_query","SearchQueryResult","propsFn","invariant","extraProps","FilterButton","GlobalSearchButton","useSearchResults","searchResults","globalSearchFilterBar","results","FilterModule","filteredQuery","pickBy","identity","staleTime","useQueryClient","cacheTime","pageData","getQueriesData","cacheData","cachedQuery","truncatedPageData","mapValues","filterToQueryString","quote","formatExt","baseSearchPath","searchQuery","rawQ","filterStrings","sortByParam","directionString","directionNumber","GroupNavigation","useGroupNavigationItems","Placeholder","nav","NavigationItem","new_window","navigation_items","active_match","join_request_count","useLocation","isActive","matchPath","pathname","hasNavigationItems","dropdown","ToggleGroupFavoriteButton","mutationFn","favorite","toggleFavorited","useToggleGroupFavorite","ToggleFavoriteButton","ToggleGroupSubscribe","subscription_status","toggleSubscribed","useToggleGroupSubscribe","stopPropagation","LeaveGroupOption","renderHeadlineTools","setDocumentTitle","ContextPageTitle","titleProp","page_title","authentication_token","leave","Subtitle","useRecurringAppointment","AppointmentPageTitle","setAppointment","Appointment","assignAppointment","model","off","TixxtPageTitle","toggleBackbone","show","toggle","BackboneFeature","feature","paramKeys","actionArguments","k","v","stopFeature","documentReady","defer","startFeature","elem","TixxtGroupNavigation","paramRegex","convertRoutes","featureRoutes","omittedParamKeys","Array","matchAll","capture","networkPath","groupPath","rundschreiben","notifications","AllDayTag","position","LeftArrow","RightArrow","TimeTag","faAngleRight","faAngleLeft","AppointmentItem","todayRef","calendar_ids","calendar_id","CalendarDay","today","isAfter","future","isBefore","CalendarWeek","weekNumber","isEmptyWeek","isoWeek","AppointmentsList","MEDIUM_BREAKPOINT","isSmall","AppointmentsPage","persistedView","setPersistedView","sessionStorage","setView","updateView","useWindowEvent","useAppointmentView","setExcludedCalendarIds","contextCalendars","uniqBy","filteredAppointments","contextAppointments","groupAppointmentsCalendarIds","intersection","scrollIntoView","behavior","CalendarSheet","isShared","canAddCalendar","create_personal_calendars","create_calendars","groupCalendarsByType","groupedCalendars","shared","cals","CalendarListItem","renderActions","addCalendar","faCalendarCirclePlus","CalendarListView","addCalendarsAllowed","groupsWithCalendars","groupsById","keyBy","my_groups","group_id","groupCalendarsByGroup","ManageCalendarsPage","deleteCalendar","deleteShare","useDeleteShare","buttons","faBan","faPencil","faTrash","COLLECTION_URL_LOOKUP","all_appointments","participating_appointments","personal_calendar","shared_calendar","network_calendar","CalendarSubscribeModal","modalOptions","isCollection","collectionType","isCalendar","auth_token","filteredCalendars","calendarFilter","static","copyToClipboard","faCopy","SubscribeCalendarsPage","setModalOptions","onShowModal","faCalendarPlus","fetchPaginatedData","pageParam","json","linkHeader","headers","nextUrl","parseHeader","next","nextPage","useAcceptInvite","inviteId","useDeclineInvite","AppointmentInviteMeta","accept","decline","canOptRetroactively","inviteStatus","totalAttendeesEnforcedAndExceeded","participation_locked","AppointmentInviteDate","same_day","AppointmentInvite","invitable","invitable_type","renderDate","renderMeta","reloadInvites","declineInvite","acceptInvite","faRotate","total_attendees_enforced_and_exceeded","ParticipantsPicker","participantsQuery","include_consumers","consumers_enabled","include_membership_roles","DirectoryPicker","multi","extraOptions","networkMembershipRoles","ParticipantsField","control","Label","Controller","Checkbox","reloadAppointment","reloading","setReloading","addParticipants","_data","participant","membership_ids","group_count","group_ids","membership_role_count","membership_role_ids","participantsStatus","emailNotification","selectedEntities","inviteConsumers","applyTo","memberIds","entity","groupIds","membershipRoleIds","mr","addParticipantsHandler","send_email_notification","invite_consumers","apply_to","defaultValue","getConfig","changeStatus","RecurringAppointmentDecisionModal","handleDecision","useMinHeightMax","PARTICIPANT_STATUS_LOOKUP","faRegularCircleHalfStroke","accepted","declined","ParticipantRow","newStatus","setNewStatus","updateParticipation","participantId","useUpdateParticipation","deleteParticipant","useDeleteParticipant","displayModal","handleCloseModal","onRemoveParticipant","onChangeParticipantStatus","DropDownItem","ParticipantsOverview","participants","searchText","setSearchText","activeFilter","setActiveFilter","regex","RegExp","filteredParticipants","changeActiveFilter","ParticipantsView","faRegularBars","download_attendees","faRegularCloudArrowDown","faSolidCaretDown","faRegularFileCsv","file_ending","faRegularFileExcel","AppointmentPreview","NewParticipantForm","COLOR_POOL","CalendarForm","calendarName","calendarColor","calendarShare","onReset","random","Spectrum","colorPalette","showPalette","MemberSelect","NewCalendarPage","parentId","createCalendar","EditCalendarPage","useCalendar","updateCalendar","TextEditor","textEditorRef","rules","MarkDownEditor","TimePicker","showPicker","setShowPicker","selectedDateTime","setSelectedDateTime","setInputValue","handleClickOutside","contains","increaseHour","newDateTime","decreaseHour","increaseMinutes","minutes","roundedMinutes","decreaseMinutes","newTime","inputHours","inputMinutes","hours","padStart","parseInt","parseTime","newHours","newMinutes","updatedDateTime","selectionStart","selectionEnd","faRegularClock","faSolidChevronUp","faSolidChevronDown","DateTimePicker","showTimePicker","showTimezone","timeZone","useController","pickerRef","isDateSelectable","pickerDate","startDate","clone","checkDate","isSameOrBefore","beforeShowDay","picker","PartialToggle","showIcon","hideIcon","shouldShowPartial","onToggle","showPartial","setShowPartial","faChevronUp","faChevronDown","FREQUENCY_LOOKUP","weekly","monthly","yearly","daily","custom","RecurringSelectField","useWatch","showEndPicker","setShowEndPicker","isCustom","setIsCustom","level1Options","pattern","customOptions","level1HandleChange","isCustomFrequency","isFieldFrequencyNever","handleChange","ReactSelect","closeMenuOnSelect","isSearchable","faXmark","RecurringSelect","LocationField","shouldShowLocationDetails","TeamsConfigField","teamsSyncEnabled","onlineMeeting","CategorySelectionField","categories","selectedCategory","preSelectedCategory","cat","ContactsField","endpoint","AttendeeConfigurationField","ApplicationConfigurationField","withCosts","registrationRequired","EventSettings","isEvent","showEventSettings","setShowEventSettings","TextInput","ModifiedRecurringAppointmentHint","recurringAppointmentId","DateRangeSelectField","DateRangeSelect","useFormContext","selectOptions","names","abbr","useReservableMeetingRooms","dateRange","roomId","loadData","room_id","MeetingRoomSelectField","preSelectedRoomId","meetingRooms","room","occupied","MeetingRoomSelect","AppointmentForm","isNormal","isModifiedRecurring","isExisting","publishAllVolatile","usePublishAllVolatile","isCreating","isUpdating","filesLoading","setFilesLoading","calendarSelectRef","dateRangeRef","defaultStartDate","defaultEndDate","methods","defaultValues","guess","event_files","teams_configuration","category","consultants","contacts","organizer","attendee_configuration","user_can_opt","application_configuration","currency","is_event","selectedDate","selectedEventFiles","selectedEventImage","newAppointment","defaultCalendars","preSelectedCalendar","FormProvider","getElementsByClassName","newAppointmentData","create_meetings","file_object_id","toLower","see_teams_event_options","pull","selectExisting","FormActions","onCancel","saveDisabled","AppointmentNewPage","hour","AppointmentEditPage","FormComponent","upperFirst","camelCase","Toolbar","participationLocked","participantsEmpty","cancelProhibitedReason","previousOccurrenceUrl","recurringAppointmentUrl","nextOccurrenceUrl","toggleLockParticipation","cancel","showContextMenu","faRegularArrowLeft","faRegularArrowsRepeat","faRegularPencil","contact","faRegularEnvelope","update_participants","faRegularUsers","faRegularUnlock","faRegularLock","appointment_name","faRegularBan","linkStyle","faRegularTrash","showLockAction","setShowLockAction","isLocked","setIsLocked","locked_until","lock","locked_unitl","addDays","default_lock_period_in_days","resourceUrl","now","faSolidFile","faRegularTrashCan","faRegularEye","faRegularArrowDownToBracket","tabIndex","faRegularTimes","AppointmentEventFiles","eventFiles","showMoreFiles","setShowMoreFiles","take","file_count","Translation","isHtml","isMarkdown","Detail","AppointmentEventDetails","attendeeConfig","applicationConfig","attendingParticipantsCount","teamsParticipantsCount","createdAt","genericAuthor","lastAuthor","faCoffee","total_attendees_enforced","registration_with_costs","faMoneyBill","costs","faHome","faExternalLink","registration_required","faTimer","registration_deadline","faPhone","faPencilSquare","at_time","actor_url","actor_name","SMALL_BREAKPOINT","StatusIcon","faSolidAdjust","Role","plural_name","display_type","collapsed","setCollapsed","cursor","countBy","faRegularChevronRight","statusToSort","rejected","invited","pushParticipant","list","splice","sortedIndexBy","lowerCase","ParticipantsList","showParticipants","consumersCount","teamsOnlyParticipantsCount","roles","defaultRole","participantsByRole","obj","AppointmentParticipations","canShowAttendees","invitedConsumers","canOpt","myInvite","myParticipation","totalAttendeesExceeded","showRecurringDecisionModal","showDecisionModal","setShowDecisionModal","updatingStatus","setUpdatingStatus","updateStatus","localeKey","inviter","escape","statusKey","onUpdateStatus","AppointmentDetails","isPast","isDifferentTimeZone","Intl","DateTimeFormat","resolvedOptions","appointmentCalendars","opt_retroactively","timezone","tz","upn","teams_event","show_add_upn_link","attending_participants_count","teams_only_participants_count","generic_author","last_author","show_attendees","invited_consumers","opt","my_invite","AppointmentPage","AppointmentPageComponent","DefaultAppointmentPage","appointmentLang","setAppointmentLang","TranslationDropDown","handleLanguageSelect","language","ORIGINAL_LANGUAGE_SIGNIFIER","object_language","previous_occurrence_url","recurring_appointment_url","cancel_prohibited_reason","Contact","audience","attachmentSize","hasAttachments","areAttachmentsInLimit","email_recommendations","attachment_size_limit","audienceOptions","querySelector","usabilityHint","limit","AppointmentContactPage","RecurringAppointmentInvite","invited_by","invite","InvitesList","invites","inviteType","loadMore","canLoadMore","_type","ModifiedRecurringAppointment","RecurringAppointment","participations","AppointmentParticipation","InvitesPage","reloadUnreads","activeTab","setActiveTab","isInvitesTab","invitesData","isLoadingInvites","fetchNextPage","loadMoreInvites","hasNextPage","canLoadMoreInvites","useInfiniteQuery","getNextPageParam","lastPage","useInvites","participationsData","isLoadingParticipations","reloadParticipations","loadMoreParticipations","canLoadMoreParticipations","useParticipations","setItems","pages","tab","UnreadBadge","backboneRoutes","reactRoutes","Invites","members","selectMessage","read","hasReplies","conversationLength","to_count","activeMessageRow","unreadMessage","navigateDetails","faReply","search","icons","onlyIcon","useFetchMessage","messageLang","foreignMessageIds","conversation","getForeignMessageIds","translatedMessages","isTranslating","messageIds","translationQueries","useQueries","queryKey","queryFn","isFetching","Boolean","useTranslateMessages","translatedMessage","addTranslationsToConversation","oldConversation","newConversation","oldItem","newItem","useMarkMessageAsRead","offset","selectedMessageIds","setSelectedMessageIds","onLoadMoreMessages","refetchMessages","allMessageIds","deleteMessages","message_ids","useDeleteMessages","isLoadingRead","useMarkMessagesAsRead","invalidateQueries","markAsUnread","isLoadingUnread","useMarkMessagesAsUnread","divide","indeterminate","InteractionsButton","confirmMessage","useQueryParams","setPage","toInteger","useFetchMessages","MessagesInteractions","MessageRow","onSetMessageId","conversation_length","navigationUrl","InboxToolbar","faPenLine","InboxPage","MessagesList","SentPage","nativeEvent","back","CheckboxField","labelHint","additionalText","setVal","labelProps","_","newVal","formatResponse","groupCategories","finalResults","extraQueryParams","isAdmin","networkAdminSelector","toAllNetworkMembers","formValueSelector","hasGroupRecipient","toAll","setToAll","MembershipAndGroupField","only_my_admin_groups","TextField","htmlId","FileField","useFetchBaseMembershipData","mutateAsync","sendMessage","useSendMessage","onUnload","change","fileProcessing","useFileProcessing","renderChildren","MessageForm","fullWidth","submitIcon","enableReinitialize","to_all_network_members","SubmissionError","recipient","to_group","processing","onSubmitSuccess","NewMessagePage","isRead","onSetMessageAction","messageAction","deleteMessage","useDeleteMessage","useMarkMessageAsUnread","updatedCache","sendDirectMessages","testId","currentMemberId","isConversation","authorUrl","authorImageUrl","authorName","time","faPaperclip","a","selectedMembers","recipients","newMemberArray","messageInitialValues","sender_name","htmlContent","send_date","send_time","conversation_starter_id","isAuthorInRecipients","attachment","setIsTranslatingIndicator","setMessageAction","isSuccess","MessageInteractions","NewMessage","MessageContainer","ShowMessagePage","setMessageLang","isTranslatingIndicator","MessageDetails","validate","ConnectedForm","showFileProfileFields","selectFileProfilesEnabled","postToStreamDefault","folder_ids","post_to_stream","NewFilesForm","FileUpload","FolderSelectionField","FileDescription","EmbeddedValueSetForm","NewFilesPage","contextRootFolderId","rootFolderIdSelector","submitApi","remainingValues","publishFiles","navigateToFolder","contextPath","Turbo","visit","approvePendingFileVersion","pendingVersionId","declinePendingFileVersion","useFilesReviewStatus","parsePaginationHeaders","fetchFilesForReviewStatus","removePendingFileVersionFromCache","_response","VersionApproval","rootFolder","useFilesVersionApproval","pending_versions","pendingVersion","PendingVersionApprovalRow","author_name","isDeclining","approve","isApproving","fileUrl","foo","ReviewStatus","ReviewStatusRow","hideIfEmpty","current_version_authors","review_status","insertions","deletions","changes","comments","DocumentAction","Layout","ApprovalPage","foldersUnreads","reviewed_files","search_text","SearchResults","Content","fetchNetworkSettings","updateNetworkSettings","useUpdateNetworkSettings","sendTestBirthdayEmail","birthday_emails","AVAILABLE_LANGUAGES","lang","abuse_reports","admin_configurable","groups_only","selector","join_user_can_initiate","join_promote_groups","decorators","decorators_external","gc","GroupSelectField","MarkdownTranslation","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","faCircleInfo","AddressField","deletedMemberCount","NumberField","Controls","createDaysArray","weekdays","moveArray","firstDayOfWeek","shift","digests_daily_activity_enabled","birthday_emails_enabled","birthday_emails_values","sendTestMail","getTabs","TabContent","BasicSettings","JoinSettings","MemberSettings","MailSettings","selectedTabIndex","selectTabIndex","TabBar","tabs","networkSettings","reload","NetworkSettingsForm","group_promotion_config","guest_users_allow_chat","birthday_emails_image","selectedIndex","hasChildren","onChangeOption","optionLink","newWindow","onChangeNewWindow","isPublic","onChangePublic","ItemForm","SelectContent","LinkForm","standard","node","onChangeNode","keyName","findKey","findOption","MainFields","Checkboxes","public","buttonClass","getNodeKey","treeIndex","countAllNodes","treeData","walk","isValidNode","canDrop","nextPath","navigationItemsUrl","NavigationManager","treeRef","onChangeTree","onMoveNode","activePath","onChangeActiveNode","newNode","changeNodeAtPath","sendData","isSaving","saveError","saveSuccess","ignoreCollapsed","isValidTree","serializeTree","responseData","parseNavigationItems","expanded","serializeNode","Reflect","getActiveNode","getNodeAtPath","buildNewNode","addNodeAt","addNodeUnderParent","parentKey","expandParent","addAsFirstChild","scrollToBottom","removeItemAt","removeNodeAtPath","scrollTo","top","apps","loadError","navResponse","navData","pagesResponse","pagesData","appsResponse","appsData","itemButtons","ItemButton","Flash","alert","SortableTree","isVirtualized","maxDepth","generateNodeProps","NavigationManagerForm","cardSource","beginDrag","cardTarget","monitor","dragIndex","hoverIndex","hoverBoundingRect","hoverRef","hoverMiddleY","bottom","hoverClientY","getClientOffset","y","moveCard","Card","isDragging","customBackgroundColor","connectDragSource","connectDropTarget","flow","DragSource","dragSource","DropTarget","dropTarget","DragDropContext","HTML5Backend","cards","dragCard","newCards","order","x","NewItemForm","filterProperties","mapProperties","Fields","EditItemForm","initialize","transformItem","initialized","setInitialized","updateUnregisteredFields","useInitialize","appIds","renderExtraFields","BasicItemForm","itemValues","goBack","pickFileValues","fields","external_id","fileFields","imageFields","publishedFiles","publishedImages","createOrUpdate","createItem","updateItem","itemResult","handleItemApiError","MemberEditFields","selectNetworkId","store","useStore","updateMembership","MembershipForm","persistItem","MemberCreateFields","formValues","send_welcome_mail","EmailField","createMembership","password","user","profile_id","updateField","isEditing","legalTextId","updateLegalText","LegalTextForm","createLegalText","isCurrent","isOpened","last_updated_at","collapse","openedText","setOpenedText","LegalTextVersion","updateAppNavigation","createApiAction","baseType","usePages","unusedDefaults","changedToDefault","defaults","isDefault","globe","cog","users","columns","paperclip","book","bullhorn","certificate","flag","changeIcon","selectedIcon","selectIcon","iconName","OPTIONS","activitystream","changeType","selectOption","newType","TYPE_LOOKUP","more","Default","channels","directory","settings","openIn","setOpenIn","open_in","setLink","isInvalidUrl","setIsInvalidUrl","openInDisabled","setOpenInDisabled","URL","host","onLinkChange","selectedPage","selectPage","Infinity","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","canDrag","NodeTitle","pullAt","pullAllBy","removeItemFromMore","GroupAdministrationMainPage","hidden_main_group","DesignsOverviewPage","lazy","DesignsOverviewLightPage","DesignManagerPage","DesignManagerLightPage","StatisticsPage","TagsManagerPage","Params","NetworkSettings","AppNavigationManager","GroupCategorySorter","MembershipEdit","MembershipNew","LegalTextIndex","LegalTextEdit","LegalTextNew","LegalTextVersions","ImprintEdit","Suspense","fallback","forceTurbo","themeType","invite_internal","invite_external","maps","faList","MemberRow","large","faUserCircle","text_color","MemberListView","categorySlug","categoryPluralName","search_in","category_group_name","deleteGroup","archiveGroup","createGroup","updateGroup","GroupRow","profile_image","externally_visible","membership_status_of_current_member","i_haz_subscription","hasSubscribed","setHasSubscribed","memberStatus","setMemberStatus","faArchive","faEyeSlash","changeGroupSubscription","changeGroupMembership","useChangeMembershipGroupStatus","join_moderated","group_name","faAdjust","faTimes","faRightFromBracket","faPlus","getActions","invitor","time_ago","formatDateFromNow","GroupListView","category_id","DirectoryPage","preselectedTab","availableModules","MembersListView","TabComponent","selectedTabType","EditMembership","changeRequestsProfileFields","change_requests","NewChangeRequest","radio","checkbox","configCategory","switchValue","conditions","isMounted","groupOptions","sort","localeCompare","CheckboxFields","mapOptions","_value","PushNotificationSettingsForm","deviceId","setDeviceUniqueId","deviceName","setDeviceName","useFetchDeviceSettings","getDeviceUniqueId","askToRegisterDevice","updateDeviceSettings","resolve","setting","transform2FrontendState","newState","cloneDeep","switch","transform2BackendState","EditMembershipSettings","updateMembershipSettings","showEmailDigests","showEmailDailyDigests","notificationsDeactivated","overflow","marginBottom","validateTab","snakeCase","DigestSettings","EmailConfigList","sensitive","active_main_group","formName","can_create_hidden","accessValue","access_options","GroupAccess","create_hidden","Children","moderated_join","members_can_invite","miscSettings","ChatSettings","MiscSettings","onDeleteGroup","redirect","documentElement","historyChanged","onArchiveGroup","DangerZone","EditGroup","fetchGroup","onUpdateGroup","GroupForm","archive","EditGroupActions","NewGroup","networkId","groupCategorySelector","groupDefaults","fetchGroupDefaults","onCreateGroup","groupCategoryName","GroupInviteActions","groupInviteId","reloadGroupInvites","setInviteStatus","GroupInvite","additional_message","checkIfPresent","GroupInvites","groupInvites","useFetchGroupInvites","groupInvite","updateProfileStep","ProfileOnboarding","onboardingResult","redirect_to","invitesRoutes","MemberMapPage","groupContext","launchChat","networkUrl","socketUrl","addReducers","chatReducer","runSaga","chatSaga","fetchCredentials","authorizationError","useMaxHeight","setPageTitle","ChatNew","MobileAppChat","ChannelsPage","PermissionPicker","ToggleChannelFavoriteButton","W_LOOKUP","ChannelLayout","layoutData","widgets","widget","Widget","ChannelPage","isAdministration","layoutLoading","hasChangesString","hasChanges","dropdownItems","useChannelSubscriptionToggle","dividerTop","faEllipsis","buttonType","ShowWidgetPage","ImagesGalleryPage","Redirect","lightbox","setLightbox","dialogRef","showNextImage","nextImage","showPrevImage","prevImage","handleKeyDown","nextKeys","prevLightbox","faChevronCircleLeft","onLoad","faChevronCircleRight","ChannelNewPage","ChannelEditPage","EditLayoutPage","EditDesignPage","WidgetsPage","NewWidgetPage","EditWidgetPage","BlogForm","publish_as","saveBlog","resetValidationErrors","onValidationError","RadioButton","BlogEditPage","ArticleEditPage","ArticleNewPage","RedirectToStartpage","startPage","activitystreamsRoutes","appointmentsRoutes","messagesRoutes","filesRoutes","tasksRoutes","globalSearchRoutes","administrationRoutes","directoryRoutes","membershipRoutes","groupRoutes","onboardingRoutes","mapRoutes","chatRoutes","channelRoutes","blogRoutes","originalNavigate","restoreBackboneNavigate","BackboneHistoryShim","hash","debug","originalReplaceState","call","originalPushState","shimBackboneNavigate","spaRoot","appRoutes","TixxtContent","toggleFrontend","source","TurboCompat","spaNavigateInstead","confirmationMessage","getConfirmationMessage","matchRoutes","frontendByLocation","StaticTixxtGroupNavigation","current_group","GroupNavigationPortal","StaticTixxtPageTitle","PageTitlePortal","setTixxtPageTitle","getState","setTitle","createPortalComponent","rootId","callCallback","firstChild","removeChild","HeaderPortal","WallViewFilterPortal","UserbarPortal","ChatbarPortal","el","restoreVisibility","restoreStaticChat","ContentPortal","throwBadType","entry","Error","isOptionEnabled","MemberOptionLabel","GroupOptionLabel","GroupAdminOptionLabel","SystemRoleOptionLabel","MembershipRoleOptionLabel","ChannelOptionLabel","faCircleUser","faComputerClassic","parent_type","groupData","membership_roles","faTag","group_indentation","isOptionDisabled","disabledOptions","groupSearchDisabled","useDirectoryFetcher","fetchDirectory","extraOptionValues","groupedEntries","membersLabel","systemLabel","networkMembershipRolesLabel","channelLabel","pluralName","showDefaultOptions","_ref","loadDirectoryOptions","Async","cacheOptions","placeholderForEndpoint","defaultOptions","getOptionValue","handleBodyClick","querySelectorAll","additional","dividerBottom","ItemWrapperComponent","ItemWrapperWithTooltip","ItemWrapper","DropDownSubMenu","side","SubMenu","faFileAudio","faFileVideo","faFileImage","faFileLines","faFileCode","faFileCsv","faFilePdf","faFileWord","faFilePowerpoint","faFileExcel","faFileZipper","faFile","chooseFileIcon","close","closeNotification","ReactDOM","FolderIcons","root_folder","activitystream_folder","faEarthEurope","setStyle","updateStyle","offsetTop","innerHeight","hasError","componentDidCatch","info","headless","fetchMembers","includeConsumers","excludeGroupMembersOf","recipientId","fetchMembersAndGroups","includeMembershipRoles","optionsKey","onlyMyGroups","membersAndGroups","mergedEntries","membershipRole","mergeEntries","groupedOptions","other","wrapperStyle","selectProps","asyncPropsOptions","loadingMessage","openMenuOnFocus","modalSubmitActionClassName","shown","hiding","modal","modalEl","hide","dispose","onResize","modalBodyHeight","resizeCallback","createElement","backdropExists","BootstrapModal","backdrop","fullscreen","header","modalClassName","ModalActions","appendChild","Spinner","minHeight","display","alignItems","justifyContent","flexDirection","marginTop","plusOne","PaginationButton","handlePaginate","cappedPage","unshift","filterByInputValue","systemRoles","findImage","SimpleMembershipShow","spectrum","showInput","preferredFormat","showInitial","palette","cancelText","chooseText","removeSearchParams","isReaderTag","buttonClassName","languages","primaryLanguages","setPrimaryLanguages","secondaryLanguages","setSecondaryLanguages","selectedLanguage","setSelectedLanguage","renderLanguageListItem","primary","secondary","primaryLanguageKeys","last_used_translation_language","categorizeLanguages","faLanguage","faSolidStar","faRegularStar","withDragDropContext","onRemoveFile","criteria","isMatch","uploadFiles","rawFiles","filesData","clientId","progress","uploadFile","inputName","filesByState","published","volatile","uploading","failed","availableFiles","uploadingFiles","nonRemovedFiles","ImagePreview","FileInput","acceptedType","empty","onSelectExistingFile","onDropFile","UploadBar","completed","UploadedFile","submitFailed","fieldProps","NativeTypes","FILE","isOver","FileSelector","currentContext","toJSON","faRegularVirus","faSolidCircleX","faBoxArchive","useRegisterPropOrFromContext","DirectoryPickerInput","apiToValues","valuesToApi","directoryPickerProps","fieldState","invalid","onChangeLocal","getFileToken","setToken","token","setProgress","onUploadFile","fileData","FormData","append","axios","post","onUploadProgress","loaded","handleUploadFiles","zippedPair","filesWithoutState","selectedExistingFiles","newFiles","showCancel","showSave","faInfoCircle","defaultChecked","contextMethods","fieldAttachments","shiftIsPressed","setShiftIsPressed","metaIsPressed","setMetaPressed","firstIdSelected","setFirstIdSelected","onKeyUp","selectSingle","itemIds","firstIndex","newFileIds","addItemId","eventName","eventHandler","colorStyle","allColorStyles","clearColors","editorState","contentWithoutStyles","newContentState","Modifier","removeInlineStyle","getSelection","getCurrentContent","EditorState","RemoveColorsButton","createInlineStyleButton","toggleStyle","getEditorState","setEditorState","createColorButton","RichUtils","toggleInlineStyle","FontColorsButton","createPickerButton","pickerButtons","Separator","isCollapsed","s","getCurrentInlineStyle","seperator","buttonWrapper","onMouseDown","button","ToolbarButton","Picker","onOverrideContent","Button","createChangeLanguageHandler","clickEvent","selectedValue","renderLanguageSelect","CodeBlockLanguageSelect","createCustomMarkdownPlugin","createMarkdownPlugin","plain","bash","js","ruby","sql","customInlineMatchers","BOLD","ITALIC","UNDERLINE","MARK","CODE","STRIKETHROUGH","entityType","IMAGE","createShortcutsPlugin","handleKeyCommand","command","_editorState","newEditorState","keyBindingFn","getDefaultKeyBinding","BoldButton","ItalicButton","UnderlineButton","StrikeButton","MarkButton","CodeButton","blockType","toggleBlockType","getBlockForKey","getStartKey","getType","UnorderedListButton","createBlockStyleButton","OrderedListButton","BlockquoteButton","CodeBlockButton","HEADLINES","level","headlineButtons","markdown_shortcut","RemoveHeadlineButton","AvailableButtons","LinkButton","currentContent","currentEntityKey","getSelectionEntity","getEntity","currentEntity","changeEditorState","removeLinkEntity","entityRange","getEntityRange","entitySelection","SelectionState","createEmpty","getAnchorKey","merge","anchorOffset","focusOffset","applyEntity","updateLinkEntity","replaceEntityData","addLinkEntity","createEntity","entityKey","getLastCreatedEntityKey","forceSelection","prompt","exec","formatUrl","HeadlinesButton","createCustomToolbarPlugin","Plugin","createToolbarPlugin","setKey","composer","click","externalProps","B","ButtonElem","customUndoPlugin","createUndoPlugin","undoContent","faArrowRotateLeft","redoContent","faArrowRotateRight","undo","redo","BaseComponent","HOC","plugins","pluginComponents","toolbarPlugin","markdownPlugin","undoPlugin","linkifyPlugin","createLinkifyPlugin","blockBreakoutPlugin","createBlockBreakoutPlugin","shortcutsPlugin","emojiPlugin","createEmojiPlugin","useNativeArt","selectButtonContent","faFaceSmile","defaultTheme","emojiSelectButton","emojiSelectButtonPressed","UndoButton","RedoButton","EmojiSuggestions","EmojiSelect","enableTixxtMentions","mentionPlugin","withBasicMarkdownPlugins","editorStateByMarkdown","onEditorStateChange","newContent","markdownByEditorState","onSetEditorRef","setEditorRef","focusEditor","editorRef","containerClasses","shouldFocus","Editor","customStyleMap","createStyleMap","spellCheck","stripPastedStyles","textAlign","fontFamily","whiteSpace","wordWrap","padding","borderRadius","border","SUPERSCRIPT","verticalAlign","isTerminatorChar","ch","customText","silent","pos","posMax","charCodeAt","pending","md","isAlphaNum","code","scanDelimiters","lastChar","nextChar","canOpen","canClose","marker","delimiters","emphasis","startCount","found","oldCount","newCount","stack","res","maxNesting","parser","skipToken","tokenize","mentionRule","mentionStart","mentionEnd","mentionSeparator","oldPos","mentionMarker","substr","underline","regexp","cssStyle","styleTuple","enableAllStyleRules","newRawState","markdownToDraft","preserveNewlines","remarkablePlugins","customizedTextParser","customizedEmphasisParser","markdownMentionsParser","underlineParser","cssStyleParser","remarkableOptions","blockEntities","mention_open","mutability","blockStyles","mark_open","del_open","underline_open","createWithContent","convertFromRaw","rawContent","convertToRaw","draftToMarkdown","entityItems","styleItems","propertySet","propertySetUrl","inherit","omitBy","isNull","profileConfig","retry","persistPropertySet","usePersistPropertySet","pristine","submitting","reduxForm","classNameFormActions","noActions","reverse","OriginalDatepicker","locales","currentLocale","weekStart","clearBtn","autohide","calendarWeeks","CKEDITOR_BASEPATH","script","onload","disableAutoInline","customConfig","locale","codeSnippet_languages","coffeescript","cpp","cs","java","javascript","objectivec","perl","php","python","vbscript","xml","toolbarGroups","disallowedContent","allowedContent","removeButtons","format_tags","removeDialogTabs","extraPlugins","removePlugins","filebrowserImageBrowseUrl","filebrowserImageUploadUrl","contentsCss","getUrl","ev","dialogDefinition","definition","getContents","common","notSet","targetNew","configure","handler","wrapped","pairs","nonVolatile","partition","others","destroyFile","fromPairs","destroyFiles","removed","_destroy","LOCALE_LOOKUP","de_DU","de","en","enGB","es","fr","dateFormat","formatDistanceToNow","setDefaultOptions","responseErrors","key_prefix","submitErrors","apply","createAdaptBackboneView","componentsMap","adaptBackboneView","componentName","mapProps","listenTo","standalone","connectedComponent","debounceTime","WrappedComponent","MemoizedWrappedComponent","Connect","getDerivedStateFromProps","getDerivedStateFromError","errorInfo","trySubscribe","tryUnsubscribe","unsubscribe","changeHandler","bind","entityState","propsToPass","getDisplayName","connectBackbone","_reactRoots","handleRender","createHandleRender","rawEl","$container","$el","root","oldRoot","unmount","createRoot","Wrapper","handleClose","createHandleClose","once","addComponents","extraComponentMap","queryCache","QueryCache","QueryClient","queries","QueryClientProvider","client","csrfTokenHeader","getAttribute","buildHeaders","h","Accept","okJson","ok","signal","WILDCARD_END","compileRoute","endsWithWildcard","pathToCompile","compileRouteMemoized","compileRoutesMemoized","getLocationState","ParamsContext","URLSearchParams","delete","newUrlString","replaceState","session","drive","pathnameParts","groupSlugInPath","navigateToUnjoinedGroup","toPathname","go","pushState","compiledRoutes","matchResult","defaultParams","LocationContext","matchedRoute","lastParams","BrowserRouter","locationState","setLocationState","updateLocationState","maybeNewLocationState","events","addEventDispatch","orig","args","Event","dispatchEvent","queryParam","setQueryParam","getQueryParams","fromEntries","beforeUnloadListener","disableInterceptor","useInterceptorPrompt","when","enableInterceptor","Tooltip","tooltipInstance","setContent","CHAT_STATIC_BREAKPOINT","coversWholeScreen","HTMLElement","SVGElement","togglebar","parentNode","HTMLButtonElement","openBarElements","Set","bar","persist","isUndefined","disableBodyScrolling","removeItem","restoreBodyScrolling","getResizeHandler","scrollY","removeProperty","closeUserbar","hideStaticChat","application","Stimulus","scrollToOpenAccordion","openAccordionItem","previousElementSibling","onClickChangeValue","$CloseActivityReplyAutomaticSelect","changeCategory","removeCategory","setText","edit","setEdit","selectedCategories","setSelectedCategories","setError","changedCategories","getElementsByName","setAttribute","CategoryRow","_class","CategoriesEditor","hasContextValue","categoriesValue","disconnect","JoinRequestModal","joinRequestId","formRef","submitUrl","childElement","onCloseModal","groupSlugValue","joinRequestIdValue","_getSelectedInviteIds","_classPrivateFieldLooseKey","_findInvite","_submitSuccess","_submitFailure","defineProperty","_submitFailure2","_submitSuccess2","_findInvite2","_getSelectedInviteIds2","refreshInvites","invite_ids","_classPrivateFieldLooseBase","renewInvites","showBodied","BatchRenewInviteView","externalInvitesCount","groupInvitesCount","countSelectedInviteTypes","group_invites_count","network_invites_count","batchRenewSuccess","batchRenewFailure","revokeInvites","done","fail","selectedCheckboxes","getUrlForPage","frame","pageField","origin","Invite","showInviteDetails","findInvite","InviteDetailsView","refreshInvite","RenewInviteView","toggleCheckboxListener","checkboxes","anyChecked","toggleDisableButtons","getSelectedInviteStatus","revokeable","renewable","revokeButton","renewButton","dragstart","dataTransfer","entryId","dragover","targetElement","removeHighlight","dragend","getData","targetEntryId","entryElement","entryElementById","moveEntryElement","persistOrder","initializeDraggable","disconnectDraggable","entryTargets","parentElement","sourceElement","targetParent","compareDocumentPosition","insertBefore","nextElementSibling","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","semimonthly","semimonthly_2","$dayTimeContainer","$daySelector","intervalValue","onClickChangeInterval","targetValue","isSemiMonthly","isMonthly","innerHTML","dayValue","secondDayValue","timeValue","secondTimeValue","mapping","tern","$secondDayTimeContainer","$secondDaySelector","after","parent","textContent","$monthHelpBlock","parentContainer","secondDay","secondTime","onMessage","iframe","contentWindow","unlayerLocale","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","storageToken","allSubmitsDisabled","resolveExportHtml","targetOrigin","chunks","fonts","countOccurrences","submitter","setupIframe","getTime","matches","Phoenix","Views","Inputs","AssignChannelSubscriptionsForm","assignChannelSubscriptions","subscribeAllNetworkMembers","subscribe_all_network_members","channelSlugs","memberData","only_public","hasMembersFieldTarget","membersFieldTarget","originalType","insertAdjacentElement","ClipboardJS","popups","magnificPopup","Lightbox","handleExternalInvite","openEditExternalIds","closeEditExternalIds","onClickGoBack","_createVisibilityIcon","_createVisibilityIcon2","toggleVisibility","nodeName","passwordField","newIcon","replaceChild","addToggleIcons","finalizeSelectionOptions","mil","seq","uniqueValue","kebabCase","TabbableFields","selectIndex","AddOptionsFields","lastInput","focusLast","PropertyForm","availableModifications","FieldArray","SelectionOptionsFields","PropertiesFields","AddOptions","existingOptions","ModificationForm","EDITOR_MAPPING","basic","formProps","addDefaultValuesToSelectionOptions","modified","transformedInitialValues","addModificationsToProperties","modifications","parent_property_set","parentPropertySet","addedOptionsByName","add_options","addOptions","pullModificationsFromProperties","finalModifications","submitPropertySet","SpecializedForm","PropertySetEdit","propertySetName","PropertySetEditWrapper","nameValue","_selectAllCheckboxes","_onInput","_valid","_determineAllChecked","_get_selectAllCheckboxes","selectAllSelector","selectAll","onClickChangeTab","toggleTarget","targetElements","allFactors","getNewTotp","createNewTotp","validationCode","provisioning_uri","resetBackupCodes","deleteFactor","perform2fa","getNewEmail","createNewEmail","secret_key","totp","ResetBackupCodesButton","DeleteFactorButton","directDelete","routeName","AddFactorButton","routeContext","RouteContext","submitDeleteFactor","updatedFactors","last_used_at","setRoute","AbortButton","FactorsPage","isError","ListFactors","factors","factorDisplayName","factor","FactorActions","BackupCodes","backupCodes","redirectTo","downloadCodesAsTxtFile","Blob","createObjectURL","download","setValidationCode","setRedirectTo","submitCreateNewTotp","createResult","createError","QRCode","renderAs","verificationCodeInput","elements","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","AssignChannelSubscriptionsFormController","ClipboardController","ExternalActivitystreamsController","Invites__HandleExternalInviteController","MinistryController","PermissionPickerController","Shared__GoBackButtonController","Shared__PasswordToggleController","Shared__PropertySetEditController","Shared__SelectAllController","Shared__TabbarController","Shared__ToggleController","TwoFactorAuthenticationsController","bootstrap","Popover","autoReplaceSvg","library","faBrandsDailymotion","faBrandsDeviantart","faBrandsFacebook","faBrandsFlickr","faBrandsInstagram","faBrandsKickstarter","faBrandsMicrosoft","faBrandsSlideshare","faBrandsSoundcloud","faBrandsSpotify","faBrandsTwitter","faBrandsVimeo","faBrandsYoutube","faDuotoneChartSimple","faDuotoneMedal","faDuotoneUsers","faLightCloudArrowDown","faLightEnvelope","faLightFile","faLightFileAudio","faLightFileCode","faLightFileCsv","faLightFileExcel","faLightFileImage","faLightFileLines","faLightFilePdf","faLightFilePowerpoint","faLightFileVideo","faLightFileWord","faLightFileZipper","faLightImage","faLightMobileScreenButton","faLightPaperclipVertical","faRegularAlignCenter","faRegularAlignLeft","faRegularAlignRight","faRegularAngleLeft","faRegularAngleRight","faRegularArrows","faRegularArrowsUpDownLeftRight","faRegularBold","faRegularBolt","faRegularBookmark","faRegularBoxArchive","faRegularBullhorn","faRegularCalendar","faRegularCalendarPlus","faRegularCalendarRange","faRegularChartColumn","faRegularCheck","faRegularCheckCircle","faRegularCheckSquare","faRegularChevronDown","faRegularChevronUp","faRegularCircleCheck","faRegularCircleInfo","faRegularCircleNotch","faRegularCirclePlay","faRegularCirclePlus","faRegularCircleUser","faRegularClipboard","faRegularClone","faRegularCloudDownload","faRegularCloudUpload","faRegularCommentDots","faRegularCommentSlash","faRegularComments","faRegularComputerClassic","faRegularDesktop","faRegularEarthEurope","faRegularEdit","faRegularEllipsis","faRegularEllipsisH","faRegularEllipsisVertical","faRegularExchange","faRegularFile","faRegularFileCode","faRegularFilePowerpoint","faRegularFileText","faRegularFileWord","faRegularFiles","faRegularFloppyDisk","faRegularFolder","faRegularFolderOpen","faRegularHandshake","faRegularImage","faRegularInbox","faRegularItalic","faRegularKeyboard","faRegularLink","faRegularListOl","faRegularListUl","faRegularLocationDot","faRegularMailbox","faRegularMapLocation","faRegularMapLocationDot","faRegularMessages","faRegularMinusCircle","faRegularMobile","faRegularPaperclipVertical","faRegularPenToSquare","faRegularPencilSquare","faRegularPipe","faRegularPlus","faRegularPlusCircle","faRegularPlusSquare","faRegularPowerOff","faRegularScissors","faRegularSearch","faRegularShareSquare","faRegularSidebar","faRegularSquare","faRegularSuitcaseRolling","faRegularTable","faRegularTags","faRegularTerminal","faRegularThumbsUp","faRegularTimesCircle","faRegularTriangleExclamation","faRegularUnderline","faRegularUpload","faRegularUser","faRegularUserCircle","faRegularUserPlus","faRegularUserXmark","faRegularVolumeXmark","faSolidAlignJustify","faSolidAngleDoubleDown","faSolidAngleDoubleLeft","faSolidAngleDoubleRight","faSolidAngleDoubleUp","faSolidAngleLeft","faSolidAngleRight","faSolidArchive","faSolidArrowCircleUp","faSolidArrowDown","faSolidArrowLeft","faSolidArrowRight","faSolidArrows","faSolidArrowsAlt","faSolidAt","faSolidBan","faSolidBarChart","faSolidBars","faSolidBold","faSolidBook","faSolidBug","faSolidBullhorn","faSolidCalendar","faSolidCertificate","faSolidCheck","faSolidCheckSquare","faSolidChevronCircleDown","faSolidChevronLeft","faSolidChevronRight","faSolidCircleInfo","faSolidCircleQuestion","faSolidClone","faSolidCloudDownload","faSolidCode","faSolidCodeFork","faSolidCoffee","faSolidCog","faSolidCogs","faSolidColumns","faSolidComment","faSolidCompress","faSolidEllipsis","faSolidEllipsisH","faSolidEnvelope","faSolidExclamation","faSolidExpand","faSolidExternalLink","faSolidEye","faSolidFileCsv","faSolidFileExcel","faSolidFilter","faSolidFlag","faSolidFlagCheckered","faSolidFolder","faSolidFolderOpen","faSolidFont","faSolidGears","faSolidGlobe","faSolidGripDots","faSolidHashtag","faSolidHeader","faSolidHome","faSolidImage","faSolidInfoCircle","faSolidItalic","faSolidLink","faSolidLinkSlash","faSolidList","faSolidListAlt","faSolidListOl","faSolidListUl","faSolidLock","faSolidMailbox","faSolidMapMarker","faSolidMessageXmark","faSolidPaperPlane","faSolidPaperclip","faSolidPencil","faSolidPencilSquare","faSolidPipe","faSolidPlay","faSolidPlus","faSolidPlusCircle","faSolidPrint","faSolidQuestion","faSolidQuestionCircle","faSolidQuoteLeft","faSolidQuoteRight","faSolidRefresh","faSolidReply","faSolidReplyAll","faSolidSave","faSolidSearch","faSolidShare","faSolidShield","faSolidSort","faSolidSortAsc","faSolidSortDesc","faSolidSortDown","faSolidSortNumericAsc","faSolidSortUp","faSolidSpaceShuttle","faSolidSpinner","faSolidSquare","faSolidSquareO","faSolidStepBackward","faSolidStepForward","faSolidStrikethrough","faSolidTag","faSolidTags","faSolidThumbsUp","faSolidThumbtack","faSolidTimes","faSolidTimesCircle","faSolidToggleOff","faSolidToggleOn","faSolidTrash","faSolidUnderline","faSolidUnlock","faSolidUnlockAlt","faSolidUser","faSolidUserCircle","faSolidUserMinus","faSolidUserPlus","faSolidUserSecret","faSolidUserTimes","faSolidUserXmark","faSolidUsers","faSolidVolumeXmark","faSolidXmark","dom","watch","TagEntry","inlineTagPlugin","InlineTagSuggestions","tagPlugin","counterPlugin","createCounterPlugin","CharCounter","WordCounter","LineCounter","userAgent","TixxtComposer","withPlugins","onClickFullscreen","handleFullscreen","hasText","onOpen","closed","setClosed","filterRemoved","composerName","imagesCount","selectedTab","openTab","setOpenTab","createComment","activityId","useCreateComment","updateComment","replyId","useUpdateComment","$modalEl","composerCss","editorRootCss","composerHeight","editorHeight","reply","isOpen","saveCallback","cancelCallback","setFullscreen","isProcessing","setIsProcessing","openComposer","closeComposer","closeFullscreen","imageProcessing","TixxtComposerAdapter","openFullscreen","Attachments","parentFolderId","parent_folder_id","showFolderProfileFields","selectFolderProfilesEnabled","MaybeWrapped","onlyRows","ValueSetTable","showLoading","fileServerV2Discovery","isFinalizedOrLocked","selectedItemAndFolderIds","removeSelected","moveSelected","isDownloading","setIsDownloading","folders","canDestroyAndMove","canBeMoved","fileServerV2available","serializeItemAndFolderIds","file_ids","current_folder_id","startDownload","onRemoveItems","onMoveItems","move","isMoving","targetFolderId","isRemoving","selectedItemIdsByType","canDestroy","finalized","locked","childProps","target_folder_id","source_folder_id","mergeFileAndFolderProfiles","fileProfileProps","folderProfileProps","keyedFileProfile","keyedFolderProfile","intersectionProfileKeys","o","ProfileFilters","folderProfileLoading","folderProfile","fileProfileLoading","fileProfile","filterLoading","mergedProfile","selectionFilters","tagFilter","NoExtraFilters","formValuesToSearchParams","rawTag","rawFilters","filterValue","filterName","debouncedSubmit","fileProfilesEnabled","folderProfilesEnabled","FilterProvider","showFilters","setShowFilters","filterAvailable","_dispatch","_props","previousValues","FilesSearchFilters","TagField","searchEnabled","searchProps","Search","add_files","create_subfolders","setSearchParams","TableComponent","unreadsCount","FolderActions","EmbeddedSearchResults","BatchActions","DocumentActions","renderSuptext","renderIcon","fetchActions","authorizedActions","authorized","simplifyActions","excel","word","powerpoint","visio","spreadsheets","documents","presentations","wrapProvider","FolderForm","EditFileForm","FolderListing","FileProfileRows","timeago","Progress","percentage","texts","generatingInfo","Start","createExport","TimeAgo","generateNew","generateNewHint","Exporter","canExport","AppItemsExporter","MembershipsExporter","ConsumersExporter","MembershipRoleItem","changeMembershipRole","setChecked","types","target_id","resetTranslation","translateObject","translate","administrationPath","toggleExternalMember","toggleMemberLock","membershipRoles","edit_groups","membership_roles_enabled","faTags","minister","faIdCard","guest_users","allowed","faKey","faUnlock","LayoutToggle","getContext","enableInheritance","onTypeChange","columnLayoutTypes","onLayoutChange","column","endDrag","addColumnProperty","moveColumnProperty","dropResult","getDropResult","toClass","char","didDrop","isOverAny","shallow","selectedColumnProperty","selectColumnProperty","removeColumnProperty","DragSourceProperty","ColumnConfigurator","enableLabelHiding","onColumnsUpdate","show_label","toggleShowLabel","columnProperty","removeSelectedColumnProperty","byName","setDisplayName","sourceProperties","row","DropTargetColumn","propertyShape","columnShape","showLabel","d","updateTabAt","TabConfigurator","enableColumns","exclusivePropertyUsage","usedProperties","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","AssignedMember","Info","logo","setFilteredByTag","descriptionContainer","Tags","Title","cardId","toggleArchive","isArchive","isUnassigned","showMenu","setShowMenu","toggleMenu","archivedBy","archivedAt","person_name","canMoveCard","setCardHeight","cardRef","onMoveCard","targetColumn","insertAfterCardId","setHoveredCardId","onSetCardRef","cardHeight","archiveItem","unarchiveItem","setFilteredByMember","FileCounter","AssignedMembers","ArchiveInfo","setCardRef","columnTitleTarget","setIsOverColumnTitle","columnField","ColumnTitle","changeIsOver","lifecycle","UNSAFE_componentWillReceiveProps","columnTarget","hoveredCardId","Column","isOverColumnTitle","card","cardTitleField","cardFileField","cardMembershipField","cardDescriptionField","cardDateField","cardTagField","cardLogoField","setCard","setCurrentCard","archived_by","archived_at","hasMoreItems","loadMoreItems","totalArchivedItems","queryParams","faFilterCircleXmark","assignee_id","assignee_name","image_id","logoId","UnassignedItems","cardProps","titlePropName","canUpdateColumn","showItems","setShowItems","IntegrationsEditor","itemsForWallSelector","loadMoreUrls","loadMoreUrlsSelector","totalArchivedItemsSelector","insert_after_id","optimistic","initApp","fetchApp","SUCCESS","fetchItems","fetchItemsForTag","fetchItemsForMember","loadMoreItemsByColumn","tag_filter","setShowsFilteredItems","member_filter","layoutOptions","getField","appColumns","column_property","unassignedItems","showsFilteredItems","HeaderButtons","stage","AppStage","isLast","getNetworkProfileFields","widgetbarPath","editWidgetbarPath","getWidgets","getWidgetbarGroupId","getSelectedWidgetIndex","getCalendars","getSelectedWidget","createSelector","MultiselectField","rawOptions","additional_calendar_ids","getOptions","scope","scopeSelection","ModuleselectField","propTypeSelections","withOnChange","groupId","valueChange","propertyKey","changeValue","eventOrNewVal","handleMultiselectLogic","PropTypeFields","TextareaField","renderer","SelectField","show_age","RadioField","possibleOptions","generateHint","checkIfHintShouldShow","MembersHeadline","GroupInformationText","getWidgetName","identifier","widgetConfig","admin_members","birthday","group_info","newest_members","online_members","rss","speed_dial","widgetType","draggable","faGripDots","DraggableWidget","widgetTypes","layoutTarget","addOrMoveWidget","WidgetbarDragNDrop","selectWidget","selectedWidgetIndex","WidgetProperties","removeWidget","defaultProperties","WidgetPropertiesLayout","setGroupId","loadWidgetbar","FETCH_WIDGETBAR_ACTIONS","loadCalendars","FETCH_CALENDARS_ACTIONS","updateWidgetbar","NotFound","widgetbar","WidgetTypes","WidgetbarLayout","WidgetbarForm","WidgetbarSelection","widgetbars","handleEdit","handleDestroy","textColor","EditRole","handleCancelEdit","editingId","handleNew","backRef","WidgetbarEdit","WidgetbarIndex","onChangeExternalId","ExternalIdInput","GroupCategorySections","unreadCountByGroupSlug","groupsByCategoryId","groupCategoriesSelector","myGroupsByCategoryIdSelector","unreadCount","GroupCategorySection","mainGroupHidden","main_group_hidden","mainGroupSlug","main_group_slug","active_theme","loadOpenState","setIsOpen","addGroupLink","create","UserbarSection","collapsible","persistOpenState","hasFavorites","additionalTitleElement","userbarVariables","ContextNavigation","userbarRef","activeItem","UserbarContent","groupCategoryTheme","titleClasses","titleTextClasses","extraChildren","wordBreak","FavoriteGroupIcon","UserbarLink","showWhileClosed","prefixMatch","escapeRegExp","ModuleSwitcher","useTooltipsIfTitlesAreHidden","throttledToggleTooltips","titleElem","toggleTooltips","Module","MODULE_LOOKUP","Channels","duo","faDuotoneBullhorn","faLightBullhorn","faDuotoneEarthEurope","faLightEarthEurope","faDuotoneInbox","faLightInbox","faDuotoneCalendarDay","faLightCalendarDay","Tasks","faDuotoneCircleCheck","faLightCircleCheck","Files","faDuotoneFolderOpen","faLightFolderOpen","Directory","faLightUser","More","faLightEllipsis","TixxtModuleSwitcher","activeModule","userbarIconType","moduleName","faDuotoneBrush","faLightBrush","faDuotoneCircleInfo","faLightCircleInfo","InfoUserbar","legal_texts","additionalLinks","additional_links","useOpenJoinRequestsCount","featuresUnreads","GroupJoinRequests","open_join_requests","ActivitystreamsUserbar","networkStreams","groupUnreads","networkUnreads","networkUnreadsByStreamSlug","openJoinRequestCount","getUserbarLinkTitle","unreadSumBySlug","MessagesUserbar","AppointmentsUserbar","TasksUserbar","FilesUserbar","networkName","networkNameSelector","networkUnreadCount","AdministrationUserbar","groupSelector","networkSelector","sections","section","links","exact","alternative_paths","SearchUserbar","pathAndQuery","MembershipsUserbar","useMembership","update_registration","update_profile","DirectoryUserbar","PagesUserbar","AppCreatorUserbar","EmptySubscribedHint","EmptyRecentHint","EmptyPopularHint","DISPLAY_LIMITS","ChannelsUserbar","channelsData","blogId","channelData","openState","openStates","setOpenStates","acc","handleSetOpen","renderSection","titleKey","emptyHint","showMoreKey","ChannelAdministrationUserbar","expandRootPaths","rootPaths","routeObject","rootPath","TixxtUserbar","ChatBar","elementRef","setCursor","upHandler","prevState","MODULE_WHITELIST","getModule","getModuleFromQueryParams","SearchBar","searchIsFocused","setSearchIsFocused","parentName","generateItems","useSelectNavigation","faDuotoneMagnifyingGlass","faRegularMagnifyingGlass","onMouseEnter","faDuotoneTable","faDuotoneCompass","faRegularCompass","ChatButton","chatCount","getAggregatedUnreadCount","faDuotoneComments","faLightComments","NotificationPing","NotificationDropDownItems","faRegularNewspaper","Notifications","faRegularEnvelopeOpenText","faRegularCalendarCircleUser","UserCentral","availableUpdates","administratableGroupCategories","administrate","faDuotoneBell","faLightBell","medium","faDuotoneCircleChevronDown","faRegularIdBadge","faRegularUserPen","faRegularGears","faRegularChartUser","version_and_updates","faRegularScrewdriverWrench","faRegularGear","faRegularArrowRightFromBracket","LARGE_BREAKPOINT","setDeploymentOfferSeenDate","toISOString","allDeploymentOffersSeen","deploymentOffer","EMPTY","CustomerCentralUpdateCheck","customer_central_url","Authorization","customer_central_jwt","release_notes_url","days_till_deadline","deadline","diff","TeamsRenewOAuthCredentialsCheck","show_renew_secret_modal","TixxtHeader","groupTheme","logoUrl","logoImage","logoRef","logoResizeBreakpoint","resizeBreakpoint","setActive","toggleActive","logoEl","navEl","maxWidth","startShrink","cleanUp","removeAttribute","onScroll","hasAttribute","requestAnimationFrame","newHeight","clamp","setProperty","useLogoScrollResize","faDuotoneBars","faLightBars","faDuotoneHouse","faLightHouse","ApplyOverrideTheme","useTheme","styleEl","faviconEl","toggleBodyClasses","newBody","isConnected","applyStyleOverride","linkEl","faviconImage","applyFaviconOverride","storeOverrideTheme","removeStyleOverride","themeSliceActions","setTheme","groupSetTheme","resetTheme","groupResetTheme","groupCategorySetTheme","groupCategoryResetTheme","appointmentIdToGroupSlugs","calendarParentIds","attributes","as","ci","fileIdToGroupSlugs","group_slugs","folderIdToGroupSlugs","groupFromId","Folder","taskIdToGroupSlugs","taskId","controller","currentCollection","first_stream_slug","groupsFromSlugs","slugs","activityIdToGroupSlugs","Activity","groupCategoriesFromGroups","groupCategoriesFromSlugs","SlugsContext","GroupsFromSlug","contextSlug","setSlugsState","previousSlug","GroupsFromActivityId","GroupsFromAppointmentId","GroupsFromTaskId","GroupsFromFolderId","paramsFolderId","queryFolderId","GroupsFromFileId","NoSlugs","selectors","HandleContextHeader","relevantContext","lastContext","activeTheme","hasSameTheme","themeParents","themeParent","Noop","pickRelevantGroups","ApplyOverrideGroupTheme","pickRelevantGroupCategories","ApplyOverrideGroupCategoryTheme","AppSearchHeader","App","canChat","setMemberIsLoggedIn","setMemberId","setMemberCanChat","TixxtChatbar","compatThisArg","fn","collection","thisArg","lodash","customLodashCompat","mixin","any","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","showAge","birthday_is_today","faGift","age","AdminMembersWidget","AppointmentRow","currentTime","startTime","isSameOrAfter","endTime","displayTime","BirthdayWidget","your_birthday","GroupInfoWidget","NewestMembersWidget","OnlineMembersWidget","RssWidget","SpeedDialWidget","setMembers","renderWidgetComponent","ActivitystreamWidgetbar","useActivitystreamWidgetbar","loadingText","errorText","ActivityComposer","ReplyComposer","selectedStreams","onSelectStreams","groupedStreams","category_name","serializedOptions","ExternalIdComponent","adaptedFileComponents","adaptedSharedComponents","adaptedAppCreatorComponents","adaptedAdministrationComponents","jQuery","_compat","hljs","userInput","rails","allowAction","fire","setApplication","showCookieModal","cookieModal","modalCloser","cookie","cookieModalElement","keyboard","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","requestState","getChatIdFromPayload","getChatIdFromMeta","BLACKLIST","mergeMessages","received","r1","r2","insertOrUpdateMessage","findLastIndex","keepUntil","messageList","cid","removeByClientId","searchClientId","composingInChat","composing","storeHomie","homie","homies","transformPayload","payloadTransformer","defaultState","combineReducers","getChatId","onlineMembers","busyMembers","createEventSaga","eventChannel","emit","handlers","put","cancelled","presenceSaga","sync","metas","online_at","maxBy","Presence","onSync","UNREAD_TIMER","COMPOSING_TIMEOUT","isShowChatNavigationAction","createWindowFocusPromise","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","actionChannel","ident","isRunning","receive","pushReply","baseMeta","RECEIVE_EVENTS","handleIncomingMessages","createShouldHandleTo","channelType","channelId","handleOutgoingMessages","outgoingMessages","shouldHandleTo","handleChatQueries","chatQueries","pushComposingEvent","markMessageAsReceived","messagePayload","markLastChatMessagesAsReceived","channelSaga","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","getNetworkUrl","getHomie","homieId","getChats","getRawChatProfile","getStateForChat","mutedUntil","getAppMutedUntilForChat","getMutedUntilForChat","rawProfile","partnerId","getPartnerId","idRest","myId","timestamps","composingIds","recentlyComposingHomieId","findLast","partnerState","getChatPartnerState","groupSorter","myGroups","myGroupSlugs","webpackContext","req","webpackContextResolve","__webpack_require__","exports"],"sourceRoot":""}